Docker核心技术

一. Docker

1. 简介

  • 基于Linux内核的Cgroup, Namespace, 以及Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟技术,由于隔离的进程独立于宿主和其它的隔离进程,因此称为容器
  • 最初实现是基于LXC, 从0.7以后开始去除LXC, 转而使用自行开发的Libcontainer, 从1.11开始, 则进一步演进为使用runC和Containerd
  • Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护,使得Docker技术比虚拟机技术更为轻便、快捷

2. Docker优势

  • 更高效地利用系统资源
  • 更快速的启动时间
  • 一致的运行环境
  • 持续交付和部署
  • 更轻松的迁移
  • 更轻松地维护和扩展

3. Docker与虚拟机对比

Docker核心技术_第1张图片

Docker核心技术_第2张图片

二. Docker安装

参考文章安装: Install Docker Engine on Ubuntu | Docker Documentation

Docker核心技术_第3张图片

Docker核心技术_第4张图片

Docker核心技术_第5张图片Docker核心技术_第6张图片

三. 容器操作

  • 启动:

docker run:

                -it 交互

                -d 后台运行

                -p 端口映射

                -v 磁盘挂载

Docker核心技术_第7张图片

  • 启动已终止容器

docker start

Docker核心技术_第8张图片

  • 停止容器

docker stop

  • 查看容器进程

docker ps

  • 查看容器细节

docker inspect 

Docker核心技术_第9张图片

  •  拷贝文件到容器内

docker cp file1 :/file_to_path

  • docker退出容器,而不关闭容器: ctrl+q+p

  • docker退出容器,而关闭容器: exit

  • 查询docker所有镜像

docker images

Docker核心技术_第10张图片

四. Dockerfile详解

Dockerfile一般分为四个部分:基础镜像信息、维护信息、镜像操作指令和容器启动时操作指令

  • 常用命令

FROM:指定基础镜像, 必须为第一个指令

格式:

        FROM

        FROM :

        FROM @

示例:

        FROM ubuntu

MAINTAINER: 维护信息

格式:

        MAINTAINER

示例

        MAINTAINER ribbon

RUN:构建镜像时执行的命令

格式:

        shell执行:RUN

        exec执行:RUN ["executable", "param1", "param2"]

示例:

        RUN apk update

        RUN ["/etc/execfile", "arg1", "arg2"]

ADD: 将本地文件添加到容器中,tar等类型会自动解压,可以访问网络资源,类似于wget

格式:

        ADD ...

示例:

        ADD bin/amd64/httpserver /httpserver

COPY: 功能类似于ADD,但是不会解压缩文件,不能访问网络资源

在Dockerfile中使用multi-stage: Dockerfile 中的 multi-stage(多阶段构建) - sparkdev - 博客园

格式:

        COPY ...

示例:

        COPYbin/amd64/httpserver /httpserver

CMD: 构建容器后调用,也就是在容器启动时才进行调用

格式:

        CMD ["executable","param1","param2"] (执行可执行文件,优先)
        CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
        CMD command param1 param2 (执行shell内部命令)

示例:

        CMD ["ethtool", "--help"]

        CMD echo "1111"

ENTRTPOINT: 配置容器,使其可执行化。

格式:

        ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
        ENTRYPOINT command param1 param2 (shell内部命令)

范例:

        ENTRYPOINT /httpserver

        CMD [-c]

LABAL: 用于为镜像添加源数据

格式:

        LABEL = = = ...

范例:

        LABEL multi.label1="value1" multi.label2="value2" other="value3"

ENV: 设置环境变量

格式:

        ENV

范例:

        ENV MY_SERVICE_PORT=80 UDP_PORT=90

EXPOSE: 指定外界交互的端口

格式:

        EXPOSE [...]

示例:

        EXPOSE 80

        EXPOSE 80/tcp

        EXPOSE 80 90

VOLUME: 用于指定持久化目录

格式:

        VOLUME []

范例:

        VOLUME ["/data", "/usr1/jenkins"]

USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。

格式:
  USER user
  USER user:group
  USER uid
  USER uid:gid
  USER user:gid
  USER uid:group

 示例:
  USER www

ARG: 用于指定传递给构建运行时的变量

格式:
    ARG [=]
示例:
    ARG build_user=ribbon

Docker核心技术_第11张图片

五. Linux NameSpace详解

  •  NamesSpace详解:

Linux NameSpace_Frank_Abagnale的博客-CSDN博客 这篇文章比较详细的介绍,可以参考这篇

Docker核心技术_第12张图片

  • NameSpace的常用操作

  • 查看当前系统的namespace:

lsns -t

  • 查看某进程的namespace:

ls -la /proc//ns/

Docker核心技术_第13张图片

  •  查看某namespace运行命令

nsenter -t -n 

Docker核心技术_第14张图片

六. Linux Cgroups详解

  • Cgroups详解

容器核心:cgroups - 简书 可以参考这篇文章来进行了解

  • 模拟Cgroups控制CPU资源

通过模拟来更好的熟悉Cgroups控制资源的效果, 首先创建cpudemo文件夹

Docker核心技术_第15张图片

 执行top可以看到busyloop占用两个CPU资源Docker核心技术_第16张图片

 将进程添加进cgroup进程配置组

 设置cpuquota

Docker核心技术_第17张图片

 可以看到CPU的占用率降低到1%, 成功将占用200%CPU资源的降低成1%

Docker核心技术_第18张图片

当前文章还未更新完成,会慢慢补齐

你可能感兴趣的