无法在 swarm compose yaml 文件中使用用户定义的桥
can not use user-defined bridge in swarm compose yaml file
我从 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 网络 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 容器,但我得到 unknown host mytest-web2
overlay网络是swarm中要使用的网络。 Swarm 旨在用于管理多个主机上的容器,覆盖网络是 docker 的多主机网络 https://docs.docker.com/engine/userguide/networking/get-started-overlay/
从 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 创建的默认 "bridge" 网络除外。使用 compose 文件,如果不明确将其配置为具有该名称的外部网络,您将永远不会使用该网络。因此,要让容器到容器网络正常工作,您可以让 docker-compose
或 docker stack deploy
自动为您的 project/stack 创建网络:
version: "3.0"
services:
web1:
image: "test"
ports:
- "12023:22"
web2:
image: "test"
ports:
- "12024:22"
请注意,我还删除了 "hostname" 设置。 DNS 解析不需要它。您可以从这些容器中的任何一个直接与名称为 "web1" 或 "web2" 的服务 VIP 通信。
使用docker-compose
它将创建一个默认的桥接网络。 Swarm 模式将创建覆盖网络。这些默认值非常适合在每个场景中允许 DNS 发现和容器到容器的通信。
我从 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 网络 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 容器,但我得到 unknown host mytest-web2
overlay网络是swarm中要使用的网络。 Swarm 旨在用于管理多个主机上的容器,覆盖网络是 docker 的多主机网络 https://docs.docker.com/engine/userguide/networking/get-started-overlay/
从 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 创建的默认 "bridge" 网络除外。使用 compose 文件,如果不明确将其配置为具有该名称的外部网络,您将永远不会使用该网络。因此,要让容器到容器网络正常工作,您可以让 docker-compose
或 docker stack deploy
自动为您的 project/stack 创建网络:
version: "3.0"
services:
web1:
image: "test"
ports:
- "12023:22"
web2:
image: "test"
ports:
- "12024:22"
请注意,我还删除了 "hostname" 设置。 DNS 解析不需要它。您可以从这些容器中的任何一个直接与名称为 "web1" 或 "web2" 的服务 VIP 通信。
使用docker-compose
它将创建一个默认的桥接网络。 Swarm 模式将创建覆盖网络。这些默认值非常适合在每个场景中允许 DNS 发现和容器到容器的通信。