不能在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-compose
或docker 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/