Docker为C/S架构,分为docker cli(客户端)和docker daemon(服务端/守护进程),本文以Centos 7系统为基础,以docker-ce 19.03.9版本为例展开介绍。主要内容包括:

  • 如何安装指定docker-ce版本
  • docker daemon启动参数介绍
  • 同一台服务器启动两个docker daemon
  • 客户端远程连接服务端

安装指定的docker-ce版本

Centos 7系统上安装docker非常方便,执行yum install docker命令即可,但此时安装的版本默认为docker 1.13.1,若想选择版本安装,可按照以下步骤执行

  • 下载yum工具:yum install -y yum-utils
  • 设置docker-ce仓库:yum-config-manager --add-repo [https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo](https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo)
  • 查找可安装的docker-ce版本列表:yum list docker-ce --showduplicates | sort -r
  • 选择版本,比如19.03.9,执行:yum install -y ``docker-ce-19.03.9`` ``docker-ce-cli-19.03.9安装docker server与docker client

安装完成后,执行systemctl start docker开启docker服务,可通过docker info指令查看docker的详细信息,若以上操作均无报错,表明docker安装并启动成功。

Docker daemon启动参数介绍

  1. /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

dockerd默认的启动命令仅指定了-H与—containerd两个参数的值。前文提到,docker为C/S架构,那client与server是如何进行通信的?答案就是socket,而-H(—host)参数设置的是server端默认监听的socket。

-H, —host Daemon socket(s) to connect to

正常网络编程中socket的表现形式为ip:port形式,此处指定的值为fd://,是为何意?其实目前-H参数可接收三种类型的值:Unix domain socket、fd://以及tcp socket。

  • Unix domain socket:又叫做IPC(inter-process communication 进程间通信)socket,实现同一主机进程之间通信的方式之一,通信时客户端与服务端需监听同一个sock类型的文件。旧版本docker按照此方式进行设置,如Centos 7默认安装的1.13.1版本,值为unix:///var/run/docker/docker.sock
  • fd://:该类型本质上与 Unix domain socket 其实并无差别,同样是指定的sock文件所在路径,区别在于 sock 文件的创建者。
    • Unix domain socket 形式,sock 文件由 dockerd 本身创建,
    • fd:// 形式下sock文件则由 systemd 创建,创建完成后再指定给 dockerd 缺省路径依然是/var/run/docker/docker.sock
  • tcp socket:以tcp://ip:port的形式配置,与前两者的区别是该形式支持跨主机通信,比如可通过主机A的客户端访问到主机B的服务端,具体效果稍后演示

官方对--containerd这个参数给出的解释是dockerd用于与containerd进行grpc通信的地址。

—containerd containerd grpc address

但dockerd本身就是守护进程,为何又多出来一个containerd?其实containerd最初就是docker底层的Runtime(运行时)管理器,后来为了统一容器运行时的标准将containerd独立了出来,而dockerd相当于封装了一层containerd的接口,也就是说即使不用docker,也可单独使用containerd完成对容器的管理。

