Docker 使用了客户端 — 服务端模型。服务端对外提供 REST API。,默认安装方式,客户端和服务端在同一台主机上,通过本地安全 PIC Socket 进行通信,例如 Linux 中 /var/run/docker.sock。我们还可以配置它们通过网络进行通信。它们默认网络配置使用不安全的 HTTP Socket,端口为 2375。,在生产环境这是不能接受的。通过 TLS 的方式连接解决这个问题。生产环境中推荐这种配置,即使在可信内网中,也建议使用该方式!,同时使用它们,能提供最高的安全等级。,下面开始介绍如何完成 TLS 的配置,总体步骤如下。,
,在 node2 运行下面的命令。,当前目录新增一个 ca-key.pem 文件,这是 CA 私钥。,当前目录新增一个 ca.pem 文件,这是 CA 公钥,也叫”证书“。,在 node3 运行下面的命令。,当前目录新增一个 daemon-key.pem 文件,这是 daemon 节点的私钥。,当前目录新增一个 daemon.csr 文件,这是 CSR。,为证书添加属性。 创建文件,名为 extfile.cnf。示例中使用了 daemon 节点的 DNS 名称和 IP。每个人的环境中可能值不同。,此时,已经拥有一个可用 CA ,同时 daemon 的 Node3 节点也有了自己的密钥。,继续下面内容前,删除 CSR 和 extfile.cnf。,在 node3 运行下面的命令。,为客户端创建密钥,当前目录新增一个 client-key.pem 文件。,创建 CSR。,当前目录新增一个 client.csr 文件。,创建 extfile.cnf 文件 将证书设置为客户端认证可用。文件内容如下。,生成证书 使用 CSR 文件、CA 密钥、extfile.cnf 文件完成签名和客户端证书配置。,删除 CSR 和 extfile.cnf ,因为不会用到它们了。
$ rm client.csr extfile.cnf
,此时,在工作目录下应该有如下 7 个文件。,这里用 scp 完成复制操作。在 scp 的过程中对部分文件进行了重命名。
重命名非常重要,因为 Docker 对文件命名有规范。,进入 Node3(daemon 节点)完成下面的配置。,找到 daemon.json 配置文件。在 Linux 上位于 /etc/docker,编辑 daemon.json 文件,添加如下行。,这些 daemon.json 中的参数意义如下。,警告:部分版本的 Linux 系统运行 systemd 的,不允许在 daemon.json 中使用“hosts”选项。替换方案是在 systemd 配置文件中进行重写。创建名为 /etc/systemd/system/docker.service.d/override.conf 的新文件。在其中加入下列 3 行内容,然后保存。,重启 daemon 。,如果重启失败且错误为,为了让它工作,编辑
/lib/systemd/system/docker.service
,修改如下内容之后再次尝试重启。,理论上,
/etc/systemd/system/docker.service.d/override.conf
与
/etc/docker/daemon.json
可以同时修改,但是并不建议这么做,如果仅修改
/etc/docker/daemon.json
没有出现任何问题,那就太棒了。,进入 Docker 客户端节点,配置临时环境变量。,尝试运行
$ docker version
,会出现错误,类似无法连接 daemon。接着设置另一个环境变量。,它是告知 Docker 客户端使用证书对全部命令进行签名,此时再试试
$ docker version
!,