Docker Engine的swarm模式使得服务发布端口让服务在swarm外部可用变得容易。所以的节点都参与到routing mesh中,意味着任何的节点(即使该节点没有服务在运行)都可以作为入口,都能路由请求。
为了能在swarm中使用ingress网络,你需要在节点之间开放如下端口:
TCP/UDP端口7946 – 用来发现容器网络
UDP端口4789 – 容器ingress网络
当然你也必须在swarm节点之间和做任意外部资源(如外部负载均衡)之间开放published端口。
发布服务端口
在创建服务时使用–publish参数来发布一个端口:
- $ docker service create \
- --name <SERVICE-NAME> \
- --publish <PUBLISHED-PORT>:<TARGET-PORT> \
- <IMAGE>
是容器内监听的端口。是对外发布的端口,外部通过此端口能访问到容器内的应用程序。
例如,以下的命令是发布nginx容器内的80端口到swarm所有节点的8080端口:
- $ docker service create \
- --name my-web \
- --publish 8080:80 \
- --replicas 2 \
- nginx
当你访问任意节点的8080端口,swarm的负载均衡会把你的请求路由到一个任意节点的可用的容器上。routing mesh在swarm节点的所有IP上监听published端口。
你可以使用以下命令来为已存在的服务发布一个端口:
- $ docker service update \
- --publish-add <PUBLISHED-PORT>:<TARGET-PORT> \
- <SERVICE>
使用docker service inspect来查看服务的published端口。如:
- $ docker service inspect --format="" my-web
-
- [{"Protocol":"tcp","TargetPort":80,"PublishedPort":8080}]
发布一个TCP端口或UDP端口
默认情况下,以上发布的端口都是TCP端口。你可以指定发布一个UDP端口。当你TCP和UDP两个端口都发布时,Docker 1.12.2及更早版本要求你为TCP端口添加/tcp后缀。
只发布TCP端口
下面的两个命令是一样的。
- $ docker service create --name dns-cache -p 53:53 dns-cache
-
- $ docker service create --name dns-cache -p 53:53/tcp dns-cache
发布TCP和UDP端口
- $ docker service create --name dns-cache -p 53:53/tcp -p 53:53/udp dns-cache
只发布UDP端口
- $ docker service create --name dns-cache -p 53:53/udp dns-cache
配置一个外部负载均衡
你可以配置一个外部负载均衡来路由请求到swarm服务。例如,你可以配置HAProxy来路由请求到一个published端口为8080的nginx服务。
在这个示例中,在负载均衡和所有swarm节点之间需要开放8080端口。
你可以配置负载均衡负载请求到swarm的任何节点。例如HAProxy的配置文件/etc/haproxy/haproxy.cfg:
- global
- log /dev/log local0
- log /dev/log local1 notice
- ...snip...
-
- # Configure HAProxy to listen on port 80
- frontend http_front
- bind *:80
- stats uri /haproxy?stats
- default_backend http_back
-
- # Configure HAProxy to route requests to swarm nodes on port 8080
- backend http_back
- balance roundrobin
- server node1 192.168.99.100:8080 check
- server node2 192.168.99.101:8080 check
- server node3 192.168.99.102:8080 check
当你访问HAProxy负载均衡的80端口时,它会把你的请求转发到swarm节点。然后swarm节点的routing mesh把请求路由到一个可用的服务上。