【问题标题】:Docker ping container on other nodes其他节点上的 Docker ping 容器
【发布时间】:2016-11-21 23:32:37
【问题描述】:

我有 2 个虚拟机(IP 为 192.168.56.101 的 VM1 和 IP 为 192.16.56.102 的 VM2 可以相互 ping 通),这些是我正在执行的步骤:

- Create consul container on VM1 with 'docker run -d -p 8500:8500 --name=consul progrium/consul -server -bootstrap'
- Create swarm manager on VM1 with 'docker run -d -p 3376:3376 swarm manage -H 0.0.0.0:3376 --advertise 192.168.56.101:3376 consul://192.168.56.101:8500
- Create swarm agents on each VM with 'docker run -d swarm join --advertise <VM-IP>:2376 consul://192.168.56.101:8500

如果我运行 docker -H 0.0.0.0:3376 info 我可以看到两个节点都连接到 swarm 并且它们都很健康。我也可以运行容器并将它们安排到节点上。但是,如果我创建一个网络并将几个节点分配给该网络,然后通过 SSH 连接到一个节点并尝试 ping 其他每个节点,我只能访问在同一虚拟机上运行的节点。

两个虚拟机都有这些 DOCKER_OPTS:

DOCKER_OPTS = DOCKER_OPTS="--cluster-store=consul://192.168.56.101:8500 --cluster-advertise=<VM-IP>:0 -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock"

【问题讨论】:

  • 你创建什么样的网络?新的 VitualBox 虚拟网络还是 docker 网络?
  • 一个新的 docker 网络通过“docker -H 0.0.0.0:3376 network create --subnet=172.11.0.0/16 testnetwork”连接到所有节点。如果我通过 ssh 连接到这些节点,则只能 ping 在同一虚拟机上运行的节点
  • 尝试提供覆盖驱动程序而不是默认网桥。然后它应该工作
  • 仍然得到同样的错误。我认为网络已正确创建,在每个带有“docker network ls”的节点上,我都可以看到以覆盖作为驱动程序的网络
  • 在创建 docker 网络之前,您可以从主机 ping 到另一个主机,而在创建之后不是吗?这很奇怪,因为 docker network 应该只影响容器而不影响主机。

标签: docker docker-swarm


【解决方案1】:

我没有直接引用,但根据我在 Docker GitHub 问题跟踪器上阅读的内容,ICMP 数据包 (ping) 永远不会在不同节点上的容器之间路由。

到显式打开的端口的 TCP 连接应该可以工作。但从 Docker 1.12.1 开始,它是错误的。

Docker 1.12.2 修复了一些错误,即建立与其他主机上的容器的连接。但是 ping 不能跨主机工作。

【讨论】:

    【解决方案2】:

    您只能 ping 同一节点上的容器,因为您将它们附加到 本地范围 网络。

    如 cmets 中所建议,如果您想使用 docker swarm 跨主机 ping 容器(即从 VM1 上的容器到 VM2 上的容器) (或 docker swarm 模式不显式打开端口,您需要创建一个覆盖网络(或全局范围 network)并在该网络上分配/启动容器。

    创建覆盖网络:

    docker network create -d overlay mynet
    

    然后使用该网络启动容器:

    • 对于 Docker Swarm 模式:

        docker service create --replicas 2 --network mynet --name web nginx
      
    • 对于 Docker Swarm(旧版):

        docker run -itd --network=mynet busybox
      

    例如,如果我们创建两个容器(在旧版 Swarm 上):

    docker run -itd --network=mynet --name=test1 busybox
    docker run -itd --network=mynet --name=test2 busybox
    

    您应该能够在test2 上通过docker attach ping test1,反之亦然。

    更多详情可以参考networking documentation

    注意:如果在创建覆盖网络并将容器附加到该网络后,容器仍然无法相互 ping 通,请检查 VM 的防火墙配置并确保这些端口已打开:

    • 数据平面/vxlanUDP 4789
    • 控制平面/八卦TCP/UDP 7946

    【讨论】:

      猜你喜欢
      • 2021-08-21
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 2020-06-16
      • 2018-01-11
      • 1970-01-01
      相关资源
      最近更新 更多