docker 實踐(十一)docker swarm
一、docker swarm部署
部署架構圖:
1.1.docker swarm初始化
1.1.docker swarm-manager初始化
[[email protected] ~]# docker swarm init --advertise-addr 192.168.2.120 Swarm initialized: current node (shyex5019e84dup8kjwgy9esj) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-2nioyk01u61y4xju7z13ngr70zglt5w0hj2bpfnn9l7d3lso34-c45yo9ivt30qmai0lp3zyb3ks 192.168.2.120:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
1.1.2.docker manager檢視節點
[[email protected] ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION shyex5019e84dup8kjwgy9esj * docker-2-120 Ready Active Leader 18.09.0
#暫時只有管理節點
1.2.新增work節點
1.2.1.在dm1上執行:
[[email protected] /]# docker swarm join --token SWMTKN-1-2nioyk01u61y4xju7z13ngr70zglt5w0hj2bpfnn9l7d3lso34-c45yo9ivt30qmai0lp3zyb3ks 192.168.2.120:2377 This node joined a swarm as a worker.
1.2.2.在dm2上執行:
[[email protected] ~]# docker swarm join --token SWMTKN-1-2nioyk01u61y4xju7z13ngr70zglt5w0hj2bpfnn9l7d3lso34-c45yo9ivt30qmai0lp3zyb3ks 192.168.2.120:2377 This node joined a swarm as a worker.
1.2.3.在manger節點上檢視:
[[email protected] ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 32ak19ny1nib5woq9wfij5cz4 dm1 Ready Active 18.09.0 jhf5lcacfdun78t4tie3dt0zy dm2 Ready Active 18.09.0 shyex5019e84dup8kjwgy9esj * docker-2-120 Ready Active Leader 18.09.0
二、部署service
2.1.在manager上執行nginx映象的service
[[email protected] ~]# docker service create --name "ckl_web" nginx
2.1.1.檢視service
[[email protected] ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS v3ifjb3k2yye ckl_web replicated 1/1 nginx:latest
#ID:serviceID
#NAME :名稱
#REPLICAS :當前的副本數量
#IMAGE :映象名詞
#PORTS:埠
2.1.2.檢視副本狀態
[[email protected] ~]# docker service ps ckl_web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cb1cv5dgqfrh ckl_web.1 nginx:latest docker-2-120 Running Running 59 seconds ago
檢視容器執行:
[[email protected] ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES acb5a7377b4f nginx:latest "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp ckl_web.1.cb1cv5dgqfrhrt2bdpk8elzhw
2.2.提升副本,模擬負載均衡
2.2.1.在manager上執行
[[email protected] ~]# docker service scale ckl_web=6 ckl_web scaled to 6 overall progress: 6 out of 6 tasks 1/6: running [==================================================>] 2/6: running [==================================================>] 3/6: running [==================================================>] 4/6: running [==================================================>] 5/6: running [==================================================>] 6/6: running [==================================================>] verify: Service converged
2.2.2.檢視擴充套件後副本資訊
[[email protected] ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS v3ifjb3k2yye ckl_web replicated 6/6 nginx:latest
檢視容器執行節點:
[[email protected] ~]# docker service ps ckl_web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cb1cv5dgqfrh ckl_web.1 nginx:latest docker-2-120 Running Running 7 minutes ago wbx0wbr9w8tq ckl_web.2 nginx:latest dm1 Running Running about a minute ago mviu588mulo2 ckl_web.3 nginx:latest dm2 Running Running about a minute ago ltnuyjpbj4eo ckl_web.4 nginx:latest dm2 Running Running about a minute ago lil6pq81fnaa ckl_web.5 nginx:latest docker-2-120 Running Running about a minute ago ap36bx8k6y65 ckl_web.6 nginx:latest dm1 Running Running about a minute ago
#目前正好均勻的執行在三個節點上,每個節點2個容器執行
2.2.3.如果只希望容器執行在worker節點
[[email protected] ~]# docker node update --availability drain docker-2-120 docker-2-120
2.2.4.檢視node節點狀態
[[email protected] ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 32ak19ny1nib5woq9wfij5cz4 dm1 Ready Active 18.09.0 jhf5lcacfdun78t4tie3dt0zy dm2 Ready Active 18.09.0 shyex5019e84dup8kjwgy9esj * docker-2-120 Ready Drain Leader 18.09.0
2.2.5.檢視service執行
[[email protected] ~]# docker service ps ckl_web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS q5d9hbtzfszp ckl_web.1 nginx:latest dm1 Running Running 2 minutes ago cb1cv5dgqfrh \_ ckl_web.1 nginx:latest docker-2-120 Shutdown Shutdown 2 minutes ago wbx0wbr9w8tq ckl_web.2 nginx:latest dm1 Running Running 9 minutes ago mviu588mulo2 ckl_web.3 nginx:latest dm2 Running Running 9 minutes ago ltnuyjpbj4eo ckl_web.4 nginx:latest dm2 Running Running 9 minutes ago ij9dt6fjjmhy ckl_web.5 nginx:latest dm2 Running Running 2 minutes ago lil6pq81fnaa \_ ckl_web.5 nginx:latest docker-2-120 Shutdown Shutdown 2 minutes ago ap36bx8k6y65 ckl_web.6 nginx:latest dm1 Running Running 9 minutes ago
#原來manager節點執行的容器已經被分攤到dm1和dm2上了
2.3.減少副本
2.3.1.減少副本數
[[email protected] ~]# docker service scale ckl_web=4 ckl_web scaled to 4 overall progress: 4 out of 4 tasks 1/4: running [==================================================>] 2/4: 3/4: running [==================================================>] 4/4: running [==================================================>] verify: Service converged
2.3.2.檢視service
[[email protected] ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS v3ifjb3k2yye ckl_web replicated 4/4 nginx:latest
#副本數為4
2.3.3.檢視容器執行節點
[[email protected] ~]# docker service ps ckl_web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS q5d9hbtzfszp ckl_web.1 nginx:latest dm1 Running Running 7 minutes ago cb1cv5dgqfrh \_ ckl_web.1 nginx:latest docker-2-120 Shutdown Shutdown 7 minutes ago wbx0wbr9w8tq ckl_web.2 nginx:latest dm1 Running Running 14 minutes ago mviu588mulo2 ckl_web.3 nginx:latest dm2 Running Running 14 minutes ago ltnuyjpbj4eo ckl_web.4 nginx:latest dm2 Running Running 14 minutes ago lil6pq81fnaa ckl_web.5 nginx:latest docker-2-120 Shutdown Shutdown 7 minutes ago
三、故障轉移
swarm內建failover策略可以實現故障轉移
模擬dm1宕機
3.1.檢視node節點狀態
[[email protected] ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 32ak19ny1nib5woq9wfij5cz4 dm1 Down Active 18.09.0 jhf5lcacfdun78t4tie3dt0zy dm2 Ready Active 18.09.0 shyex5019e84dup8kjwgy9esj * docker-2-120 Ready Drain Leader 18.09.0 #dm1階段狀態為down
3.2.檢視service狀態
[[email protected] ~]# docker service ps ckl_web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS rs3ntbl74en3 ckl_web.1 nginx:latest dm2 Running Running 2 minutes ago q5d9hbtzfszp \_ ckl_web.1 nginx:latest dm1 Shutdown Running 25 minutes ago cb1cv5dgqfrh \_ ckl_web.1 nginx:latest docker-2-120 Shutdown Shutdown 25 minutes ago kwctm7bg4jha ckl_web.2 nginx:latest dm2 Running Running 2 minutes ago wbx0wbr9w8tq \_ ckl_web.2 nginx:latest dm1 Shutdown Running 33 minutes ago mviu588mulo2 ckl_web.3 nginx:latest dm2 Running Running 32 minutes ago ltnuyjpbj4eo ckl_web.4 nginx:latest dm2 Running Running 32 minutes ago lil6pq81fnaa ckl_web.5 nginx:latest docker-2-120 Shutdown Shutdown 25 minutes ago
#執行在dm1上的容器,已都轉移到dm2上了,故障節點狀態是shutdown
四、訪問docker service
4.1.在manager上部署service
[[email protected] ~]# docker service create --name "ckl_nginx" --replicas=2 nginx
4.2.service執行節點
[[email protected] ~]# docker service ps ckl_nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS p28o2lobduog ckl_nginx.1 nginx:latest dm2 Running Running 29 seconds ago 38yanzwce36u ckl_nginx.2 nginx:latest dm1 Running Running 28 seconds ago
4.3.在dm1檢視容器
[[email protected] ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6a835035f35f nginx:latest "nginx -g 'daemon of…" 51 seconds ago Up 49 seconds 80/tcp ckl_nginx.2.38yanzwce36uf007j0okvctus
檢視容器並訪問:
[[email protected] ~]# curl http://10.8.95.2 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
4.4.埠對映,外網訪問service
[[email protected] ~]# docker service update --publish-add 8000:80 ckl_nginx
檢視service狀態:
[[email protected] ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS ggjfmz39jzj7 ckl_nginx replicated 2/2 nginx:latest *:8000->80/tcp
[[email protected] ~]# docker service ps ckl_nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS r84wybzu2zez ckl_nginx.1 nginx:latest dm2 Running Running 27 seconds ago p28o2lobduog \_ ckl_nginx.1 nginx:latest dm2 Shutdown Shutdown 29 seconds ago t5xln1zllf3i ckl_nginx.2 nginx:latest dm1 Running Running 30 seconds ago 38yanzwce36u \_ ckl_nginx.2 nginx:latest dm1 Shutdown Shutdown 32 seconds ago
外網訪問:
檢視docker網路:
[[email protected] ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 9a316505e6c8 bridge bridge local bf0464ee4b94 ckl_net bridge local 33a5e13e7f47 ckl_net1 bridge local aed4e7c4891e host host local 43z63iliw2ok ingress overlay swarm #swarm建立的overlay網路 cf895048ef39 none null local
五、service 之間通訊
5.1.建立overlay網路
[[email protected] ~]# docker network create --driver overlay ckl_ov p6qmkf3jlbgescuwurwalu5me
[[email protected] ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 9a316505e6c8 bridge bridge local bf0464ee4b94 ckl_net bridge local 33a5e13e7f47 ckl_net1 bridge local p6qmkf3jlbge ckl_ov overlay swarm #建立的新網路 aed4e7c4891e host host local 43z63iliw2ok ingress overlay swarm cf895048ef39 none null local
5.2.建立web service
[[email protected] ~]# docker service create --name "ckl_web" --replicas=3 --network ckl_ov nginx anlm52hs5p12efn5wras7h65v
[[email protected] ~]# docker service ps ckl_web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS tiqpv81m6icb ckl_web.1 nginx:latest dm2 Running Running about a minute ago tl3i10w296kk ckl_web.2 nginx:latest dm1 Running Running about a minute ago zdxxqy8zwnvt ckl_web.3 nginx:latest dm2 Running Running about a minute ago
5.3.建立centos service
[[email protected] ~]# docker service create --name "ckl_cent" --network ckl_ov centos sleep 10000 xut1xxmsp42mw4thixvd4iqt2 #兩個service屬於同一overlay網路
檢視service狀態:
[[email protected] ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS xut1xxmsp42m ckl_cent replicated 1/1 centos:latest anlm52hs5p12 ckl_web replicated 3/3 nginx:latest
[[email protected] ~]# docker service ps ckl_cent ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS fzs6ejkhangm ckl_cent.1 centos:latest dm1 Running Running 59 seconds ago
5.4.在dm1上測試連通
[[email protected] ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 710f6b55400d centos:latest "sleep 10000" About a minute ago Up About a minute ckl_cent.1.fzs6ejkhangm3r0eh8v46zljx 5f0c2ba01f88 nginx:latest "nginx -g 'daemon of…" About an hour ago Up About an hour 80/tcp ckl_web.2.tl3i10w296kks0qnh0ri8i0i4
[[email protected] ~]# docker exec -it 710f6b55400d /bin/bash [[email protected] /]# [[email protected] /]# [[email protected] /]# ping -c3 ckl_web PING ckl_web (10.0.0.2) 56(84) bytes of data. 64 bytes from 10.0.0.2 (10.0.0.2): icmp_seq=1 ttl=64 time=0.122 ms 64 bytes from 10.0.0.2 (10.0.0.2): icmp_seq=2 ttl=64 time=0.168 ms 64 bytes from 10.0.0.2 (10.0.0.2): icmp_seq=3 ttl=64 time=0.120 ms --- ckl_web ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 0.120/0.136/0.168/0.025 ms
#10.0.0.2是service 的VIP
在dm1上檢視ip:
[[email protected] ~]# docker inspect 5f0c2ba01f88 | grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "", "IPAddress": "10.0.0.4",
在dm2上檢視ip:
[[email protected] ~]# docker inspect `docker ps | grep ckl_web | awk '{print $1}'` | grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "", "IPAddress": "10.0.0.5", "SecondaryIPAddresses": null, "IPAddress": "", "IPAddress": "10.0.0.3",
#對於ckl_cent只需要知道webservice 的名詞就可以訪問,而不需要知道serviceip
六、swarm 升級副本
6.1.檢視當前服務
[[email protected] ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS xut1xxmsp42m ckl_cent replicated 1/1 centos:latest anlm52hs5p12 ckl_web replicated 3/3 nginx:latest
[[email protected] ~]# docker service ps ckl_web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS tiqpv81m6icb ckl_web.1 nginx:latest dm2 &n