无法在 swarm compose yaml 文件中使用用户定义的桥接器

tky*_*ass 5 docker swarm

我从docker 文档中了解到,在不使用用户定义的桥接网络的情况下,我无法使用 docker DNS 来查找使用主机名的容器。我使用以下命令创建了一个:

docker network create --driver=overlay --subnet=172.22.0.0/16 --gateway=172.22.0.1 user_defined_overlay
Run Code Online (Sandbox Code Playgroud)

并尝试部署使用它的容器。撰写文件看起来像:

  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
Run Code Online (Sandbox Code Playgroud)

我的 docker 版本是: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"
Run Code Online (Sandbox Code Playgroud)

我能够创建一个覆盖网络并在撰写文件中定义它。效果很好,但不适用于桥接。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
Run Code Online (Sandbox Code Playgroud)

更新

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

BMi*_*tch 7

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

docker network create --scope=swarm --driver=bridge \
  --subnet=172.22.0.0/16 --gateway=172.22.0.1 user_defined_bridge
Run Code Online (Sandbox Code Playgroud)

然后,您可以将此网络与以 swarm 模式定义的服务和堆栈一起使用。有关更多详细信息,您可以查看PR #32981


编辑:您的问题似乎过于复杂。只要一切都在一个单独的撰写文件中完成,就没有必要将网络定义为外部网络。如果要进行容器到容器的通信,则需要使用覆盖网络。DNS 发现包含在桥接和覆盖网络上,docker 创建的默认“桥接”网络除外。使用撰写文件,您永远不会使用此网络,除非将其显式配置为具有该名称的外部网络。因此,要使容器到容器网络正常工作,您可以使用以下命令自动为您的项目/堆栈创建docker-composedocker stack deploy创建网络:

version: "3.0"
   services:
     web1:
       image: "test"
       ports:
       - "12023:22"
     web2:
       image: "test"
       ports:
         - "12024:22"
Run Code Online (Sandbox Code Playgroud)

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

随着docker-compose它会创建一个默认的桥接网络。Swarm 模式将创建一个覆盖网络。这些默认值非常适合在每个场景中允许 DNS 发现和容器到容器通信。