实验环境:
3台Centos7的虚拟机(1台管理端,2台工作端 )
各端的IP如下:
管理端:10.0.18.119
工作端1:10.0.18.120
工作端2:10.0.18.121
实验过程:
第一步,建立管理端
docker swarm init--advertise-addr 10.0.18.119
运行以上命令后会生成一段工作端用于加入的命令。
如:
docker swarm join --token SWMTKN-1-1qtym96ffwc9frdawv2d259jjyr1kwp0z8cw47x2qtq43rdczd-erd80po13jorac0hvlse44w2j 10.0.18.119:2377
其后要开通管理端的几个端口:(2377用于群集管理,7946用于节点之间的通迅,4789用于容器跨主机的通讯)
firewall-cmd --permanent --add-port=2377/tcp
firewall-cmd --permanent --add-port=7946/tcp
firewall-cmd --permanent --add-port=7946/udp
firewall-cmd --permanent --add-port=4789/udp
firewall-cmd --reload
查看节点的信息
docker info
可以在输出的信息中发现:Is Manager: True
第二步,将节点加入群集
在其中一个节点10.0.18.120上执行在第一步中生成的加入命令:
docker swarm join --token SWMTKN-1-1qtym96ffwc9frdawv2d259jjyr1kwp0z8cw47x2qtq43rdczd-erd80po13jorac0hvlse44w2j 10.0.18.119:2377
如果你因为某种原因错过了生成的命令串,可于管理端执行以下命令,再次生成:
docker swarm join-token worker
如果管理端的防火墙没有配置正确,可能会报以下错误:
Error response from daemon: rpc error: code = Unavailable desc = grpc: the connection is unavailable
第三步,在群集中部署一个服务
在管理端执行:
docker service create --replicas 1 --name helloworld alpine ping docker.com
说明:--replicas 1代理建立一个实例, alpine ping docker.com代表,在alpine中执行ping
以下命令可以,查看运行中的服务:
docker service ls
使用以下命令查看服务的详细属性:
docker service inspect --pretty helloworld
使用以下命令查看服务运行于哪些节点上:
docker service ps helloworld
也可以在运行的节点上直接查看运行中的容器:
docker ps
还可以增加服务的实例数量:(将实例数从1个变成5个)
docker service scale helloworld=5
调整实例数后,可以使用以下命令查看变化:
docker service ps helloworld
第四步,删除已部署的服务(和删除容器一样间单)
docker service rm helloworld
第五步,動態升級服務的容器版本
假設現有服務是redis:3.0.6
docker service create \
--replicas 3 \
--name redis \
--update -delay10s \
redis:3.0.6
現在將它升級為3.0.7
docker service update --image redis:3.0.7 redis
可以使用以下命令查看升级前后的服务详细信息:
docker service inspect --pretty redis
使用以下命令重启暂停中的实例容器:
docker service update redis
第六步,暂停恢复某些工作端接收服务的实例
暂停,drain
docker node update --availability drain worker1
恢复,active
docker node update --availability active worker1
第七步,群集中的网络与负载均衡
用一张图来说明群集中的网络:
注:图片来源于www.docker.com官网,只为举例说明。
使用内置的routing mesh功能创建nginx服务实例
docker service create \
--name my-web\
published=8080,target=80
nginx
注意:每个节点都要先开通防火墙的端口
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
routing mesh功能是指所有群集中的节点都会去监听发布的端口,此实例中是8080,并自动分配到运行中的服务实例。
如果服务的端口是TCP协议,则无须特别指明:
docker service create --name dns-cache \
--publishpublished=53, target=53 \
dns-cache
如果是UDP协议,则须指明协议:
docker service create--name dns-cache \
--publishpublished=53,target=53 \
--publishpublished=53,target=53,protocol=udp \
dns-cache
也可以不使用routing mesh功能,使到只有运行实例的节点才去监听服务端口,方法是采用host模式,即在端口定义后面加上mode=host :
docker service create--name dns-cache \
--publishpublished=53,target=53,protocol=udp,mode=host \
--modeglobal \
dns-cache
当然,也可以使用外置的负载均衡:
注:图片来源于www.docker.com官网,只为举例说明。
HAProxy的配置文件内容如下:
/etc/haproxy/haproxy.cfg
global
log /dev/log local0
log /dev/log local1 notice
...skip...
# 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
当使用外围的负载均衡时可以将--endpoint-mode设置成dnsrr,从而不使用内置的routing mesh功能