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 服务器的地址
如有需要,可以把 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