无法将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
相关产品推荐
相关产品推荐

