我有一个由三个节点组成的群:
$ sudo docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
i12s3zxsn4vu1c98bv3i5idr8 node03 Ready Active
i2ckxvsju4tmommxim3dbfq7l node02 Ready Active
wak4isl46dn7pbo39drrhphju * node01 Ready Active Leader
然后我在该群上运行1个nginx副本,并将其端口映射到8080:
$ sudo docker service create --replicas 1 --publish 8080:80 --name nginx nginx
$ sudo docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
neahnb9mvi1i nginx replicated 1/1 nginx:latest *:8080->80/tcp
从那里,我可以在http://node01:8080
上找到nginx接下来,我将nginx实例扩展为6:
$ sudo docker service scale nginx=6
$ sudo docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
neahnb9mvi1i nginx replicated 6/6 nginx:latest *:8080->80/tcp
从那里开始,我仍然能够在http://node01:8080上找到nginx。
但是,如果docker swarm将多个节点作为唯一主机公开,那么在这样的扩展操作中,他如何管理端口,因为我的所有nginx服务都映射在同一个8080端口上?在内部群集完成并在8080上返回答案的所有服务实例之间是否存在循环负载平衡?
答案 0 :(得分:2)
我相信对主机的请求会以循环类型分配进行分配。
找到这篇方便的文章http://blog.scottlogic.com/2016/08/30/docker-1-12-swarm-mode-round-robin.html。查看标题为“ INGRESS AND ROUND ROBIN LOAD BALANCING ”的部分。
答案 1 :(得分:0)
您可以使用群集中的任何计算机的IP和该端口来访问任何暴露其端口的服务(使用堆栈部署)。 Docker swarm然后将该请求转发给其中一个副本。 哪个副本由运行状态决定(忽略不健康的服务)和配置的负载均衡选项,默认情况下是循环。