實驗環(huán)境:
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用于節(jié)點之間的通迅,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
查看節(jié)點的信息
docker info

docker node ls
查看當前群集中的節(jié)點數(shù)量
第二步,將節(jié)點加入群集
在其中一個節(jié)點10.0.18.120上執(zhí)行在第一步中生成的加入命令:
docker swarm join --token SWMTKN-1-1qtym96ffwc9frdawv2d259jjyr1kwp0z8cw47x2qtq43rdczd-erd80po13jorac0hvlse44w2j 10.0.18.119:2377
如果你因為某種原因錯過了生成的命令串,可于管理端執(zhí)行以下命令,再次生成:
docker swarm join-token worker
加入群集的執(zhí)行例子如下:

如果管理端的防火墻沒有配置正確,可能會報以下錯誤:
Error response from daemon: rpc error: code = Unavailable desc = grpc: the connection is unavailable
第三步,在群集中部署一個服務
在管理端執(zhí)行:
docker service create --replicas 1 --name helloworld alpine ping docker.com
說明:--replicas 1代理建立一個實例,?alpine ping docker.com代表,在alpine中執(zhí)行ping
以下命令可以,查看運行中的服務:
docker service ls
使用以下命令查看服務的詳細屬性:
docker service inspect --pretty helloworld
使用以下命令查看服務運行于哪些節(jié)點上:
docker service ps helloworld
也可以在運行的節(jié)點上直接查看運行中的容器:
docker ps
還可以增加服務的實例數(shù)量:(將實例數(shù)從1個變成5個)
docker service scale helloworld=5
調整實例數(shù)后,可以使用以下命令查看變化:
docker service ps helloworld
第四步,刪除已部署的服務(和刪除容器一樣間單)
docker service rm helloworld
第五步,動態(tài)升級服務的容器版本
假設現(xiàn)有服務是redis:3.0.6
docker service create \
--replicas 3 \
--name redis \
--update -delay10s \
redis:3.0.6
現(xiàn)在將它升級為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
第七步,群集中的網(wǎng)絡與負載均衡
用一張圖來說明群集中的網(wǎng)絡:

使用內置的routing mesh功能創(chuàng)建nginx服務實例
docker service create \
--name my-web\
published=8080,target=80?
nginx
注意:每個節(jié)點都要先開通防火墻的端口
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
routing mesh功能是指所有群集中的節(jié)點都會去監(jiān)聽發(fā)布的端口,此實例中是8080,并自動分配到運行中的服務實例。
如果服務的端口是TCP協(xié)議,則無須特別指明:
docker service create --name dns-cache \
--publishpublished=53, target=53 \
dns-cache
如果是UDP協(xié)議,則須指明協(xié)議:
docker service create--name dns-cache \
--publishpublished=53,target=53 \
--publishpublished=53,target=53,protocol=udp \
dns-cache
也可以不使用routing mesh功能,使到只有運行實例的節(jié)點才去監(jiān)聽服務端口,方法是采用host模式,即在端口定義后面加上mode=host?:
docker service create--name dns-cache \
--publishpublished=53,target=53,protocol=udp,mode=host \
--modeglobal \
dns-cache
當然,也可以使用外置的負載均衡:

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
當使用外圍的負載均衡時可以將--endpoint-mode設置成dnsrr,從而不使用內置的routing mesh功能