Serf节点需要使用可路由地址“宣布”自己。在你的情况下,他们互相告诉:'嗨,我是localhost:...',所以每个人都试图回答localhost,这是错误的,因为每个容器都有自己的localhost。
可以选择配置代理以使用 eth0 ip向网络中的其他节点做广告: -iface 。然后你需要丢弃 -bind 选项。这些端口是默认的,因此无需自定义。
eth0
-iface
-bind
所以,对于node1:
serf agent -node=Node1 -iface=eth0
对于node2:
serf agent -node=Node2 -join=172.17.0.2 -iface=eth0
从 文档 :
-iface - 此标志可用于提供绑定接口。如果接口已知但不是地址,则可以使用它来代替-bind。
它适合我:
节点1:
==> Log data will now stream in as it occurs: 2017/06/04 01:56:40 [INFO] agent: Serf agent starting 2017/06/04 01:56:40 [INFO] serf: EventMemberJoin: Node1 172.17.0.2 2017/06/04 01:56:41 [INFO] agent: Received event: member-join 2017/06/04 01:57:02 [INFO] serf: EventMemberJoin: Node2 172.17.0.3 2017/06/04 01:57:03 [INFO] agent: Received event: member-join
节点2:
==> Log data will now stream in as it occurs: 2017/06/04 01:57:02 [INFO] agent: Serf agent starting 2017/06/04 01:57:02 [INFO] serf: EventMemberJoin: Node2 172.17.0.3 2017/06/04 01:57:02 [INFO] agent: joining: [172.17.0.2] replay: false 2017/06/04 01:57:02 [INFO] serf: EventMemberJoin: Node1 172.17.0.2 2017/06/04 01:57:02 [INFO] agent: joined: 1 nodes 2017/06/04 01:57:03 [INFO] agent: Received event: member-join
的 编辑: 强>
如果每个容器都在自己的VM(EC2实例)中,因为每个实例都有自己的docker网络而没有互连,您必须提供EC2实例IP并公开相应的端口。使用 -advertise
-advertise
-advertise - 广告标志用于更改我们通告给群集中其他节点的地址。
serf agent -node=Node1 -iface=eth0 -advertise=INSTANCE_IP
serf agent -node=Node2 -join=NODE1_INSTANCE_IP -iface=eth0
记住 的 暴露 强> 中国的农奴港 docker run
docker run
docker run -p 7946:7946 (...rest of the command...)