如何在docker覆盖网络创建过程中避免竞争条件?
我有两台机器HostA和HostB,正确配置了领事和docker守护进程,以便使用如何在docker覆盖网络创建过程中避免竞争条件?,docker,docker-networking,Docker,Docker Networking,我有两台机器HostA和HostB,正确配置了领事和docker守护进程,以便使用docker network create-d overlay sharednet 我有一个TestScript.sh来检查网络是否存在,如果不存在,则创建网络。这个脚本在HostA和hosb上都可用。我还有一个MasterScript.sh,它只在一台机器上调用TestScript.sh。在我运行我的MasterScript.sh之后,我看到了一个令人惊讶的结果,两个同名的网络被创建了!!!这可能是docker守
docker network create-d overlay sharednet
我有一个TestScript.sh
来检查网络是否存在,如果不存在,则创建网络。这个脚本在HostA和hosb上都可用。我还有一个MasterScript.sh
,它只在一台机器上调用TestScript.sh
。在我运行我的MasterScript.sh
之后,我看到了一个令人惊讶的结果,两个同名的网络被创建了!!!这可能是docker守护进程同步问题
[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
。所以问题是,我是否有可能在这个限制下解决这个竞态条件?这个问题已经报告给Docker Github,目前正在进行跟踪这个问题已经报告给Docker Github,目前正在进行跟踪我完全同意你的期望;这看起来像个虫子。为什么首先要检查所有主机上的网络?在一台主机上做这件事还不够吗?@morxa在每台机器上我都有一份TestScript.sh
管理本地docker容器的副本,并将它们连接到适当的网络。如果网络不存在,脚本将只创建网络并将容器附加到网络。由于TestScript.sh
在本质上是完全分布式的,并且根据设计不能相互通信,因此主机A上的TestScript.sh不知道主机B上的TestScript.sh是否发出了create命令。因此,我必须依赖docker守护进程来同步我的网络创建命令。您使用的是哪个docker版本?@morxa docker 1.10.2我用脚本安装的,所以我认为这是最新的稳定版本,很有趣,现在我看到了同样的问题。你提交错误报告了吗?我完全同意你的期望;这看起来像个虫子。为什么首先要检查所有主机上的网络?在一台主机上做这件事还不够吗?@morxa在每台机器上我都有一份TestScript.sh
管理本地docker容器的副本,并将它们连接到适当的网络。如果网络不存在,脚本将只创建网络并将容器附加到网络。由于TestScript.sh
在本质上是完全分布式的,并且根据设计不能相互通信,因此主机A上的TestScript.sh不知道主机B上的TestScript.sh是否发出了create命令。因此,我必须依赖docker守护进程来同步我的网络创建命令。您使用的是哪个docker版本?@morxa docker 1.10.2我用脚本安装的,所以我认为这是最新的稳定版本,很有趣,现在我看到了同样的问题。你提交错误报告了吗?