既然dockerd与containerd都是用于容器管理,那容器又是如何创建的?此时不得不提 runc containerd-shim

  • runc:二进制类型的命令行工具,主要用于根据OCI标准来创建和运行容器,比如希望通过docker run来启动一个容器,实际容器的创建指令则是runc run
  • containerd-shim:shim的中文翻译为垫片,单纯从字面理解 containerd-shim 是”容器垫片”的意思,而实际上可以理解为容器的载体,因为每个容器创建时都会启动一个shim进程,该进程为容器指定了容器ID,以及容器的工作目录

    单台服务器启动多个Docker daemon

    除了”-H”与“—containerd”之外, dockerd还支持众多参数配置,以下选取部分进行自定义修改,目的在于默认dockerd运行的情况下,打造属于自己的dockerd,本文中命名为dualdockerd,步骤如下:
  1. 拷贝/usr/lib/systemd/system/docker.service文件至/usr/lib/systemd/system/dualdocker.service,修改启动启动命令如下

    ExecStart=/usr/bin/dockerd -H unix:///var/run/dualdocker/dualdocker.sock\ #配置sock文件路径
           --config-file=/etc/docker/dualdocker.json #修改配置文件路径,默认为/etc/docker/daemon.json
    

    config-file 参数用于指定配置文件路径,默认为 /etc/docker/daemon.json 本想把 sock文件路径配置在 dualdocker.json 文件中,但发现该方式会导致 sock文件无法创建,只好分开配置

  2. 在指定的配置文件中设置自定义参数

    {
    "exec-root": "/var/run/dualdocker", # 默认为/var/run/docker
    "data-root": "/var/lib/dualdocker", # docker的工作目录,默认为/var/lib/docker
    "cgroup-parent": "dualdocker",          # 容器cgroup的父路径,默认为/sys/fs/cgroup/docker
    "pidfile": "/var/run/dualdocker/dualdocker.pid", # dockerd的pidfile路径,默认为/var/run/dockerd.pid
    "dns": ["114.114.114.114"],     # dns server地址,可在容器内的/etc/reslove.conf查看
    "registry-mirrors": ["https://abcd1234.m.daocloud.io"], # 镜像仓库地址,可配置合适的仓库地址以增加镜像拉取速度
    "insecure-registries": ["privateregistry:5000"], # 本地镜像仓库地址
    "selinux-enabled": false,         # 关闭selinux
    "storage-driver": "overlay2", # 存储驱动设置,可选device-mapper/aufs/overlay/overlay2
    "log-driver": "json-file",         # 日志内容保存形式,可选none/syslog/journald/json-file/fluented/gelf
    "log-level": "warn",                     # 日志保存级别
    "log-opts": {  
     "max-size": "50m", # 单个日志文件大小
     "max-file": "3"    # 日志文件最大保存个数
    },
    "live-restore": true     # 该值为true时,dockerd进程即使退出,容器也会继续保持运行,
                                                 # 容器最终由conainerd管理,所以该参数也不难理解
    }
    
  3. 启动dualdockerd systemctl enable dualdocker && systemctl start dualdocker

    若启动dualdockerd导致默认的dockerd不可用,可尝试重启默认的dockerd

  4. 设置别名 alias dualdocker='docker -H unix:///var/run/dualdocker/dualdocker.sock'

    注意该别名设置只在当前终端可用,若想永久生效,可将其写入到~/.bashrc文件中,该文件在每次打开终端时都会被重新加载

至此,自定义的dualdocker就配置完毕,下图为具体效果,可看到dualdocker与docker为独立视图,dualdocker启动的容器,docker视图下无法查看;且当live-restore参数设置为true时,当dualdocker daemon进程重启时,其管理的容器并不会重新启动
dualdocker.png
live-restore.png

客户端远程连接 Docker daemon

以上所有操作均在单台服务器上,若是希望在本服务器远程连接到另外一套docker环境该如何操作?上文讲解dockerd 的启动参数”-H”时有提到,tcp socket 用于远程监听,因此需要修改被远程环境的服务端启动配置。

  1. 新增参数-H tcp://0.0.0.0:2375(端口可自定义),重启 dockerd 进程
  2. 将监听的端口放置防火墙白名单中
  3. 客户端访问时指定被远程 docker 环境的IP地址与端口号,docker -H tcp://ip:port

客户端每次访问还需指定被远程环境的 IP 地址与端口号,操作势必不方便,上文我们有提到可使用 alias 重命名的方式,此处再介绍一下 context (上下文)。首先看下默认的 context 信息
image.png
默认的 context 名字为 default ,DOCKER ENDPOINT 列表明了与 docker 客户端交互的是默认的 docker daemon 进程,接下来我们新创建两个 context,一个用于与自定义的 dualdocker 交互,一个用于远程连接 IP 地址为 192.168.110.94 的 docker 环境,若想控制不同的 docker 环境,仅需切换 context 即可,效果如下图所示
image.png
image.png
至此,本文介绍完毕