7

我从docker 文档中了解到,如果不使用用户定义的桥接网络,我无法使用 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

更新

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

4

2 回答 2

9

从 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

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


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

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

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

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

于 2017-09-07T19:47:40.567 回答
0

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

于 2017-09-07T19:29:04.070 回答