必须启用TLS加密并限制访问:先用systemd覆盖机制配置dockerd监听tcp://0.0.0.0:2376和unix socket,再生成CA及服务端证书(CN与subjectAltName须含IP),追加--tlsverify等参数启用双向认证,最后用防火墙限定源IP、证书权限设为600、客户端须持有效client证书。

要让 Docker 守护进程支持远程 API 访问,核心是让 dockerd 监听 TCP 端口,但直接暴露明文端口(如 2375)等于开放 root 权限给网络——必须同步做安全加固。下面分三步讲清关键操作和避坑要点。
修改守护进程监听地址(不改服务文件更稳妥)
推荐用 systemd 覆盖机制,避免升级覆盖配置:
- 执行
sudo systemctl edit docker.service,新建覆盖文件 - 填入以下内容(保留本地 socket,只增 TCP 监听):
[Service]<br>ExecStart=<br>ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376
- 注意:这里用 2376 而非 2375,是为后续 TLS 预留标准端口,也便于区分明文/加密流量
- 保存后运行
sudo systemctl daemon-reload && sudo systemctl restart docker - 验证是否生效:
sudo netstat -tlnp | grep dockerd应看到:2376
强制启用 TLS 加密通信(不是可选,是必需)
没有证书的远程 API 就是裸奔。生成证书时重点注意三项:
-
CA 根证书:用
openssl genrsa -aes256 -out ca-key.pem 4096创建私钥,再用openssl req -new -x509 -days 3650 -key ca-key.pem -out ca.pem生成根证书 -
服务端证书:
subj中的CN必须填服务器实际 IP 或域名;extfile.cnf里subjectAltName至少包含该 IP 和0.0.0.0(允许任意客户端 IP 携有效证书连接) -
启动参数补全 TLS:在上一步的
ExecStart后追加--tlsverify --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/server-cert.pem --tlskey=/etc/docker/certs/server-key.pem
限制访问范围与权限(最小化暴露面)
即使有 TLS,也不代表可以放行所有流量:
- 防火墙只放行可信来源 IP:
例如用 ufw:sudo ufw allow from 192.168.10.5 to any port 2376 proto tcp - 不要把证书路径设为 world-readable:
sudo chmod -R 600 /etc/docker/certs - 客户端连接时必须提供 client 证书(由同一 CA 签发),否则连接被拒 —— 这才是真正双向认证
- 确认 Docker 用户组无多余成员:
getent group docker,非必要人员请移出
不复杂但容易忽略:每改一次配置,都要 daemon-reload + restart,且日志看 journalctl -u docker -n 50 --no-pager 才能准确定位失败原因。


















