不能在swarm中使用用户自定义的桥来组成yaml文件

我从docker文档中学到,我无法使用docker DNS来查找使用主机名的容器,而无需使用用户定义的桥接networking。 我使用下面的命令创build了一个:

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版本是: 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" 

我能够创build一个覆盖networking,并在撰写文件中定义它。 工作得很好,但没有桥接。 dockernetworking的结果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 

UPDATE

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

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

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

然后你就可以使用这个networking,在群集模式下定义服务和堆栈。 欲了解更多详情,你可以看到PR#32981 。


编辑:你似乎有显着过于复杂的问题。 只要所有东西都在一个单一的组合文件中完成,就没有必要把networking定义为外部的。 如果要传达容器到容器,则需要使用覆盖networking。 除了docker创build的默认“网桥”networking之外,DNS发现包含在网桥和覆盖networking中。 使用撰写文件,如果不明确地将其configuration为具有该名称的外部networking,则不会使用此networking。 所以要让容器到容器networking工作,你可以让docker-composedocker stack deploy自动为你的项目/堆栈创buildnetworking:

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

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

使用docker-compose它将创build一个默认的桥梁networking。 Swarm模式将创build一个覆盖networking。 这些默认值是允许在每个场景中进行DNS发现和容器到容器通信的理想select。

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