docker-swarm 和 docker-compose 如何动态添加节点并让它们可由服务解析
docker-swarm and docker-compose how to dynamically add nodes and have them resolvable by the services
我一直在玩 docker-compose
并从 docker 中心网站拼凑了一个项目。
我无法理解的一件事是我如何扩展单个服务(通过添加更多实例)并让现有实例以某种方式知道这些新实例。
例如,规范的 docker-compose
示例包含以下集群:
- redis 节点
- python(烧瓶)节点
- haproxy 负载均衡器
我创建了集群并且一切正常,但是我尝试向集群添加另一个节点:
$ docker-compose scale web=2
Creating and starting 2 ... done
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e83f6ed94546 packetops/web:latest "/bin/sh -c 'python /" 6 minutes ago Up About a minute 80/tcp swarm-slave/1_web_2
40e01a615a2f tutum/haproxy "python /haproxy/main" 7 minutes ago Up About a minute 443/tcp, 1936/tcp, 172.16.186.165:80->80/tcp swarm-slave/1_lb_1
f16357a28ac4 packetops/web:latest "/bin/sh -c 'python /" 7 minutes ago Up About a minute 80/tcp swarm-slave/1_lb_1/1_web_1,swarm-slave/1_lb_1/web,swarm-slave/1_lb_1/web_1,swarm-slave/1_web_1
8dd59686e7be redis "/entrypoint.sh redis" 8 minutes ago Up About a minute 6379/tcp swarm-slave/1_redis_1,swarm-slave/1_web_1/1_redis_1,swarm-slave/1_web_1/redis,swarm-slave/1_web_1/redis_1,swarm-slave/1_web_2/1_redis_1,swarm-slave/1_web_2/redis,swarm-slave/1_web_2/redis_1
有效...但是让我们看看 haproxy 节点对集群的看法(docker-machine
修改了“/etc/hosts”文件)
# docker exec -i -t swarm-slave/1_lb_1 /bin/bash -c 'cat /etc/hosts'
172.17.0.4 40e01a615a2f
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 1_web_1 f16357a28ac4
172.17.0.3 web f16357a28ac4 1_web_1
172.17.0.3 web_1 f16357a28ac4 1_web_1
如果我使用 docker-compose
重新启动整个集群,该节点应该 /etc/hosts
已填充,但它现在似乎已进一步损坏:
$ docker-compose up --force-recreate -d
Recreating 1_redis_1
Recreating 1_web_2
Recreating 1_web_1
Recreating 1_lb_1
ERROR: Unable to find a node fulfilling all dependencies: --link=1_web_1:1_web_1 --link=1_web_1:web --link=1_web_1:web_1 --link=1_web_2:1_web_2 --link=1_web_2:web --link=1_web_2:web_2
$ docker-compose up -d
1_redis_1 is up-to-date
1_web_1 is up-to-date
1_web_2 is up-to-date
Starting 40e01a615a_1_lb_1
$ docker exec -i -t swarm-slave/40e01a615a_1_lb_1 /bin/bash -c 'cat /etc/hosts'
172.17.0.4 40e01a615a2f
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
所以总而言之,有没有更聪明的方法来做到这一点(解决和发现)?除了更新主机文件之外,还有另一种更聪明的方法吗?这里的最佳做法是什么?
Docker 刚刚发布了一个内置编排的新版本:
https://blog.docker.com/2016/06/docker-1-12-built-in-orchestration/
您可以启动一个新的 Swarm 集群:
docker swarm init
并创建服务:
docker service create –name frontend –replicas 5 -p 80:80/tcp nginx:latest
创建的服务将进行负载平衡,您可以对其进行扩展和缩减:
docker service scale frontend=X
我一直在玩 docker-compose
并从 docker 中心网站拼凑了一个项目。
我无法理解的一件事是我如何扩展单个服务(通过添加更多实例)并让现有实例以某种方式知道这些新实例。
例如,规范的 docker-compose
示例包含以下集群:
- redis 节点
- python(烧瓶)节点
- haproxy 负载均衡器
我创建了集群并且一切正常,但是我尝试向集群添加另一个节点:
$ docker-compose scale web=2
Creating and starting 2 ... done
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e83f6ed94546 packetops/web:latest "/bin/sh -c 'python /" 6 minutes ago Up About a minute 80/tcp swarm-slave/1_web_2
40e01a615a2f tutum/haproxy "python /haproxy/main" 7 minutes ago Up About a minute 443/tcp, 1936/tcp, 172.16.186.165:80->80/tcp swarm-slave/1_lb_1
f16357a28ac4 packetops/web:latest "/bin/sh -c 'python /" 7 minutes ago Up About a minute 80/tcp swarm-slave/1_lb_1/1_web_1,swarm-slave/1_lb_1/web,swarm-slave/1_lb_1/web_1,swarm-slave/1_web_1
8dd59686e7be redis "/entrypoint.sh redis" 8 minutes ago Up About a minute 6379/tcp swarm-slave/1_redis_1,swarm-slave/1_web_1/1_redis_1,swarm-slave/1_web_1/redis,swarm-slave/1_web_1/redis_1,swarm-slave/1_web_2/1_redis_1,swarm-slave/1_web_2/redis,swarm-slave/1_web_2/redis_1
有效...但是让我们看看 haproxy 节点对集群的看法(docker-machine
修改了“/etc/hosts”文件)
# docker exec -i -t swarm-slave/1_lb_1 /bin/bash -c 'cat /etc/hosts'
172.17.0.4 40e01a615a2f
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 1_web_1 f16357a28ac4
172.17.0.3 web f16357a28ac4 1_web_1
172.17.0.3 web_1 f16357a28ac4 1_web_1
如果我使用 docker-compose
重新启动整个集群,该节点应该 /etc/hosts
已填充,但它现在似乎已进一步损坏:
$ docker-compose up --force-recreate -d
Recreating 1_redis_1
Recreating 1_web_2
Recreating 1_web_1
Recreating 1_lb_1
ERROR: Unable to find a node fulfilling all dependencies: --link=1_web_1:1_web_1 --link=1_web_1:web --link=1_web_1:web_1 --link=1_web_2:1_web_2 --link=1_web_2:web --link=1_web_2:web_2
$ docker-compose up -d
1_redis_1 is up-to-date
1_web_1 is up-to-date
1_web_2 is up-to-date
Starting 40e01a615a_1_lb_1
$ docker exec -i -t swarm-slave/40e01a615a_1_lb_1 /bin/bash -c 'cat /etc/hosts'
172.17.0.4 40e01a615a2f
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
所以总而言之,有没有更聪明的方法来做到这一点(解决和发现)?除了更新主机文件之外,还有另一种更聪明的方法吗?这里的最佳做法是什么?
Docker 刚刚发布了一个内置编排的新版本:
https://blog.docker.com/2016/06/docker-1-12-built-in-orchestration/
您可以启动一个新的 Swarm 集群:
docker swarm init
并创建服务:
docker service create –name frontend –replicas 5 -p 80:80/tcp nginx:latest
创建的服务将进行负载平衡,您可以对其进行扩展和缩减:
docker service scale frontend=X