不能在swarm compose yaml文件中使用用户定义的桥

时间:2017-09-07 18:10:30

标签: docker swarm

我从docker documentation了解到,我不能使用docker DNS来查找使用其主机名的容器,而不使用用户定义的桥接网络。我使用命令创建了一个:

docker network create --driver=overlay --subnet=172.22.0.0/16 --gateway=172.22.0.1 user_defined_overlay

并尝试部署使用它的容器。撰写文件如下:

  version: "3.0"
    services:
      web1:
        image: "test"
        ports:
           - "12023:22"
        hostname: "mytest-web1"
        networks:
          - test
      web2:
        image: "test"
        ports:
           - "12024:22"
        hostname: "mytest-web2"
        networks:
          - test
    networks:
      test:
        external: 
          name: user_defined_overlay

我的泊坞广告版本是:Docker version 17.06.2-ce, build cec0b72 当我尝试部署堆栈时出现以下错误:

network "user_defined_bridge" is declared as external, but it is not in the right scope: "local" instead of "swarm"

我能够创建一个覆盖网络并在compose文件中定义它。虽然工作正常,但它没有用于桥梁。 docker network ls的结果:

NETWORK ID          NAME                       DRIVER              SCOPE
cd6c1e05fca1        bridge                     bridge              local
f0df22fb157a        docker_gwbridge            bridge              local
786416ba8d7f        host                       host                local
cuhjxyi98x15        ingress                    overlay             swarm
531b858419ba        none                       null                local
15f7e38081eb        user_defined_overlay       overlay             swarm

更新

我尝试在两个不同的swarm节点上创建两个容器(第一个容器在manager上运行,第二个在worker节点上运行)我指定了用户定义的覆盖网络,如上面的堆栈所示。我尝试使用主机名从mytest-web1容器中ping mytest-web2容器,但我得到了unknown host mytest-web2

2 个答案:

答案 0 :(得分:4)

从17.06开始,您可以使用群范围创建节点本地网络。使用--scope=swarm选项执行此操作,例如:

docker network create --scope=swarm --driver=bridge \
  --subnet=172.22.0.0/16 --gateway=172.22.0.1 user_defined_bridge

然后,您可以将此网络与群集模式中定义的服务和堆栈结合使用。有关详细信息,请参阅PR #32981

编辑:您的问题显然过于复杂。只要在单个撰写文件中完成所有操作,就不需要将网络定义为外部。如果要进行容器到容器的通信,则需要使用覆盖网络。 DNS发现包含在网桥和覆盖网络中,但默认的"网桥" docker创建的网络。使用撰写文件时,如果没有将其明确配置为具有该名称的外部网络,则永远不会使用此网络。因此,要使容器与容器网络一起工作,您可以让docker-composedocker stack deploy自动为您的项目/堆栈创建网络:

version: "3.0"
   services:
     web1:
       image: "test"
       ports:
       - "12023:22"
     web2:
       image: "test"
       ports:
         - "12024:22"

请注意,我还删除了"主机名"设置。 DNS解析不需要它。您可以直接与名为" web1"的服务VIP进行通信。或" web2"从这些容器中的任何一个。

使用docker-compose,它将创建默认的网桥。 Swarm模式将创建一个覆盖网络。这些默认设置非常适合在每种方案中进行DNS发现和容器到容器通信。

答案 1 :(得分:0)

覆盖网络是群体中使用的网络。 Swarm旨在用于管理多个主机上的容器,而覆盖网络是docker的多主机网络https://docs.docker.com/engine/userguide/networking/get-started-overlay/