使用nginx proxy_pass的localhost上的docker注册表

时间:2013-10-08 15:13:35

标签: nginx docker

我正在尝试设置一个私有的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,我可以推送好吧。当nginx传递docker push时,为什么我的本地localhost命令会抱怨localhost

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

3 个答案:

答案 0 :(得分:2)

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

Docker自托管注册表附带了自己的淡化索引服务器。因此,您可能想要确定哪些注册表服务器作为响应标头传递回索引请求,以及是否适用于您的配置。您可能必须设置registry_endpoints配置设置才能让所有内容完美地结合在一起。

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

希望这有帮助!

答案 1 :(得分:2)

覆盖注册表设置的X-Docker-Endpoints标头:

proxy_hide_header  X-Docker-Endpoints;
add_header         X-Docker-Endpoints $http_host;

答案 2 :(得分:0)

我认为您遇到的问题是docker-registry在其自身与Docker客户端之间的对话期间通过X-Docker-Endpoints标头广告所谓的端点,然后Docker客户端将使用这些端点对于后续请求。

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

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