" - 集群商店"和" - 集群广告"不工作

时间:2016-01-20 05:43:59

标签: docker

我尝试使用swarmconsul设置泊坞群集。我有managerhost1host2 我在经理上运行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修改了守护程序选项,然后重新启动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"

3 个答案:

答案 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_1bootstrap_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

  • 进一步扩展:当我向本地网络添加更多盒子以增加容量时,我的想法是添加更多Daemons和非管理器Swarm实例以及稍后的Consul客户端(而不是服务器,以{{开头) 1}})。

答案 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

祝你好运!!