“–cluster-store”和“–cluster-advertise”不起作用
我尝试build立与swarm
和consul
docker集群。 我有manager
, host1
和host1
。
我在经理swarm manager
运行consul
和swarm 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_1
和bootstrap_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/24
networking的端口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? 它可能会帮助你。