必须启用远程API并配置TLS双向认证,编辑daemon.json设置hosts、tls及证书路径,生成匹配SAN的服务器/客户端证书,客户端通过环境变量或命令行指定TLS参数连接。

要让 Docker Client 远程连接 Docker Daemon,必须启用远程 API 并配置 TLS 双向认证——不配置 TLS 会暴露未授权访问风险,仅开 TCP 端口(如 tcp://:2376)但无证书验证等于裸奔。
启用 Docker Daemon 的远程监听与 TLS 支持
Docker 默认只监听本地 Unix socket(unix:///var/run/docker.sock),需修改服务配置以支持 TCP + TLS:
- 编辑
/etc/docker/daemon.json,添加或确认以下字段(注意:不要同时开启tcp://:2375明文端口):{ "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"], "tls": true, "tlscacert": "/etc/docker/certs/ca.pem", "tlscert": "/etc/docker/certs/server.pem", "tlskey": "/etc/docker/certs/server-key.pem" } - 证书路径必须为绝对路径,且文件权限应设为
600(尤其是私钥),属主为root:docker - 重启服务:
sudo systemctl daemon-reload && sudo systemctl restart docker
生成并分发 TLS 证书(服务端 + 客户端)
推荐使用 openssl 或 cfssl 生成,关键点在于:
- CA 根证书(
ca.pem)需由同一 CA 签发服务端与客户端证书,否则握手失败 - 服务端证书(
server.pem)的Subject Alternative Name (SAN)必须包含监听 IP 或域名(如IP:192.168.1.100,DNS:docker.example.com),否则客户端校验失败 - 客户端证书(
cert.pem+key.pem)无需 SAN,但需用同一 CA 签发;建议为不同用户/工具生成独立证书,便于吊销 - 客户端证书目录结构示例(Linux/macOS):
~/.docker/ ├── ca.pem ├── cert.pem └── key.pem
客户端连接方式与环境变量设置
有三种常用方式,本质都是指定 TLS 三件套 + 主机地址:
- 命令行直接指定:
docker --tlsverify --tlscacert=~/.docker/ca.pem --tlscert=~/.docker/cert.pem --tlskey=~/.docker/key.pem -H tcp://192.168.1.100:2376 ps - 设置环境变量(推荐,避免每次输入):
export DOCKER_TLS_VERIFY=1 export DOCKER_HOST=tcp://192.168.1.100:2376 export DOCKER_CA_PATH=~/.docker
此时直接运行docker ps即可走 TLS 连接 - Windows 用户注意:
DOCKER_CA_PATH需指向含三个证书文件的目录,且路径用正斜杠或双反斜杠(如C:/Users/me/.docker)
常见连接失败原因与排查要点
多数问题出在证书链或配置细节,按顺序检查:
- 时间不同步:服务端与客户端系统时间偏差 > 1 分钟会导致 TLS 握手失败(X.509 有效期校验)
-
证书权限错误:客户端
key.pem权限不能高于600,否则 Docker Client 拒绝加载 -
主机名不匹配:若用
DOCKER_HOST=tcp://myhost:2376,则服务端证书 SAN 必须含DNS:myhost;用 IP 则必须含对应IP:x.x.x.x -
防火墙拦截:确认
2376端口在服务端开放(sudo ufw allow 2376或对应 iptables 规则) - 快速验证服务端是否就绪:
curl --cacert ~/.docker/ca.pem --cert ~/.docker/cert.pem --key ~/.docker/key.pem https://192.168.1.100:2376/version










