必须启用远程API并强制TLS双向认证,编辑daemon.json配置hosts、tls及证书绝对路径,生成含匹配SAN的服务端证书和同CA签发的客户端证书,客户端通过环境变量指定TLS参数连接。

必须启用 Docker Daemon 的远程 API 并强制 TLS 双向认证——仅开放 TCP 端口(如 tcp://:2376)而无证书校验,等于将容器管理权限直接暴露在公网,生产环境严禁使用明文连接。
配置Docker Daemon监听并启用TLS
编辑 /etc/docker/daemon.json(Linux)或 C:\ProgramData\docker\config\daemon.json(Windows),确保内容包含以下关键项:
-
只启用安全端口:移除
tcp://:2375,仅保留"tcp://0.0.0.0:2376"; -
开启TLS验证:设置
"tls": true或"tlsverify": true; -
指定证书路径:全部使用绝对路径,例如:
"tlscacert": "/etc/docker/certs/ca.pem","tlscert": "/etc/docker/certs/server-cert.pem","tlskey": "/etc/docker/certs/server-key.pem"; -
权限收紧:私钥文件(
server-key.pem)权限必须为600,属主为root:docker。
保存后执行 sudo systemctl daemon-reload && sudo systemctl restart docker(Linux)或在服务管理器中重启 Docker 服务(Windows)。
生成匹配SAN的服务端与客户端证书
证书必须由同一 CA 签发,且关键细节不可出错:
-
CA 根证书:用
openssl genrsa -aes256 -out ca-key.pem 4096生成私钥,再用openssl req -new -x509生成ca.pem; -
服务端证书:其
Subject Alternative Name (SAN)必须显式列出所有允许访问的 IP 和域名,例如:IP:192.168.222.222,IP:127.0.0.1,DNS:docker-prod.example.com;
若漏填实际连接所用的 IP,客户端会因证书校验失败而拒绝连接; -
客户端证书:无需 SAN,但必须用同一 CA 签发;建议按角色或用户生成独立证书(如
admin.pem、ci.pem),便于后续吊销; -
证书目录结构(客户端):Linux/macOS 下放在
~/.docker/,含ca.pem、cert.pem、key.pem三个文件;Windows 下路径需用正斜杠或双反斜杠,如C:/Users/john/.docker。
客户端连接方式(推荐环境变量)
避免每次命令重复输入参数,设好环境变量后可直接运行 docker ps:
export DOCKER_TLS_VERIFY=1-
export DOCKER_HOST=tcp://192.168.222.222:2376(替换为实际服务器地址) -
export DOCKER_CA_PATH=$HOME/.docker(Linux/macOS)或set DOCKER_CA_PATH=C:/Users/john/.docker(Windows)
验证是否生效:运行 docker info | grep "Server Version",能正常返回即表示 TLS 连接成功。
常见失败原因与快速排查顺序
多数问题集中在证书链和时间一致性上:
- 系统时间偏差超过5分钟:TLS 证书含有效期,服务端与客户端时间不同步会导致握手失败;
-
服务端证书 SAN 不匹配:用
openssl x509 -in server-cert.pem -text -noout检查输出中的X509v3 Subject Alternative Name字段; -
证书路径错误或权限过高:私钥文件权限不能大于
600,否则 Docker 启动会静默失败; - 防火墙或云平台安全组未放行 2376 端口:确认本地策略与云厂商控制台双重开通;
-
客户端误用服务端证书:客户端必须使用自己专属的
cert.pem + key.pem,不可复用server-cert.pem。


















