Docker Swarm与Zookeeper – 没有select主要的集群pipe理器

我的任务是使用Zookeeper作为后端来构build一个生产就绪的Swarm集群。 为此,我使用了官方文档, https://docs.docker.com/swarm/install-manual/ 。 关于后端发现,我使用了这个: https : //docs.docker.com/swarm/discovery/ 。 现在我有一个问题。 当我尝试与群集通信时,我有这个错误:没有选举的主要群集pipe理器。

这是我的设置:

我运行在Docker Client / Server版本1.12.3的Ubuntu 16.04上,zookeeper 3.4.9和我的swarm manager在同一个主机上启动。 我正在使用一个swarm manager和swarm worker两个节点的体系结构

在每个节点上安装Docker Engine之后,

$ nohup docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock & 

现在在swarm经理身上:

 $ docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <swarm-manager-ip>:4000 zk://<swarm-manager-ip>/swarm 

在群工上:

 $ docker run -d swarm join --advertise=<swarm-worker-ip>:2375 zk://<swarm-manager-ip>/swarm 

现在当我试图看看是否一切正常时,我按下了命令,结果如下。

 $ docker -H <swarm-manager-ip>:4000 ps -a Error response from daemon: No elected primary cluster manager 

当我这样做时:

 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 91c3864ba6ee swarm "/swarm manage -H :40" 17 hours ago Up 19 minutes 2375/tcp, 0.0.0.0:4000->4000/tcp swarm-master 

我可以看到swarm master,当我尝试查看swarm节点的日志时,我可以看到:

 $ docker logs 91c3864ba6ee time="2016-12-09T20:29:39Z" level=info msg="Initializing discovery without TLS" time="2016-12-09T20:29:39Z" level=info msg="Listening for HTTP" addr=":4000" proto=tcp time="2016-12-09T20:29:39Z" level=info msg="Leader Election: Cluster leadership lost" 2016/12/09 20:29:40 Failed to connect to <swarm-manager-ip>:2181: dial tcp <swarm-manager-ip>:2181: i/o timeout time="2016-12-09T20:29:40Z" level=error msg="zk: could not connect to a server" time="2016-12-09T20:29:40Z" level=error msg="zk: could not connect to a server" time="2016-12-09T20:29:40Z" level=error msg="Discovery error: zk: could not connect to a server" 2016/12/09 20:29:42 Failed to connect to <swarm-manager-ip>:2181: dial tcp <swarm-manager-ip>:2181: i/o timeout time="2016-12-09T20:29:42Z" level=error msg="Discovery error: zk: could not connect to a server" 2016/12/09 20:29:44 Failed to connect to <swarm-manager-ip>:2181: dial tcp <swarm-manager-ip>:2181: i/o timeout time="2016-12-09T20:29:44Z" level=error msg="Discovery error: zk: could not connect to a server" time="2016-12-09T20:29:44Z" level=error msg="Discovery error: Unexpected watch error" 2016/12/09 20:29:46 Failed to connect to <swarm-manager-ip>:2181: dial tcp <swarm-manager-ip>:2181: i/o timeout 2016/12/09 20:29:48 Failed to connect to <swarm-manager-ip>:2181: dial tcp <swarm-manager-ip>:2181: i/o timeout time="2016-12-09T20:29:50Z" level=info msg="Leader Election: Cluster leadership lost" 2016/12/09 20:29:50 Failed to connect to <swarm-manager-ip>:2181: dial tcp <swarm-manager-ip>:2181: i/o timeout time="2016-12-09T20:29:50Z" level=error msg="zk: could not connect to a server" time="2016-12-09T20:29:50Z" level=error msg="zk: could not connect to a server" 

但是一个简单的telnet命令告诉我,我的zookeeper主机正在工作。 那么当群集尝试连接到zookeeper发现后端时,如何进行ai / o超时?

正如在评论中提到的那样,自1.12版本以来,有一个名为Swarm mode的新版本embedded了Docker。 它包含一个内置的高可用分布式对象存储,因此您不必自行设置外部KV存储。

现在关于你的Swarm第一版的问题,有一句话引起了我的注意:

 2016/12/09 20:29:50 Failed to connect to <swarm-manager-ip>:2181: dial tcp <swarm-manager-ip>:2181: i/o timeout 

对我来说,似乎zookeeper没有运行在你的机器上,或者你没有指向正确的端口。

首先检查zookeeper是否在你的机器上运行:

 ps aux | grep zookeeper 

你应该看到一个进程正在运行。

如果没有,请确保在zookeeper安装的conf目录中创build一个zoo.cfg文件,指定正确的端口,例如:

 tickTime=2000 dataDir=/var/zookeeper clientPort=2181 

你可以看看这个教程引导动物园pipe理员。

之后,您可以运行zkStart.sh脚本来启动您的zookeeper实例,swarm现在应该能够正确连接并注册Leader键。

如果这仍然不起作用,请尝试降级到zookeeper 3.4.6因为这是自从切换到Docker Swarm Mode以来最后一个已知的受支持版本。