要让 Docker 私有仓库支持 TLS,需配置 Registry 的 HTTPS 通信并同步更新客户端信任机制;生成自签名证书、挂载至容器、设置 TLS 环境变量启动服务,再将证书复制到客户端 /etc/docker/certs.d/ 目录并重启 Docker 服务。
要让 docker 私有仓库支持 tls,核心是给 registry 服务配置有效的 https 通信能力,并同步调整客户端信任机制。不配 tls 的私有仓库默认走 http,docker 客户端会直接拒绝推送或拉取,除非显式标记为不安全——这在生产环境绝对不可取。
生成并部署 TLS 证书
证书是 TLS 的基础,推荐用 OpenSSL 生成自签名证书用于测试或内部环境(生产环境应使用受信 CA 签发的证书):
- 创建证书目录:mkdir -p certs
- 生成自签名证书和私钥(替换 registry.example.com 为你的仓库实际域名):
openssl req -newkey rsa:4096 -nodes -sha256 \
-keyout certs/domain.key \
-x509 -days 365 \
-out certs/domain.crt \
-subj "/CN=registry.example.com" - 确保 domain.crt 文件可被 Registry 容器读取,通常通过 -v 挂载进容器
启动带 TLS 的 Registry 服务
Registry 镜像通过环境变量启用 TLS,不能仅靠端口映射。典型命令如下:
- docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v "$(pwd)/certs":/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry:2 - 注意:Registry 默认监听 5000 端口,TLS 启用后该端口即为 HTTPS 端口,无需额外改端口
- 验证服务是否正常响应 HTTPS:curl -k https://registry.example.com:5000/v2/(-k 跳过证书校验,仅调试用)
配置 Docker 客户端信任该证书
客户端必须能验证服务器证书,否则 docker login 和 push/pull 会失败:
- 将 domain.crt 复制到每台客户端机器的 Docker 证书目录:
sudo mkdir -p /etc/docker/certs.d/registry.example.com:5000
sudo cp certs/domain.crt /etc/docker/certs.d/registry.example.com:5000/ca.crt - 重启 Docker 服务使配置生效:sudo systemctl restart docker
- 确认配置正确:docker login registry.example.com:5000 应提示输入用户名密码,不再报错 “x509: certificate signed by unknown authority”
可选:启用双向 TLS(mTLS)增强认证强度
对高安全要求场景,可在服务端强制验证客户端证书:
- 除服务端证书外,再生成一套客户端证书(CA + client.crt + client.key)
- 启动 Registry 时增加环境变量:
-e REGISTRY_HTTP_TLS_CLIENTCAS=/certs/client-ca.crt - 客户端需在登录时指定证书:
docker --tlsverify \
--tlscacert=/path/to/ca.crt \
--tlscert=/path/to/client.crt \
--tlskey=/path/to/client.key \
login registry.example.com:5000


















