2

我正在尝试设置一个私有 docker 注册表来上传我的东西,但我被卡住了。docker-registry 实例在端口 5000 上运行,我在它前面设置了 nginx,并使用代理传递指令将端口 80 上的请求传递回localhost:5000.

当我尝试推送我的图像时,我收到此错误: Failed to upload metadata: Put http://localhost:5000/v1/images/long_image_id/json: dial tcp localhost:5000: connection refused

如果我在 nginx 配置文件中用我的服务器的 ip 地址更改 localhost,我可以推送。为什么我的本地docker push命令会抱怨localhost何时localhost从 nginx 传递。

如果有帮助,服务器在 EC2 上。

4

3 回答 3

2

使用以下命令覆盖注册表设置的 X-Docker-Endpoints 标头:

proxy_hide_header  X-Docker-Endpoints;
add_header         X-Docker-Endpoints $http_host;
于 2015-04-14T18:54:35.150 回答
2

我不确定您的流量的具体情况,但我花了很多时间使用mitmproxy来检查 Docker 的数据流。Docker 注册表实际上分为两部分,索引和注册表。客户端联系索引以处理元数据,然后转发到单独的注册表以获取实际的二进制数据。

Docker 自托管注册表带有自己的淡化索引服务器。因此,您可能想弄清楚哪个注册表服务器作为响应标头传回给您的索引请求,以及它是否适用于您的配置。您可能必须设置registry_endpoints配置设置才能使所有内容都能很好地协同工作。

为了为每个人解决这个问题和其他问题,我们决定构建一个名为Quay的托管 Docker 注册表,它支持私有存储库。您可以使用我们的服务来存储您的私有图像并将它们部署到您的主机。

希望这可以帮助!

于 2013-10-08T16:31:26.603 回答
0

我认为您面临的问题是 docker-registry 在其与 Docker 客户端之间的对话早期通过 X-Docker-Endpoints 标头广告所谓的端点,然后 Docker 客户端将使用这些端点进行后续请求.

您有一个设置,您的 Docker 客户端首先在(公共)80 端口上与 Nginx 通信,然后切换到广告端点,这可能是 localhost:5000(即您的本地计算机)。

您应该查看您运行的 Docker 注册表中是否存在一个选项,以便它将端点通告为您的远程主机,即使它在 localhost:5000 上侦听。

于 2013-10-16T12:02:38.787 回答