【问题标题】:Let two Containers getting linked to eachother [duplicate]让两个容器相互链接[重复]
【发布时间】:2018-04-12 19:53:07
【问题描述】:

我有几个 docker Containers 和一个特殊情况,它们中的两个必须相互通信,所以它们最多只能通过链接相互了解。 我可以将一个 Container 链接到另一个,但问题是,我不能告诉他们第二个可以与第一个对话。

我尝试创建并运行第一个容器并停止它,然后我创建并启动了第二个容器并停止了它。接下来,我再次启动了第一个容器并链接到第二个,并启动了第二个链接到第一个。 在此之后,我的机器发疯了,docker 进程占用了所有 CPU 和内存,并且两个容器都无法访问。当您终止该进程时,会弹出一个新进程。 即使我卸载了 docker 重新启动了机器并再次安装了 docker,它甚至没有启动其中一个容器就回到了疯狂的状态。

有人知道如何将两个容器相互链接或让它们在两个方向上相互通信吗?

【问题讨论】:

    标签: docker


    【解决方案1】:

    推荐的方法是创建一个用户定义的网络,您可以在其中连接多个容器。

    可以使用以下命令轻松创建网络:

    docker network create -d bridge my-net
    

    创建网络后,您可以像这样启动容器。

    第一个容器:

    docker run -it --name b1 --network=my-net --rm bash:4.4
    

    第二个容器:

    docker run -it --name b2 --network=my-net --rm bash:4.4
    
    bash-4.4# ping b1
    PING b2 (172.26.0.3): 56 data bytes
    64 bytes from 172.26.0.3: seq=0 ttl=64 time=0.111 ms
    64 bytes from 172.26.0.3: seq=1 ttl=64 time=0.336 ms
    ...
    

    更多信息可以在Docker docs about user-defined networks找到。


    另一种使用链接的可能方法是通过在每个容器上公开一个端口并将容器绑定到主机接口来映射容器。

    docker run --net=host -p 127.0.0.1:5555:5555 --name container1 my/dockerimage1 
    docker run --net=host -p 127.0.0.1:6666:6666 --name container2 my/dockerimage2
    

    这样container1可以通过localhost:6666访问container2container2可以访问container1 通过 localhost:5555.

    这是不是链接,但有no way to do bidirectional linking

    documentation for docker networking 进一步解释了这一点。

    【讨论】:

      【解决方案2】:

      同一网络中的容器相互链接。

      您必须为这些容器创建一个网络。

      docker network create --driver bridge isolated_network
      

      运行容器时,您必须指定网络。

      docker run -it --net=isolated_network --name container1 container1-image bash
      docker run -it --net=isolated_network --name container2 container2-image bash
      

      创建容器后,您可以仅使用容器名称 ping 同一网络中的其他容器

      root@container1 ping container2
      root@container2 ping container1
      

      【讨论】:

      • 小错字:“--driver bridge”
      • thanx @udo ,我没看过
      • 这是正确答案。被接受的是不好的做法。
      【解决方案3】:

      另一种方法是通过将端口绑定到 docker0 接口来连接容器。 默认情况下,所有 docker 容器都连接到此网桥(通常具有 IP 地址172.17.42.1)。

      docker run -p 172.17.42.1:8001:8080 --name container1 [image]
      docker run -p 172.17.42.1:8002:8080 --name container2 [image]
      

      容器可以通过172.17.42.1和特定端口相互访问。

      提供了类似@wassgreen 的解决方案,但优点是容器无法访问主机接口。

      Advanced networking部分--net=host

      [...] 但它确实让容器进程像任何其他根进程一样打开低编号端口。它还允许容器访问本地网络服务,如 D-bus。这可能导致容器中的进程能够执行意外的事情,例如重新启动计算机。您应该谨慎使用此选项。

      有关通过docker0 接口进行此连接的更多信息,请参阅Unorthodox docker connection without links

      【讨论】:

        【解决方案4】:

        检查 docker 文档中的 --link 选项。您可以使用以下命令链接 2 个容器:

        $ docker run -i -t --name container_web --link container_db image_name
        

        【讨论】:

        • 这并不能解决问题;它允许单向通信,而 OP 需要双向通信。
        【解决方案5】:

        当 2 个容器在同一主机上运行时,网桥或主机网络工作。如果两个容器在不同的主机上运行,​​它们将无法相互通信。

        为了让不同主机上的两个容器相互通信,应该使用docker overlay network

        docker links doc 所述,docker --link 已弃用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-04
          • 2017-08-07
          • 1970-01-01
          • 2021-11-21
          • 1970-01-01
          • 1970-01-01
          • 2017-01-28
          • 2015-03-11
          相关资源
          最近更新 更多