2016-01-20 270 views
6

我尝试使用swarmconsul设置docker群集。我有manager,host1host2
我在管理器上运行consulswarm manager容器。“--cluster-store”和“--cluster-advertise”不起作用

$ 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时,它失败。

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" 
+0

我面临同样的问题。我遵循这个链接https://docs.docker.com/swarm/install-manual/ –

回答

0

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

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

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

你应该看看:how to create docker overlay network between multi hosts?它可以帮助你。

+0

我想尝试'键值服务器'模式。静态文件和“键值服务器”有什么不同? – firelyu

+0

作为您的指导,opt是'/ usr/bin/docker守护进程-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-advertise eth0:2375 - -cluster-store consul://127.0.0.1:8500'。为什么要设置'--cluster-store consul://127.0.0.1:8500'?我设置了'--cluster-store consul:// :8500',并且docker守护进程无法启动。 – firelyu

+0

'领事'分发。每个守护进程在本地通告给consul,并且consul master加入节点(因此也是docker守护进程)。我在本地设置它,所以如果网络中有任何缺陷,守护进程将不会受到它的影响。 它运作良好。 键值存储和静态文件的区别在于静态文件只需要一个文件。网络不用于代理发现,它是最安全,最简单和最快的,因为它不使用Swarm主文件中的任何文件。无需客户端/服务器或分布式应用程序。 – Auzias

3

因为我出现了类似的问题,最终我发现它为什么不起作用(在我的例子中,我在局域网上使用多个盒子,我想在那里管理并且只允许从外部向容器某些访问 - 下面的实施例在192.168.10.1盒上运行):

  • 设置守护程序用--cluster-store consul://192.168.10.1:8500和端口8500(在每个守护程序部署领事& 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那样绑定到其他可用地址,inst ead只绑定到本地192.168.10.0/24)。如果你希望容器只绑定到本地网络(就像我在这种情况下那样),你可以为守护进程指定额外的--ip参数 - 当容器应该可用于其他任何地方(在我的情况下只有一个nginx负载通过的keepalived故障,平衡器)指定的端口绑定到所有接口docker run ... -p 0.0.0.0:host_port:container_port ... <image>
  • 启动守护进程
  • 部署gliderlabs/registrator,并撰写领事(这是从我的设置:第一箱一个例子,但我开始等效在所有Daemons上进行完整Consul HA故障转移设置)docker-compose -p bootstrap up -d(在专用网络中命名容器bootstrap_registrator_1bootstrap_consul_1bootstrap):

    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-店(领事)锁和群不会自动似乎从这个位置看..所以当它试图读取该守护进程是可用它没有找到任何。 现在这个有点花了我最多时间: - 要使用docker-compose -p bootstrap up -d解决这个问题,我不得不指定--discovery-opt kv.path=docker/nodes并开始群上的所有箱子藏汉与管理者的群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 
    
  • 现在我结束了一个工作群是只有192.168.10.0/24网络端口3375已启动所有容器只适用于该网络上可用的藏汉除非我开始(与docker run

  • 进一步缩放时指定-p 0.0.0.0:host_port:container_port:当我在本地添加更多框网络来增加容量,我的想法是添加更多的守护进程,也许还有非管理者Swarm实例,以及后来的Consul客户端(而不是服务器,从-server开始)。