Skip to content

门泊吴船亦已谋

Docker 远程连接以及 TLS 加密

Docker Daemon 运行在 Debian 上,Docker Client 在 macOS 上

因为不想在本地安装 Docker,考虑在本地用 Docker Client 远程连接到远程服务器的 Docker Daemon 上。

名词解释

Docker Daemon,可以理解为 Docker 的后端,也是 Docker 项目实际运行的地方。

Docker client,Docker 的客户端,可以用来控制 Daemon 运行 Docker 项目。

服务端(Debian)配置远程连接

覆盖配置 docker.service 即可

修改/etc/systemd/system/docker.service.d/override.conf 的内容如下
(如果目录或文件不存在就直接创建)

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2337 -H unix:///var/run/docker.sock

解释:
第二行用于清除原本的 ExecStart,不可缺少

-H tcp://0.0.0.0:2337
监听 2337 端口,使得 Daemon 可以由 2337 端口远程访问

-H unix:///var/run/docker.sock
监听 Unix 域 Socket,使得原本的本地连接方式依然可用

重启后台进程与 Docker 服务

$ systemctl daemon-reload
$ systemctl restart docker

至此,我们就能通过 2337 端口远程访问 Docker Daemon 了

客户端(macOS)配置远程连接

安装 Docker Client

$ brew install docker

临时指定 Docker 服务器的地址
需要修改 x.x.x.x 为服务器的 ip
如有需要,可以把 DOCKER_HOST 环境变量写入.bashrc 或者.zshrc

$ export DOCKER_HOST=tcp://x.x.x.x:2337

显示 Docker 信息以确认是否成功

$ docker info

服务端(Debian)配置远程连接加密

发现远程连接不需要验证,如果有人获取了我们服务器的 ip 与端口,他就能直接连接到 Docker Daemon。并且 Docker 具有 root 权限,不加密十分危险。

所以接下来我们快速配置加密连接

执行下述脚本在/etc/docker 目录下直接创建密钥

# 创建 certs 目录并切换路径
mkdir /etc/docker/certs
cd /etc/docker/certs

# 创建 ca 密钥
openssl genrsa -aes256 -out ca-key.pem 4096

# 生成 ca 证书
openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem

# 创建服务器私钥
openssl genrsa -out server-key.pem 4096

# 生成服务器证书
openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr

# 使用 ca 证书与服务器证书签名
openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem

# 创建客户端私钥
openssl genrsa -out key.pem 4096

# 生成客户端证书
openssl req -subj "/CN=client" -new -key key.pem -out client.csr

# 创建并写入配置文件,然后根据配置文件使用 ca 证书与客户端证书签名
echo extendedKeyUsage=clientAuth > extfile.cnf
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf

# 删除多余的文件
rm -rf ca.srl client.csr extfile.cnf server.csr

接下来覆盖配置 docker.service
修改/etc/systemd/system/docker.service.d/override.conf 的内容如下
(如果目录或文件不存在就直接创建)

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/server-cert.pem --tlskey=/etc/docker/certs/server-key.pem -H tcp://0.0.0.0:2337 -H unix:///var/run/docker.sock

解释:基本跟上文的远程连接配置相同,只是指定了 tls 认证方式

客户端(macOS)配置远程连接加密

首先拷贝密钥
将服务器上/etc/docker/certs 下的 ca.pem、cert.pem、key.pem 拷贝到客户端的~/.docker 中

然后配置 Docker 环境变量到.zshrc 或.bashrc 中

export DOCKER_HOST=tcp://x.x.x.x:2337 DOCKER_TLS_VERIFY=1

尝试查看 Docker 信息以确认是否成功

$ docker info

参考资料

https://docs.docker.com/engine/security/https/
https://www.jianshu.com/p/9e513f57853b