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