我在Docker容器中有一个 Registry ,在另一个容器中有一个TeamCity Agent 。在构建过程中, Agent 必须从 Registry 中提取图像。 注册表在映射到image-repo
名称的计算机上运行,标准端口5000映射到55000(通过docker-compose
文件)。
如果 Agent 在与 Registry (在上运行)不同的计算机( Ubuntu )上运行,则一切正常Raspberry Pi )-然后它可以通过image-repo:55000
连接到 Registry ,而我无需执行任何操作即可使其工作。
但是,当 Agent 与 Registry 在同一台计算机上运行时,它找不到名称为image-repo:55000
的 Registry 。 image-repo
无法识别ping
。如果我用docker network
( bridge )连接这两个映像,则名称image-repo
可以访问,但是打开的端口是5000,而不是55000。
问题是:当它们在同一台计算机上通过 Registry 发布时,如何从 Agent 连接到 Registry (不是内部)端口?
答案 0 :(得分:1)
由于我们正在谈论的是docker注册表,因此答案将与常规答案有所不同。从Docker客户端中,当您推入和拉出映像时,该请求将发送到docker守护程序(dockerd),该守护程序负责解析主机名并连接到端口。从容器内部与docker守护进程通信的常见情况是挂载docker套接字(/var/run/docker.sock)并连接到主机上的守护程序。如果这样做,则需要发布注册表端口,并且可以使用已发布的端口通过“ localhost”,“ 127.0.0.1”或主机名与之进行通信。
如果您碰巧在Docker(DinD)中使用Docker,并且特权容器和在容器内部运行的单独dockerd进程,则该DinD容器需要与注册表容器位于同一网络上,并且您可以访问通过注册表容器名称作为主机名,然后直接连接到注册表端口,而不是发布的端口。