Docker swarm扩展端口映射行为

时间:2017-09-25 14:21:21

标签: docker swarm horizontal-scaling

我有一个由三个节点组成的群:

$ 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上返回答案的所有服务实例之间是否存在循环负载平衡?

2 个答案:

答案 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然后将该请求转发给其中一个副本。 哪个副本由运行状态决定(忽略不健康的服务)和配置的负载均衡选项,默认情况下是循环。