Docker - 让新容器与预运行容器通信

时间:2017-10-27 14:56:17

标签: docker docker-compose

我试图在一对Docker容器之间设置一些非常简单的网络,到目前为止,我所看到的所有文档都比我正在尝试的文件复杂得多要做。

我的用例很简单:

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

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

我在Container 1的dockerfile中暴露了28016,我用-p 28016:28016运行它。我需要做什么才能让Container 2连接到Container 1?

2 个答案:

答案 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)

以下是要执行的步骤:

  1. 创建网络:docker network create my-net
  2. 将网络连接到已经运行的容器:docker container attach <container-name> my-net
  3. 使用--network my-net启动新容器或使用docker-compose添加网络属性:
  4. ...
    networks:
      - my-net
    
    networks:
      my-net:
        external: true
    

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