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
。
以下是要执行的步骤:
- 创build一个networking:
docker network create my-net
- 将networking连接到已经运行的容器:
docker container attach <container-name> my-net
- 用
--network my-net
启动新的容器,或者用--network my-net
-compose添加一个networking属性:
... networks: - my-net networks: my-net: external: true
容器现在应该能够使用容器名称作为DNS主机名进行通信