生产环境必须启用tls加密与双向认证,禁用2375明文端口;需通过私有ca签发服务端(含san)和客户端证书,配置daemon.json启用2376端口tls验证,并严格管控证书分发、防火墙及用户权限。
直接暴露 docker 守护进程(如用 tcp://0.0.0.0:2375)是高危操作,生产环境必须启用 tls 加密与双向认证。安全连接的核心不是“能不能连”,而是“谁可以连、用什么凭证连、通信是否被篡改”。下面分三步讲清楚关键配置。
生成并部署 TLS 证书对
服务端需提供受信任的 CA 签发的服务器证书,客户端需持有对应 CA 签发的客户端证书。不推荐自签名后手动分发信任,应统一由私有 CA 管理:
- 在可信机器上用
openssl或cfssl创建根 CA(ca.pem、ca-key.pem) - 为 Docker 主机生成服务器证书:CN 必须是宿主机实际 IP 或域名,且需在 SAN 中包含所有可访问地址(如
IP:192.168.1.100,DNS:docker-prod) - 为每个授权客户端生成独立客户端证书(
client.pem+client-key.pem),私钥严格保密 - 将
ca.pem、server-cert.pem、server-key.pem拷贝到 Docker 主机的/etc/docker/tls/目录,权限设为600
配置守护进程启用 TLS 验证
使用 daemon.json 是最清晰的方式,避免与 systemd 启动参数冲突:
- 编辑
/etc/docker/daemon.json,写入以下内容(注意:不能同时存在"hosts"和-H参数冲突):
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"],
"tls": true,
"tlscacert": "/etc/docker/tls/ca.pem",
"tlscert": "/etc/docker/tls/server-cert.pem",
"tlskey": "/etc/docker/tls/server-key.pem",
"tlsverify": true
}
- 端口必须用 2376(Docker 官方 TLS 端口),不可继续用 2375
- 重启服务:
sudo systemctl daemon-reload && sudo systemctl restart docker - 验证监听:
sudo ss -tlnp | grep :2376应显示 dockerd 绑定成功
客户端安全连接方式
本地客户端无需安装 Docker Engine,只需正确配置证书即可调用远程 API:
- 将
ca.pem、client.pem、client-key.pem放入本地目录(如~/.docker/tls/) - 设置环境变量(或每次加参数):
export DOCKER_HOST=tcp://192.168.1.100:2376 export DOCKER_TLS_VERIFY=1 export DOCKER_CERT_PATH=$HOME/.docker/tls
- 执行
docker version,若返回服务端版本且无证书错误,即连接成功 - 禁止禁用验证(如
--tlsverify=false)或跳过 CA 检查,这等同于裸奔
补充加固项
证书只是基础,还需叠加网络与系统层防护:
- 防火墙仅放行特定管理 IP 访问 2376 端口,拒绝全网开放
- 确保 Docker 主机上只有必要用户属于
docker组,普通用户不得拥有套接字读写权限 - 定期轮换客户端证书,撤销失陷终端的证书(通过 CRL 或 OCSP)
- 考虑用 SSH 隧道替代公网暴露:在本地运行
ssh -L 2376:/var/run/docker.sock user@host,再连localhost:2376











