如何在Docker Swarm和Docker Compose中动态添加节点并使服务可以解析它们

15
我一直在使用docker-compose,并从docker hub网站上拼凑了一个项目。但有一件事让我困惑,即如何扩展单个服务(通过添加更多实例),并使现有实例知道这些新实例的存在。
例如,经典的docker-compose示例包括以下集群:
- redis节点 - python (flask) 节点 - 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

总之,有没有更加智能的方法来解决这个问题(分辨率和发现)?还有其他比更新hosts文件更加智能的方法吗?在这里有什么最佳实践?


你有研究过 Kubernetes 吗?它可以自动处理所有这些事情。 - kichik
不,我正在尝试完全使用基本的Docker功能来完成它,Kubernetes/Mesos超出了范围。 - bryan hunt
你使用的 Docker 和 Docker Compose 版本是什么?你的 docker-compose.yml 文件是否以 version 2 开头? - VonC
是的,没错,这是最新版本。 - bryan hunt
1个回答

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

更多是产品请求,不是问题;-) - bryan hunt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接