【发布时间】:2021-07-20 07:35:31
【问题描述】:
我有两台机器 HostA 和 HostB,并正确配置了 consul 和 docker 守护程序,以便我可以使用 docker network create -d overlay sharednet
我有一个TestScript.sh 来检查网络是否存在,如果不存在则创建网络。这个脚本在 HostA 和 HostB 上都可用。我在 A 上也有一个 MasterScript.sh,它基本上只是在每台机器上调用 TestScript.sh。在我运行MasterScript.sh 之后,我看到了一个令人惊讶的结果,创建了两个同名的网络!!!这可以说是一个 docker daemon 同步问题。
[HostA]# docker network ls
NETWORK ID NAME DRIVER
ad492bba9efa sharednet overlay
ba53d4e7b739 sharednet overlay
[HostB]# docker network ls
NETWORK ID NAME DRIVER
ad492bba9efa sharednet overlay
ba53d4e7b739 sharednet overlay
预期的行为是,当我在 HostA 上创建网络 testnw 时,在 HostB 上我应该会看到类似这样的内容
[HostB]# docker network ls
68994f95cd67 testnw overlay
[HostB]# docker network create -d overlay testnw
Error response from daemon: network with name testnw already exists
由于某些限制,我无法修改MasterScript.sh,但我可以修改我的TestScript.sh。那么问题来了,我是否有可能在这个限制下解决这个竞态条件?
【问题讨论】:
-
我完全同意你的期望;这看起来像一个错误。为什么首先检查所有主机上的网络?在一台主机上做这件事还不够吗?
-
@morxa 在每台机器上,我都有一份
TestScript.sh的副本,用于管理本地 docker 容器并将它们附加到适当的网络。如果网络不存在,脚本只会创建网络并将容器附加到网络。由于TestScript.sh在本质上是完全分布式的,并且设计上无法相互通信,因此 HostA 上的 TestScript.sh 不知道 HostB 上的 TestScript.sh 是否发出了创建命令。因此我必须依靠 docker daemon 来同步我的网络创建命令。 -
您使用的是哪个 docker 版本?
-
@morxa docker 1.10.2 我安装了get.docker.com 脚本,所以我认为这是最新的稳定版本
-
有趣,现在我看到了同样的问题。你提交错误报告了吗?