“–cluster-store”和“–cluster-advertise”不起作用

我尝试build立与swarmconsuldocker集群。 我有managerhost1host1
我在经理swarm manager运行consulswarm manager容器。

 $ docker run --rm -p 8500:8500 progrium/consul -server -bootstrap $ docker run -d -p 2377:2375 swarm manage consul://<manager>:8500 

在host1和host2上,我使用--cluster-store--cluster-advertise修改守护程序选项,然后重新启动--cluster-advertise docker daemon

 host1 DOCKER_OPTS="--cluster-store=consul://<manager>:8500 --cluster-advertise=<host1>:2375" host2 DOCKER_OPTS="--cluster-store=consul://<manager>:8500 --cluster-advertise=<host2>:2375" 

当我joinhost1和host2到群中时,它会失败。

 host1 $ docker run --rm swarm join --advertise=<host1>:2375 consul://<manager>:8500 host2 $ docker run --rm swarm join --advertise=<host2>:2375 consul://<manager>:8500 

从swarm manager日志中,它出错了。

 time="2016-01-20T02:17:17Z" level=error msg="Get http://<host1>:2375/v1.15/info: dial tcp <host1>:2375: getsockopt: connection refused" time="2016-01-20T02:17:20Z" level=error msg="Get http://<host2>:2375/v1.15/info: dial tcp <host2>:2375: getsockopt: connection refused" 

由于我出现了类似的问题,我终于发现为什么它不起作用(在我的例子中,我在局域网192.168.10.0/24上使用多个盒子,我想从那里pipe理,只允许从外部访问某些容器 – 下面的例子在192.168.10.1 )的框上运行:

  • 使用--cluster-store consul://192.168.10.1:8500--cluster-store consul://192.168.10.1:8500端口(在每个守护进程上部署领事和注册者作为第一个容器)设置守护进程,以及--cluster-advertise 192.168.10.1:2375-H tcp://192.168.10.1:2375 -H unix:///var/run/docker.sock -H tcp://127.0.0.1:2375 (但我不会像使用tcp://0.0.0.0:2375那样绑定到其他可用的地址tcp://0.0.0.0:2375 ,而只是绑定到本地192.168.10.0/24)。 如果你希望容器只绑定到本地networking (就像我在这种情况下那样),你可以为守护进程指定附加的--ip参数 – 当容器应该可用于其他任何地方(在我的情况下只有一个nginx负载通过keepalived进行故障转移的平衡器)指定将端口绑定到所有接口docker run ... -p 0.0.0.0:host_port:container_port ... <image>
  • 启动守护进程
  • 部署gliderlabs /注册者和Consul撰写(这是我的设置中的第一个框中的一个例子,但我启动所有守护进程相当于一个完整的Consul HA故障转移设置) docker-compose -p bootstrap up -d (命名容器bootstrap_registrator_1bootstrap_consul_1私有networkingbootstrap ):

     version: '2' services: registrator: image: gliderlabs/registrator command: consul://192.168.10.1:8500 depends_on: - consul volumes: - /var/run/docker.sock:/tmp/docker.sock restart: unless-stopped consul: image: consul command: agent -server -bootstrap -ui -advertise 192.168.10.1 -client 0.0.0.0 hostname: srv-0 network_mode: host ports: - "8300:8300" # Server RPC, Server Use Only - "8301:8301/tcp" # Serf Gossip Protocol for LAN - "8301:8301/udp" # Serf Gossip Protocol for LAN - "8302:8302/tcp" # Serf Gossip Protocol for WAN, Server Use Only - "8302:8302/udp" # Serf Gossip Protocol for WAN, Server Use Only - "8400:8400" # CLI RPC - "8500:8500" # HTTP API & Web UI - "53:8600/tcp" # DNS Interface - "53:8600/udp" # DNS Interface restart: unless-stopped 
  • 现在守护进程在docker/nodes的KV-store(Consul)上注册并设置锁,而Swarm不会自动地从这个位置读取。所以当它试图读取哪个守护进程可用时,它不会find任何。 现在,这一点花费了我最多的时间:为了解决这个问题,我必须指定--discovery-opt kv.path=docker/nodes并启动Swarm和--discovery-opt kv.path=docker/nodes docker-compose -p bootstrap up -d -pipe理人员的群集HA故障转移:

     version: '2' services: swarm-manager: image: swarm command: manage -H :3375 --replication --advertise 192.168.10.1:3375 --discovery-opt kv.path=docker/nodes consul://192.168.10.1:8500 hostname: srv-0 ports: - "192.168.10.1:3375:3375" # restart: unless-stopped 
  • 现在我得到一个工作的Swarm,它只在192.168.10.0/24networking的端口3375上可用。所有启动的容器只能在这个networking上使用,除非我在启动时指定-p 0.0.0.0:host_port:container_port (与docker run

  • 进一步扩展:当我添加更多的盒子到本地networking来增加容量时,我的想法是添加更多的守护进程,也许还有非pipe理者Swarm实例,以及后来的Consul客户端(而不是服务器,以-server启动)。

您是否正在为多主机联网发现或Swarm代理发现运行领事?

你是否试图检查consul members ? 你为什么不运行docker daemon连接本地consul ,然后consul join领事成员? 有没有理由不这样做?

我还build议Swarm代理发现的静态文件方法。 我知道最快,最简单,最安全的!

你应该看看: 如何在多主机之间创builddocker覆盖networking? 它可能会帮助你。