首页 > 解决方案 > 工作人员之间的 Docker Swarm 覆盖网络

问题描述

虽然我已经看到有关此主题的其他问题,但似乎没有一个与我遇到的问题足够接近。这是我的 Swarm 中的 Docker 版本信息:

Server: Docker Engine - Community
Engine:
Version:          19.03.8
API version:      1.40 (minimum version 1.12)
Go version:       go1.12.17
Git commit:       afacb8b
Built:            Wed Mar 11 01:25:42 2020
OS/Arch:          linux/amd64
Experimental:     false
containerd:
Version:          1.2.13
GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version:          1.0.0-rc10
GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version:          0.18.0
GitCommit:        fec3683

我一直在尝试使用堆栈从 docker-compose 文件中进行部署,在该文件中我使用的是用户定义的覆盖网络(例如:docker network create -d overlay some_network --attachable),而我的服务都即将启动,我观察到运行docker network inspect some_network的工人的一致行为,列出的容器仅枚举部署中的一项服务(有 3 个服务,每个服务由 1 个任务组成)。网络检查的peers部分一致地显示所有工人。

奇怪的是,如果我做一个docker service ps service_name我确实看到服务是在我的工人之间安排的。使用docker service inspect service_name跟进,我在 Networks 部分看到的是用户创建的覆盖网络的 ID,同样在 VirtualIPs 部分中,用户创建的覆盖网络的 CIDR 中有一个 IP 以及一个 IP为入口。对每个部署的服务执行此操作会产生类似的结果:每个服务都附加了覆盖网络以及覆盖网络内的 IP。

关于为什么会发生这种情况以及如何纠正的任何想法?如果你们都希望我提供 docker-compose.yml 文件,请告诉我。

标签: dockerdocker-swarmdocker-stack

解决方案


即使覆盖网络是 swarm 范围的,它的特定实例也会在第一次创建使用它的容器时在节点上创建。这将使节点出现在docker network inspect的“peers”部分。每个节点,覆盖网络实例将知道附加到它的本地容器以及参与此覆盖网络的对等点列表。

您可以自己查看行为:创建一个新的覆盖网络,检查它。使用单个副本服务创建一个简单的 docker-compose.yml,该副本服务具有将其粘贴到任何工作节点的放置约束。在部署堆栈之前检查工作节点是否存在网络。然后在部署服务后检查工作节点上的网络。检查创建它的主节点上的网络。

入口网络本身就是一个特殊的覆盖网络。如果您以入口模式为服务发布端口,则任务创建的容器将位于入口网络和您的自定义网络中。


推荐阅读