You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法将Docker镜像推送至私有Registry?技术问题求助

无法推送Docker镜像到私有Registry?来一步步排查!

从你给出的Swarm部署Registry的命令来看,咱们可以从以下几个核心方向定位问题:

1. 认证配置的细节坑

你启用了htpasswd认证,但有几个关键细节要确认:

  • htpasswd文件是否正确生成?必须用htpasswd工具创建(不能手动编辑),比如在主机上执行:
    htpasswd -Bc /etc/docker/auth/htpasswd your-username
    
    执行时会提示输入密码,生成的文件要放在你绑定的/etc/docker/auth目录下,还要确保文件权限设为644,让容器内的进程能正常读取。
  • 容器内能否访问到认证文件?先找到Registry容器ID(docker ps | grep registry),进入容器执行cat /auth/htpasswd看看能不能输出内容。如果提示文件不存在,要么是绑定挂载的路径写错了,要么主机上的/etc/docker/auth目录压根没创建。

2. TLS证书的验证点

你用Docker Secrets挂载证书的方式没问题,但要注意:

  • 证书是否匹配Registry域名?比如你的Registry地址是registry.yourdomain.com,证书的CN(通用名称)或者SAN(备用名称)必须包含这个域名,否则客户端会报证书不匹配的错误。
  • 客户端是否信任这个证书?如果是自签证书,得把domain.crt复制到客户端的/etc/docker/certs.d/registry.yourdomain.com/ca.crt目录下;如果是CA签发的证书,要确保客户端系统已经信任该CA。
  • Secrets是否正确创建?用docker secret ls确认domain.crt和domain.key这两个secret确实存在,别打错名字。

3. 网络与端口的连通性

你把Registry监听端口设为443,要排查:

  • 节点端口是否放行?运行Registry的Swarm节点(带registry==true标签的那个),防火墙要开放443端口,否则客户端根本连不上。
  • 客户端访问地址是否正确?推送命令必须是docker push registry.yourdomain.com/your-image:tag,不能用节点IP或者其他端口。
  • Swarm网络是否正常?如果是集群内部推送,检查Overlay网络的连通性,确保客户端所在节点能访问到Registry服务。

4. 存储挂载的权限问题

你用了卷挂载存储镜像数据,还有绑定挂载认证目录:

  • 卷权限是否正确?Registry容器默认用UID为100000的用户运行,要确保registry-data卷的权限给这个用户读写权限,可以进入容器执行ls -ld /var/lib/registry查看权限状态。
  • 挂载路径是否正确?确认主机上的/etc/docker/auth目录存在,并且里面有htpasswd文件,否则容器里的/auth目录是空的,认证肯定失败。

5. 先确认登录是否成功

推送之前,一定要先执行登录命令验证:

docker login registry.yourdomain.com

如果登录失败,根据错误提示直接定位问题——比如提示"invalid credentials"就是账号密码错了,提示"certificate signed by unknown authority"就是证书信任问题。

终极排查:看日志找线索

如果上面的排查都没问题,直接看Registry的服务日志:

docker service logs registry

日志里会明确告诉你哪里出错了——比如认证文件找不到、证书格式错误、存储目录权限不足等等,这是最直接的排查方式。

内容的提问来源于stack exchange,提问作者YOUNG WANT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:26:38