没有节点连接到docker swarm中的主机

时间:2016-07-05 22:01:03

标签: docker docker-swarm

我只是按照本教程一步一步地在EC2中设置一个泊坞群 - https://docs.docker.com/swarm/install-manual/

我使用Amazon Linux AMI创建了4个Amazon服务器。

  1. 经理+领事
  2. 经理
  3. 节点1
  4. node2
  5. 我按照说明启动了swarm,所有关于制作docker实例的一切似乎都没问题。

    服务器1

    正在运行docker ps

    enter image description here

    Consul日志显示此

    2016/07/05 20:18:47 [INFO] serf: EventMemberJoin: 729a440e5d0d 172.17.0.2
    2016/07/05 20:18:47 [INFO] serf: EventMemberJoin: 729a440e5d0d.dc1 172.17.0.2
    2016/07/05 20:18:48 [INFO] raft: Node at 172.17.0.2:8300 [Follower] entering Follower state
    2016/07/05 20:18:48 [INFO] consul: adding server 729a440e5d0d (Addr: 172.17.0.2:8300) (DC: dc1)
    2016/07/05 20:18:48 [INFO] consul: adding server 729a440e5d0d.dc1 (Addr: 172.17.0.2:8300) (DC: dc1)
    2016/07/05 20:18:48 [ERR] agent: failed to sync remote state: No cluster leader
    2016/07/05 20:18:49 [WARN] raft: Heartbeat timeout reached, starting election
    2016/07/05 20:18:49 [INFO] raft: Node at 172.17.0.2:8300 [Candidate] entering Candidate state
    2016/07/05 20:18:49 [INFO] raft: Election won. Tally: 1
    2016/07/05 20:18:49 [INFO] raft: Node at 172.17.0.2:8300 [Leader] entering Leader state
    2016/07/05 20:18:49 [INFO] consul: cluster leadership acquired
    2016/07/05 20:18:49 [INFO] consul: New leader elected: 729a440e5d0d
    2016/07/05 20:18:49 [INFO] raft: Disabling EnableSingleNode (bootstrap)
    2016/07/05 20:18:49 [INFO] consul: member '729a440e5d0d' joined, marking health alive
    2016/07/05 20:18:50 [INFO] agent: Synced service 'consul'
    

    我使用以下命令使用适当的IP

    注册了每个节点
    docker run -d swarm join --advertise=x-x-x-x:2375 consul://x-x-x-x:8500
    

    每个人都创建了一个泊坞窗实例

    节点1

    正在运行docker ps

    enter image description here

    使用日志表明存在问题:

    time="2016-07-05T21:33:50Z" level=info msg="Registering on the discovery service every 1m0s..." addr="172.31.17.35:2375" discovery="consul://172.31.3.233:8500" 
    time="2016-07-05T21:36:20Z" level=error msg="cannot set or renew session for ttl, unable to operate on sessions" 
    time="2016-07-05T21:37:20Z" level=info msg="Registering on the discovery service every 1m0s..." addr="172.31.17.35:2375" discovery="consul://172.31.3.233:8500" 
    time="2016-07-05T21:39:50Z" level=error msg="cannot set or renew session for ttl, unable to operate on sessions" 
    time="2016-07-05T21:40:50Z" level=info msg="Registering on the discovery service every 1m0s..." addr="172.31.17.35:2375" discovery="consul://172.31.3.233:8500" 
    ...
    

    最后当我到最后一步尝试在我的Consul机器上获取主机信息时,

    docker -H :4000 info
    

    我看不到任何节点。最后,当我尝试运行应用程序的步骤时,我得到了明显的错误:

    [ec2-user@ip-172-31-3-233 ~]$ docker -H :4000 run hello-world
    docker: Error response from daemon: No healthy node available in the cluster.
    See 'docker run --help'.
    [ec2-user@ip-172-31-3-233 ~]$ 
    

    感谢您对此有任何见解。我仍然对很多群模型感到困惑,不知道从哪里去诊断。

2 个答案:

答案 0 :(得分:0)

看起来Consul要么没有绑定到公共IP地址,要么由于安全组或VPC设置而无法在公共IP上访问。您正在Docker节点上将发现URL设置为consul://172.31.3.233:8500,因此我会尝试从外部IP连接到该地址,无论是在浏览器中还是通过curl,如下所示:

% curl http://172.31.3.233:8500/ui/dist/
HTML

如果您无法连接(连接被拒绝或超时),请将TCP端口8500入口规则添加到您的AWS VM,然后重试。

答案 1 :(得分:0)

在调查了您的问题之后,我发现您忘记了在所有四个节点中为Docker Engine打开端口2375.

在启动Swarm Manager或Swarm Node之前,您必须为Docker Engine打开TCP端口,因此Swarm将通过该端口与Docker Engine一起使用。

使用Ubuntu 14.04上的Docker,您可以通过更改文件/etc/default/docker打开端口,并将-H tcp://0.0.0.0:2375添加到DOCKER_OPTS。例如:

DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

之后,重启Docker Engine

service docker restart

如果您使用的是CentOS,解决方案是相同的,您可以阅读我的博客文章https://sonnguyen.ws/install-docker-docker-swarm-centos7/

另一方面,我认为您应该在所有节点(4台服务器)中安装和运行Consul。因此,您的Swarm可以在其节点上与Consul一起使用