Docker推送镜像到私有Registry时认证失败怎么办?

Tr° 春萍 阅读 13

我在本地搭了个私有Docker Registry,用docker push的时候一直报“unauthorized: authentication required”,明明已经用docker login登录过了,配置也加了insecure-registries,但还是不行,到底哪里出问题了?

我的Registry是通过以下HTML页面做简单测试入口的(虽然和问题可能无关,但贴出来以防万一):

<html>
<head><title>My Registry</title></head>
<body>
  <h1>Private Docker Registry</h1>
  <p>Status: Running on port 5000</p>
</body>
</html>
我来解答 赞 8 收藏
二维码
手机扫码查看
1 条解答
Good“梓玥
问题应该出在登录地址和推送地址不一致上。Docker对于Registry的地址匹配非常严格,哪怕localhost和127.0.0.1指向同一个地方,在Docker看来这也是两个完全不同的Registry,凭证不会通用。

你可以先检查一下本地的凭据存储文件。打开 ~/.docker/config.json 看一眼,auths 下面存的那个key,是不是跟你 docker push 时用的镜像地址完全一致。

比如你登录的时候用的是 docker login localhost:5000,那config.json里存的key就是 localhost:5000。这时候如果你给镜像打tag用的是 127.0.0.1:5000/my-image,Docker去 config.json 里找 127.0.0.1:5000 的认证信息,发现找不到,就直接以未认证身份去推,结果自然就被Registry拒绝了。

解决办法很简单,统一地址。

第一步,确认你Registry的访问地址,比如是 192.168.1.100:5000

第二步,重新登录,确保带上端口:
docker login 192.168.1.100:5000


第三步,打tag的时候必须用同样的地址:
docker tag my-image 192.168.1.100:5000/my-image
docker push 192.168.1.100:5000/my-image


另外提一句,你配置了 insecure-registries 之后,必须重启Docker服务才能生效,光改配置文件不重启是没用的。如果上面这招还不行,那就要看看你的Registry是不是配置了认证但后端服务有问题,不过大概率就是地址没对上。那个HTML页面大概率只是个静态欢迎页,跟Registry API交互没关系,先放一边。
点赞
2026-03-01 04:07