【发布时间】:2018-06-18 04:51:33
【问题描述】:
总结
我已经在默认端口 5000 上运行的 Debian 主机上设置了一个注册表容器。
Debian 主机作为虚拟机运行在 VMWare 系统之上。 5000 端口已打开。
docker run -d -p 5000:5000 --name registry --restart=always registry:2
然后我标记了一个图像以推送到注册表
docker tag test-image localhost:5000/kp/testing:1.0.0
并尝试推送它
docker push localhost:5000/kp/testing:1.0.0
但它以Get http://localhost:5000/v2/: net/http: request canceled (Client.Timeout exceeded while awaiting headers) 失败。
注册表容器的输出为空。好像请求永远不会到达它一样。
我尝试了什么
然后我尝试 cURL _catalog 端点,它在接收响应标头时卡住了,连接本身似乎是成功的。
curl -v http://localhost:5000/v2/_catalog
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 5000 (#0)
> GET /v2/_catalog HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.52.1
> Accept: */*
>
我还尝试在主机上为注册表创建主机名并将其设置为注册表连接地址,但结果相同。
此外,我还尝试将主机名添加到/etc/docker/daemon.json 中的insecure-registries 数组中,但仍然以同样的错误结束。
然后我尝试使用自签名证书通过 TLS 设置它。同样,似乎在 cURL 中建立了连接,但没有收到响应头。
远程工作
出于好奇,我尝试远程访问它,所以我用 Debian 主机 IP 卷曲了相同的地址,它可以工作!
curl -v http://<host-ip>:5000/v2/_catalog
* Trying <host-ip>...
* TCP_NODELAY set
* Connected to <host-ip> (<host-ip>) port 5000 (#0)
> GET /v2/_catalog HTTP/1.1
> Host: <host-ip>:5000
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=utf-8
< Docker-Distribution-Api-Version: registry/2.0
< X-Content-Type-Options: nosniff
< Date: Tue, 09 Jan 2018 07:30:30 GMT
< Content-Length: 20
<
{"repositories":[]}
问题
因为我在 MacOS 和 Arch Linux 机器上都使用 localhost 设置它,所以它不能在 Debian 上本地工作似乎真的不现实。我认为 VMWare 系统不会干扰本地连接,尤其是在远程工作时?
我是否遗漏了阻止本地访问注册表的内容?
【问题讨论】:
-
我觉得不错?!我唯一能想到的是,您需要在基于 debian 的系统上以“sudo”的形式执行此操作。刚刚在 RaspberryPi(基于 arm 的注册表映像)上尝试过,但按照您描述的方式工作得很好......
-
@Ivonet sudo 可能是我唯一没有想到要尝试的事情。遗憾的是,在 sudo 下运行注册表会导致同样的错误。
-
对我来说也很合适。猜测环回驱动程序有什么问题,或者你的虚拟机有什么问题。只有其他想法是 IPv4 与 IPv6 的问题,但您的命令似乎要转到 IPv4,所以这似乎不太可能。
-
对于未来的读者 - 只需尝试重新启动您的机器。这对我有用
标签: linux docker debian docker-registry