docker-swarm 和 docker-compose 如何动态添加节点并让它们可以被服务解析

Posted

技术标签:

【中文标题】docker-swarm 和 docker-compose 如何动态添加节点并让它们可以被服务解析【英文标题】:docker-swarm and docker-compose how to dynamically add nodes and have them resolvable by the services 【发布时间】:2016-05-02 08:18:42 【问题描述】:

我一直在玩 docker-compose 并从 docker hub 网站拼凑出一个项目。

让我难以理解的一件事是如何扩展单个服务(通过添加更多实例)并让现有实例以某种方式了解这些新实例。

例如,规范的 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

总之,有没有更聪明的方法来做到这一点(解决和发现)?除了更新主机文件之外,还有其他更聪明的方法吗?这里的最佳做法是什么?

【问题讨论】:

你研究过 Kubernetes 吗?它会自动为您处理所有这些。 没有。我正在尝试完全使用基本 docker 功能来完成它,Kubernetes/Mesos 超出了范围。 您使用的是什么版本的 docker 和 docker-compose?你的docker-compose.yml 是以version 2 开头的吗? 是的,它是最新版本。 【参考方案1】:

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-swarm 和 docker-compose 如何动态添加节点并让它们可以被服务解析的主要内容,如果未能解决你的问题,请参考以下文章

docker-swarm初探

docker-swarm

sh 在数字海洋上运行docker-compose与docker-machine和docker-swarm

sh docker-swarm.sh

docker-swarm集群部署

docker-swarm