如何从docker容器连接到另一个容器中的已发布端口

如何从docker容器连接到另一个容器中的已发布端口,docker,Docker,我在Docker容器中有一个注册表,在另一个容器中有一个TeamCity代理。代理必须在生成过程中从注册表中提取映像。注册表正在映射到image reponame的计算机上运行,标准端口5000映射到55000(通过docker compose文件) 如果代理运行在不同的机器(Ubuntu)上,而不是运行在Registry(运行在Raspberry Pi上)上,那么它就可以通过image repo:55000连接到Registry,我不需要做任何事情就能让它工作 但当代理与注册表在同一台计算机上

我在Docker容器中有一个注册表,在另一个容器中有一个TeamCity代理。代理必须在生成过程中从注册表中提取映像。注册表正在映射到
image repo
name的计算机上运行,标准端口5000映射到55000(通过
docker compose
文件)

如果代理运行在不同的机器(Ubuntu)上,而不是运行在Registry(运行在Raspberry Pi上)上,那么它就可以通过
image repo:55000
连接到Registry,我不需要做任何事情就能让它工作

但当代理与注册表在同一台计算机上运行时,它无法按名称找到注册表
image repo:55000
,名称
image repo
无法通过
ping
识别。如果我用
docker network
(网桥)连接这两个映像,则可以访问名称
映像repo
,但打开的端口是5000,而不是55000


问题是:当代理在同一台机器上运行时,如何通过注册表的已发布(非内部)端口从代理连接到注册表?

因为我们谈论的是docker注册表,所以答案将不同于正常答案。从docker客户端,当您推拉映像时,该请求被发送到docker守护进程(dockerd),该守护进程负责解析主机名并连接到端口。从容器内部与docker守护进程对话的常见场景是装载docker套接字(/var/run/docker.sock)并连接到主机上的守护进程。如果您已经这样做了,那么需要发布注册表端口,您可以使用发布的端口通过“localhost”、“127.0.0.1”或主机名与之通信


如果您碰巧在Docker(DinD)中使用Docker,并在容器中运行特权容器和单独的Docker进程,则该DinD容器需要与注册表容器位于同一网络上,您可以通过注册表容器名称作为主机名访问它,并直接连接到注册表端口,不发送到已发布的端口。

这似乎是我的错误。我有一个步骤来验证存储库是可访问的(因为我在开始时遇到了一些连接问题),并且检查是用
curl
完成的。我假设如果
curl
找不到存储库,那么
docker
也不会。现在我禁用了那一步,它就消失了。这就解决了眼前的问题。不过,作为参考-如何从代理容器中访问
curl
access
image repo:55000
?curl在容器中运行,而不是在docker主机中运行。在这种情况下,第二种情况适用,使用DNS的容器名称和容器端口,而不是发布的端口。这要求两个容器位于同一个用户创建的docker网络中。是否可以从容器访问已发布的端口?取决于防火墙规则和DNS解析。您不能使用localhost,因为它对每个容器都是唯一的,并且与主机不同。但是输入主机ip/名称和发布的端口应该与主机的外部连接工作相同。我尝试了-但是
curl image repo:55000
没有工作,尽管
curl image repo:5000
在通过Docker网络连接两个映像的设置中起作用。