docker tls安全连接验证需确认双向证书校验生效:服务端daemon.json启用"tlsverify":true并监听2376端口,客户端配置docker_host、docker_tls_verify和docker_cert_path后执行docker version/info应成功,删ca.pem则必失败。
docker 守护进程默认只监听本地 unix 套接字(/var/run/docker.sock),不对外暴露,也不启用认证。要支持远程安全连接,必须显式配置 tls 加密和客户端证书验证——这是生产环境唯一被 docker 官方推荐的安全方式。单纯开启 -h tcp://0.0.0.0:2375 是明文通信,等同于把 root 权限直接暴露在网路上,绝对不可用。
生成并部署 TLS 证书对
守护进程与客户端之间需双向 TLS 认证:服务端有 server.crt/server.key,客户端有 ca.crt、cert.pem、key.pem。不能复用自签名通配符证书或浏览器信任的公网证书。
- 用 OpenSSL 或
cfssl生成 CA 根证书(ca.crt + ca.key) - 为 Docker daemon 签发服务端证书,Common Name 必须是守护进程实际绑定的 IP 或域名(如
192.168.220.128),且需在 SAN 中包含所有可能访问的地址 - 为每个授权客户端(如 CI 机器、IDEA、运维终端)单独签发客户端证书,避免共用凭据
- 将 server.crt/server.key/ca.crt 放到服务端
/etc/docker/certs.d/或指定路径;客户端证书三件套放入本地~/.docker/certs.d/对应目录
修改 dockerd 启动参数启用 TLS
不要直接改 /usr/bin/dockerd 命令行,应通过 systemd 配置文件统一管理:
- 编辑
/etc/docker/daemon.json,添加:{ "tls": true, "tlscacert": "/etc/docker/certs.d/ca.crt", "tlscert": "/etc/docker/certs.d/server.crt", "tlskey": "/etc/docker/certs.d/server.key", "hosts": ["unix:///var/run/docker.sock", "tcp://192.168.220.128:2376"] } - 注意端口必须改为
2376(Docker TLS 默认端口),不是 2375 -
hosts中保留unix://保证本地命令仍可用 - 执行
sudo systemctl daemon-reload && sudo systemctl restart docker
客户端连接时正确加载证书
客户端(比如 IDEA、脚本、另一台机器)必须显式指定证书路径,否则会因证书不匹配失败:
- 命令行使用:
docker -H tcp://192.168.220.128:2376 --tlsverify --tlscacert=ca.crt --tlscert=cert.pem --tlskey=key.pem info - IDEA 配置 Docker 远程连接时,在 “Docker configuration” 页面勾选 “TLS verification”,然后分别指定 CA、Client cert、Client key 的本地路径
- 环境变量方式(不推荐用于多环境):
export DOCKER_HOST=tcp://192.168.220.128:2376 DOCKER_TLS_VERIFY=1 DOCKER_CERT_PATH=/path/to/client/certs
额外加固建议
TLS 是基础,但不是全部。还需结合系统层控制提升整体安全性:
- 限制监听 IP:不要写
0.0.0.0,只绑定内网管理网段(如192.168.220.128) - 防火墙放行仅 2376 端口,且只允许特定源 IP(如跳板机、CI 服务器)
- 确保
docker组用户最小化,禁止普通用户加入该组 - 定期轮换证书,尤其当客户端证书泄露或员工离职时
- 若需细粒度权限控制,可配合 AuthZ 插件 或企业版 UCP











