如何更新Docker私有仓库自签名SSL/TLS证书且保留现有镜像
无中断更新Docker私有仓库SSL/TLS证书(保留现有镜像)
关键问题排查
你之前重新部署容器丢失镜像,是因为启动命令没有挂载镜像存储目录(容器默认路径为/var/lib/registry),导致容器内的镜像数据随容器销毁而丢失;直接复制证书后重启失败,大概率是证书文件权限不符合要求(容器以registry用户运行,UID为10000,私钥必须设为600权限)。
正确更新步骤
情况1:已通过本地卷挂载/certs目录
如果你的仓库容器启动时已用-v参数将本地./certs挂载到容器内/certs(如你提供的启动命令),直接替换本地./certs下的新证书文件(certificate.crt和private.key),然后重启容器即可:
# 替换本地证书后重启容器,过程几乎无中断 docker restart registry
情况2:未挂载/certs目录到本地
若之前未挂载/certs卷,需先复制新证书到容器内并修正权限:
- 复制新证书到容器的
/certs目录:
# 替换<registry_container_id>为你的容器ID或名称 docker cp ./new_certs/certificate.crt <registry_container_id>:/certs/ docker cp ./new_certs/private.key <registry_container_id>:/certs/
- 修正证书文件权限,确保容器内
registry用户可读取:
docker exec <registry_container_id> chown 10000:10000 /certs/certificate.crt /certs/private.key docker exec <registry_container_id> chmod 600 /certs/private.key # 私钥必须设为600权限
- 重启容器:
docker restart <registry_container_id>
后续预防措施
为避免后续重新部署丢失镜像,启动容器时必须挂载镜像存储卷,修改你的启动命令添加以下参数:
-v `pwd`/registry-data:/var/lib/registry \ # 挂载本地目录保存镜像数据
完整启动命令示例:
docker run -d \ --restart=always \ --name registry \ -v `pwd`/auth:/auth \ -v `pwd`/certs:/certs \ -v `pwd`/registry-data:/var/lib/registry \ -e REGISTRY_AUTH=htpasswd \ -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/certificate.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/private.key \ -p 443:443 registry:2
内容的提问来源于stack exchange,提问作者Niamatullah Bakhshi
相关产品推荐
相关产品推荐

