Docker – 让新的容器与预运行容器进行通信

我试图在一对Docker容器之间build立一些非常简单的networking,到目前为止,我所看到的所有文档都比我想要做的要复杂得多。

我的用例很简单:

容器1已在运行,正在侦听端口28016容器2将容器1 启动并需要连接到端口28016上的容器1。

我知道我可以通过Docker-Compose轻松地设置它,但Container 1是长寿命的,对于这个用例,我不想closures它。 容器2需要启动并通过端口28016自动连接到容器1.此外,两个容器都在同一台机器上运行。 我无法弄清楚如何做到这一点。

我已经暴露了容器1的dockerfile中的28016,并使用-p 28016:28016运行它。 集装箱2连接到集装箱1需要做什么?

解决这个问题的方法有几种。 大多数不需要你发布端口。

使用用户定义的networking

如果你在用户定义的networking中启动你的长期运行的容器,那么docker将会处理这个容器

docker network create service-network docker run --net=service-network --name Container1 service-image 

如果在同一个networking中启动临时容器,则可以通过名称来引用长期运行的容器。 例如:

 docker run --name Container2 --net=service-network ephemeral-image 

使用现有的容器networking命名空间

您可以在长时间运行的容器的networking命名空间中运行临时容器:

 docker run --name Container2 --net=container:Container1 ephemeral-image 

在这种情况下,该服务将通过localhost:28016

访问主机上的服务

由于您使用-p 28016:28016在主机上发布了服务,因此可以使用主机的地址来引用该访问,该主机的地址将从容器内部成为默认网关。 你可以得到这样的东西:

 address=$(ip route | awk '$1 == "default" {print $3}') 

您的服务将在${address}:28016

以下是要执行的步骤:

  1. 创build一个networking: docker network create my-net
  2. 将networking连接到已经运行的容器: docker container attach <container-name> my-net
  3. --network my-net启动新的容器,或者用--network my-net -compose添加一个networking属性:

 ... networks: - my-net networks: my-net: external: true 

容器现在应该能够使用容器名称作为DNS主机名进行通信