我尝试使用swarm
和consul
设置泊坞群集。我有manager
,host1
和host2
我在经理上运行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
修改了守护程序选项,然后重新启动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"
当我将host1和host2加入swarm时,它会失败。
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管理器日志中,它出错了。
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"
答案 0 :(得分:4)
由于我遇到了类似的问题,我最终也发现了为什么它不起作用(在我的例子中,我在局域网192.168.10.0/24
上使用多个盒子,我想要从那里进行管理,只允许从外部访问某些容器 - 以下示例在192.168.10.1
的框中运行:
--cluster-store consul://192.168.10.1:8500
和端口8500设置守护进程(在每个守护程序上部署Consul&registrator作为第一个容器)和--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
一样的其他可用地址,而只绑定到本地192.168.10.0/24)。 如果您希望容器仅绑定到本地网络(就像我在本例中所做的那样),您可以为守护程序指定其他--ip
参数 - 当容器应该可用于其他任何地方时以及(在我的情况下只有一个nginx负载均衡器通过keepalived进行故障转移)你指定将端口绑定到所有接口docker run ... -p 0.0.0.0:host_port:container_port ... <image>
使用compose部署gliderlabs / registrator和Consul(这是我设置中第一个框中的示例,但我在所有守护进程上启动等效的完整Consul HA故障转移设置)docker-compose -p bootstrap up -d
(命名为私有网络中的容器bootstrap_registrator_1
和bootstrap_consul_1
bootstrap
):
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商店(Consul)上的锁定,并且Swarm似乎不会自动从这个位置读取..所以当它试图读取哪些守护进程可用时它找不到任何东西。 现在这个花了我最多的时间:
要解决这个问题,我必须指定--discovery-opt kv.path=docker/nodes
并使用docker-compose -p bootstrap up -d
启动Swarm - 在所有框中以及最终管理员的Swarm 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
现在我最终得到了一个只在端口3375上的192.168.10.0/24
网络上可用的Swarm。所有启动的容器只有这个网络可用,除非我指定-p 0.0.0.0:host_port:container_port
何时开始(使用docker run
)
答案 1 :(得分:0)
您是否正在为多主机网络发现或Swarm代理发现运行consul?
您是否尝试检查consul members
?
为什么不运行docker daemon
将本地与consul
以及consul join
领事成员联系起来?有没有理由不这样做?
我还建议使用Swarm代理发现的静态文件方法。我知道最快,最简单,最安全的意思!
你应该看一下:how to create docker overlay network between multi hosts?它可能对你有帮助。
答案 2 :(得分:0)
请在/ var / run中删除“docker.pid”和“docker.sock”。接下来,重新启动主机并通过“sudo service docker restart”
重新启动服务docker祝你好运!!