我从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 版本是: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"
我能够创建一个覆盖网络并在撰写文件中对其进行定义。效果很好,但不适用于桥接。
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
更新
我尝试创建在两个不同的群集节点上运行的两个容器(第一个容器在管理器上运行,第二个容器在工作器节点上运行),我指定了用户定义的覆盖网络,如上面的堆栈所示。我尝试使用主机名从mytest-web1容器中对ping mytest-web2容器执行ping操作,但我收到了unknown host mytest-web2

最佳答案

从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”或“web2”的服务VIP通信。

使用docker-compose,它将创建一个默认的网桥网络。群集模式将创建一个覆盖网络。这些默认值是允许在每种情况下进行DNS发现和容器到容器通信的理想选择。

关于docker - 无法在swarm撰写yaml文件中使用用户定义的网桥,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46102672/

10-11 22:28
查看更多