如何在不删除现有镜像的情况下更新 Docker 私有注册表的自签名 SSL/TLS 证书?

问题描述 投票:0回答:1

我在

127.0.0.1:443
本地部署了一个 docker 私有注册表,它受到自签名 SSL/TLS 证书的保护。该注册表包含容器部署期间使用的映像。

但是,我目前面临 SSL/TLS 证书已过期的问题,我无法再使用以下命令登录:

docker login -u 'username:test' https://127.0.0.1:443

执行上述命令会出现以下错误:

来自守护程序的错误响应:获取“https://127.0.0.1:443/v2/”:tls:无法验证证书:x509:证书已过期或尚未有效:当前时间 2024-01-01T14:04: 11+04:30 是在 2023-11-12T05:19:15Z 之后

我所做的是生成一组新的证书,然后重新启动/重新初始化 Docker 容器,如下所示:

docker run -d \                                                                                                         
--restart=always \
--name registry \
-v `pwd`/auth:/auth \
-v `pwd`/certs:/certs \
-v `pwd`/certs:/certs \
-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

这种方法是成功的,但正如您所观察到的,它代表了一种全新的部署。因此,所有图像均已从注册表中删除。

第二个猜测:我还将新证书上传到docker容器,如下所示:

docker cp certs <registry_container_id>:/certs

并重新启动容器:

docker restart <registry_container_id>

上述操作导致私钥无法解析,从而导致容器在重启过程中失败。

另一方面,是否有一种方法可以更新 Docker 注册表的 SSL/TLS 证书而不造成任何中断?

linux docker ssl docker-registry podman
1个回答
0
投票

registry
镜像将上传的镜像存储在
/var/lib/registry
,因此要将它们在容器实例之间持久保存,您需要将卷或主机目录映射到该路径。

例如,如果您想将图像存储在名为

my-images
的卷中,您需要添加

-v my-images:/var/lib/registry

按照您的

docker run
命令。

© www.soinside.com 2019 - 2024. All rights reserved.