我无法从主机的命令行登录我的私有注册表

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

几周前,我一直在做噩梦,无法登录 macOS Big Sur 上的 minikube 虚拟机内的私有 docker 注册表(使用 vitualbox 6.1.48 作为虚拟机管理程序)。基于registry:2的容器本身已启动并运行,正如您在docker ps命令的屏幕截图中所看到的那样

从屏幕上您可以看到我的私有注册表在

0.0.0.0:5000
上可用,这意味着我可以从 0.0.0.0:5000 上的另一个 docker 容器访问它,并且从 macOS 的命令我应该能够在
localhost:5000
。 当我输入命令:
docker login 0.0.0.0:5000
时,我收到此错误

« INFO[0018] 登录端点时出错,请尝试下一个端点 错误=“获取“https://0.0.0.0:5000/v2/”:net/http:TLS 握手 超时 »

我还尝试使用 localhost:5000 登录,收到与上述 TLS 握手错误相同的错误消息。

所以我输入命令:

minikube ip
并收到
192.168.59.108
,这是我的minikube虚拟机的IP地址。然后我尝试使用该地址登录:
docker login 192.168.59.108:5000
,但这次我收到错误

error="登录尝试 https://192.168.59.108:5000/v2/ 失败 状态:401 未经授权”

您可以看到所有错误消息,如下图所示:

在调试问题时,我通过以下方式获取容器的日志:

docker logs 04d865955936
,我收到了您在下面的屏幕截图中看到的结果。它没有显示错误,但告诉了 http.secret,我不知道该文件在哪里位于:

事实上,我使用来自

mkcert
的自签名证书来保护与注册表的通信,并且在容器中进行 SSH 时,可以很好地显示存储证书
.cert
.key
文件的卷。
htpasswd
身份验证文件用于管理用户的也在那里。 这是我的 docker-compose.yml 文件:

version: "3.7"

services:
  basic-auth:
    restart: always
    image: registry:2
    container_name: kernel-registry
    build:
      context: .
    ports:
      - 5000:5000
    environment:
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/registry.crt
      REGISTRY_HTTP_TLS_KEY: /certs/registry.key
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: basic-realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    volumes:
      - /data/:/data
      - /certs:/certs
      - /auth/:/auth

当我从 docker-compose 环境配置中删除 TLS 证书和密钥时,我收到一条消息:http:

server gave HTTP response to HTTPS client.
,这意味着该证书是强制性的,不应删除。

我经历了几乎所有使用自签名证书登录私人注册表的类似问题,但没有什么与我的情况完全相同。我禁用了防病毒软件,在控制台导出

no_proxy=localhost,127.0.0.1,192.168.59.108:5000,192.168.59.109:5000,0.0.0.0:5000
上输入,删除并重新创建了虚拟机,但所有这些都不起作用。有些人讲述了配置
~/.docker/daemon.json
/etc/sysconfig/docker
但我的系统上没有这样的文件退出。 所以实际上我完全很困惑,甚至不知道这些错误的根源是什么以及从哪里调试它。现在这就像一个巨大的痛苦,我真的需要你的帮助来解决它。预先感谢您的帮助。

virtualbox minikube docker-registry client-certificates .htpasswd
1个回答
0
投票

就像评论中提到的那样,从问题中不清楚您最初打算做什么 - 使用 auth 设置本地注册表,使用 auth + TLS 设置本地注册表,使用 self 设置使用 auth 和 TLS 的本地注册表签署证书或其他东西。如果它是具有身份验证和带有自签名证书的 TLS 的本地注册表,我认为至少不能按照文档上的注释来完成。如果它只是一个具有身份验证的本地注册表,我可以使用以下

docker-compose
文件来实现这一点:

version: '3.7'

services:
  htpasswd:
    image: httpd:2
    command: 'htpasswd -Bb /auth/htpasswd testuser testpwd'
    volumes:
      - ./auth:/auth

  registry:
    image: registry:2
    depends_on:
      - htpasswd
    ports:
      - 5000:5000
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    volumes:
      - ./auth:/auth

用户名和密码分别为

testuser
testpwd
。第一个服务在
./auth/htpasswd
创建 htpasswd 文件,然后第二个服务(即注册表)使用该文件。注册表启动后,我就可以使用如下命令登录:

echo "testpwd" | docker login localhost:5000 -u testuser --password-stdin
© www.soinside.com 2019 - 2024. All rights reserved.