必须配置HTTPS,否则Docker客户端默认拒绝连接且明文传输会暴露镜像层、元数据及敏感配置;核心是服务端启用TLS加密并确保客户端信任证书,生产环境应使用Let’s Encrypt或企业CA签发证书,测试环境可用自签名证书但需手动部署ca.crt至/etc/docker/certs.d/域名:443/并重启docker服务。

必须配置 HTTPS,否则 Docker 客户端默认拒绝连接,且明文传输会暴露镜像层、元数据甚至敏感配置。核心是让服务端启用 TLS 加密,同时让客户端信任该证书。
生成并准备 TLS 证书
生产环境建议使用 Let’s Encrypt 或企业 CA 签发的证书;测试或内网环境可用自签名证书,但需确保客户端信任。
- 创建证书目录:
mkdir -p /opt/registry/certs - 生成私钥和自签名证书(以 registry.example.com 为例):
openssl req -newkey rsa:2048 -nodes -sha256 -keyout /opt/registry/certs/domain.key \<br> -x509 -days 365 -out /opt/registry/certs/domain.crt \<br> -subj "/CN=registry.example.com"
- 确认域名与实际访问地址一致,否则客户端校验失败
启动带 HTTPS 的 Registry 容器
Registry 原生支持 TLS,无需 Nginx 反代也能跑 HTTPS,但端口需映射为 443(或自定义如 5001),并正确挂载证书与设置环境变量。
- 运行命令示例:
docker run -d \<br> --restart=always \<br> --name registry \<br> -p 443:443 \<br> -v /opt/registry/data:/var/lib/registry \<br> -v /opt/registry/certs:/certs \<br> -e REGISTRY_HTTP_ADDR=:443 \<br> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \<br> -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \<br> registry:2
- 关键点:
REGISTRY_HTTP_ADDR必须指定为:443,否则容器仍监听 5000 且 TLS 不生效 - 若改用非标端口(如 5001),则
-p 5001:5001且REGISTRY_HTTP_ADDR=:5001
配置 Docker 客户端信任证书
Docker 默认只信任由公共 CA 签发的证书。自签名或私有 CA 证书必须手动安装到客户端系统的证书信任库中。
- 将
domain.crt复制到每台需推送/拉取的机器:sudo mkdir -p /etc/docker/certs.d/registry.example.com:443sudo cp domain.crt /etc/docker/certs.d/registry.example.com:443/ca.crt - 重启 Docker 服务使配置生效:
sudo systemctl restart docker - 验证:执行
curl -k https://registry.example.com:443/v2/应返回{};docker info | grep -i insecure不应出现该地址(说明不是走的不安全模式)
补充基础安全加固
HTTPS 解决传输加密,还需叠加认证防止未授权操作。
- 生成用户密码文件:
htpasswd -Bbn username password > /opt/registry/auth/htpasswd - 启动时添加认证参数:
-v /opt/registry/auth:/auth \<br> -e REGISTRY_AUTH=htpasswd \<br> -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \<br> -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
- 客户端首次操作前需登录:
docker login registry.example.com











