我试图在一对Docker容器之间设置一些非常简单的网络,到目前为止,我所看到的所有文档都比我正在尝试的文件复杂得多要做。
我的用例很简单:
容器1已在运行并正在侦听端口28016 容器2将在容器1之后启动,并且需要连接到端口28016上的容器1。
我知道我可以通过Docker-Compose轻松设置它,但是容器1是长寿的,对于这个用例,我不想关闭它。容器2需要启动并通过端口28016自动连接到容器1.此外,两个容器都在同一台机器上运行。我无法弄清楚如何做到这一点。
我在Container 1的dockerfile中暴露了28016,我用-p 28016:28016运行它。我需要做什么才能让Container 2连接到Container 1?
答案 0 :(得分:2)
有几种方法可以解决这个问题。大多数人都不要求您发布端口。
如果您在用户定义的网络中启动长时间运行的容器,因为docker将处理
docker network create service-network
docker run --net=service-network --name Container1 service-image
如果然后在同一网络中启动临时容器,它将能够按名称引用长时间运行的容器。 E.g:
docker run --name Container2 --net=service-network ephemeral-image
您可以在长时间运行的容器的网络命名空间内运行临时容器:
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 :(得分:0)
以下是要执行的步骤:
docker network create my-net
docker container attach <container-name> my-net
--network my-net
启动新容器或使用docker-compose添加网络属性:...
networks:
- my-net
networks:
my-net:
external: true
现在,容器应该能够使用container-name作为DNS主机名进行通信