使用自签名证书的Docker Registry镜像推送失败求助
解决自签名证书Docker Registry镜像推送问题
问题根源
- 端口不匹配:树莓派上的Registry容器绑定了443端口,但你推送时使用了未对外开放的5000端口,导致连接被拒绝。
- 证书域名不符:当前Registry加载的证书并非你生成的含
rpi域名的证书,大概率是旧容器残留配置或证书挂载异常导致。
修复步骤
1. 清理旧Registry容器
先移除可能残留的旧容器,避免配置干扰:
docker stop registry docker rm registry
2. 重新生成/验证证书
在树莓派上检查现有证书的域名信息,确认包含rpi:
openssl x509 -in certs/domain.crt -text -noout | grep -A 1 "Subject Alternative Name"
若输出未显示DNS:rpi,则重新生成证书(强制指定Common Name为rpi):
rm -rf certs mkdir -p certs openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -addext "subjectAltName = DNS:rpi" -x509 -days 365 -out certs/domain.crt -subj "/CN=rpi"
3. 重新启动Registry容器
确保证书挂载路径正确,绑定443端口:
docker run -d --restart=always --name registry \ -v $HOME/certs:/certs \ -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ -p 443:443 registry
4. 修正Linux PC的证书存放路径
之前错误将证书放到了rpi:5000目录下,需调整为对应443端口的路径:
# 删除错误路径 sudo rm -rf /etc/docker/certs.d/rpi:5000 # 创建正确路径并拷贝证书 sudo mkdir -p /etc/docker/certs.d/rpi:443/ scp pi@rpi:certs/domain.crt ca.crt sudo mv ca.crt /etc/docker/certs.d/rpi:443/ # 重启Docker使配置生效 sudo systemctl restart docker
5. 测试镜像推送
给本地镜像打对应标签后推送:
# 为本地镜像打标签(假设本地镜像名为test-image:latest) docker tag test-image:latest rpi:443/test-image:latest # 执行推送 docker push rpi:443/test-image:latest
验证推送结果
在树莓派上执行以下命令,确认镜像已上传:
curl -k https://rpi:443/v2/_catalog
内容的提问来源于stack exchange,提问作者nagy.zsolt.hun
相关产品推荐
相关产品推荐

