一、系統環境
1)服務器環境
節點名稱 | IP | 操作系統 | 內核版本 |
manager | 172.16.60.95 | CentOs7 | 4.16.1-1.el7.elrepo.x86_64 |
node-01 | 172.16.60.96 | CentOs7 | 4.16.1-1.el7.elrepo.x86_64 |
node-02 | 172.16.60.97 | CentOs7 | 4.16.1-1.el7.elrepo.x86_64 |
node-03 | 172.16.60.98 | CentOs7 | 4.16.1-1.el7.elrepo.x86_64 |
2)前提條件
- Docker版本1.12+
- 集群節點之間保證TCP 2377、TCP/UDP 7946和UDP 4789端口通信
TCP端口2377集群管理端口
TCP與UDP端口7946節點之間通訊端口
TCP與UDP端口4789 overlay網絡通訊端口
二、集群部署
1)master創建Swarm(要保存初始化后token,因為在節點加入時要使用token作為通訊的密鑰)
[root@master ~]# docker swarm init --advertise-addr 172.16.60.95 Swarm initialized: current node (kfi2r4dw6895z5yvhlbyzfck6) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw 172.16.60.95:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
注:上面命令執行后,該機器自動加入到swarm集群。這個會創建一個集群token,獲取全球唯一的 token,作為集群唯一標識。后續將其他節點加入集群都會用到這個token值。 其中,--advertise-addr參數表示其它swarm中的worker節點使用此ip地址與manager聯系。命令的輸出包含了其它節點如何加入集群的命令。
使用docker info 或者 docker node ls 查看集群中的相關信息
docker info ....... Swarm: active NodeID: kfi2r4dw6895z5yvhlbyzfck6 Is Manager: true ClusterID: y2zgs373cg0y6559t675yexcj Managers: 1 Nodes: 1 Orchestration: Task History Retention Limit: 5 .......
2)添加節點到swarm集群中
所有節點執行
docker swarm join --token SWMTKN-1-3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw 172.16.60.95:2377
在master上查看集群節點的狀態
到此Swarm集群就創建好了
3)docker node 命令

[root@master ~]# docker node --help Usage: docker node COMMAND Manage Swarm nodes Options: Commands: demote Demote one or more nodes from manager in the swarm inspect Display detailed information on one or more nodes ls List nodes in the swarm promote Promote one or more nodes to manager in the swarm ps List tasks running on one or more nodes, defaults to current node rm Remove one or more nodes from the swarm update Update a node # demote 將管理節點降級為普通節點 # inspect 查看節點的詳細信息 # ls 列出節點 # promote 將普通節點升級為管理節點 # ps 查看運行的任務 # rm 從swarm集群中刪除節點 # update 改變集群節點狀態

[root@master ~]# docker node update --help Usage: docker node update [OPTIONS] NODE Update a node Options: --availability string Availability of the node ("active"|"pause"|"drain") --label-add list Add or update a node label (key=value) --label-rm list Remove a node label if exists --role string Role of the node ("worker"|"manager") # 主要使用availability string # active 節點狀態正常 # pause 節點掛起、暫停 # drain 排除節點,比如將master節點排除,不分配任務,只作為管理節點
三、在Swarm中部署服務
1)創建服務

[root@master ~]# docker service --help Usage: docker service COMMAND Manage services Options: Commands: create Create a new service inspect Display detailed information on one or more services logs Fetch the logs of a service or task ls List services ps List the tasks of one or more services rm Remove one or more services rollback Revert changes to a service's configuration scale Scale one or multiple replicated service
[root@master ~]# docker service create --replicas 1 --name hello busybox # --replicas : 副本集個數 # --name:服務名稱
2)查看服務信息
[root@master ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS kosznwn4ombx hello replicated 0/1 busybox:latest
從REPLICAS中能看出這個 hello服務並沒有啟動起來,0/1 表示 1計划啟動的副本數,0實際啟動的數量。所以啟動失敗
3)添加參數
在hello服務中busybox只是一個基礎鏡像,並沒有一個持續運行的任務,所以manager會不斷重啟hello這個服務,所以有好多shutdown的記錄。但是可以為其添加一個任務。
[root@master ~]# docker service update --args "ping www.baidu.com" hello hello overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged # update:更新狀態 # --args:增加參數
再次查看狀態:
過濾不正常的狀態:
[root@master ~]# docker service ps -f "desired-state=running" hello ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS yxyivio4mzlg hello.1 busybox:latest master Running Running 4 minutes ago # -f "desired-state=running" : 狀態為runngin的服務
4)為服務擴容(縮融)scale
剛才設置的replicas=1,可以增加副本數量
[root@master ~]# docker service scale hello=4 hello scaled to 4 overall progress: 4 out of 4 tasks 1/4: running 2/4: running 3/4: running 4/4: running verify: Service converged # scale : 指定服務的數量
5)工作節點排除manager,manager只作為管理節點
上圖中manager也運行了一個服務,將manager排除在外
[root@manager ~]# docker node update --availability drain manager # node update : 更改節點狀態 # --availability : 三種狀態 active: 正常 pause:掛起 drain:排除
排除manager后,其上面運行的服務會轉移到其他節點
四、滾動更新服務
例如升級服務的鏡像版本
[root@manager ~]# docker service create \ > --replicas 3 \ > --name redis \ > --update-delay 10s \ > redis:3.0.6 # 啟動3個副本集的redis # update-delay 10s :每個容器依次更新,間隔10s
滾動更新:
docker service update --image redis:3.0.7 redis # --image : 指定版本
更新完成后新版本和歷史記錄都能查看
查看配置信息:
五、服務更新和回滾策略
1)設置策略
[root@manager ~]# docker service create \ --name my-web \ --replicas 10 \ --update-delay 10s \ --update-parallelism 2 \ --update-failure-action continue \ --rollback-parallelism 2 \ --rollback-monitor 20s \ --rollback-max-failure-ratio 0.2 \ nginx:1.12.1 # --update-parallelism 2 : 每次允許兩個服務一起更新 #--update-failure-action continue : 更新失敗后的動作是繼續 # --rollback-parallelism 2 : 回滾時允許兩個一起 # --rollback-monitor 20s :回滾監控時間20s # --rollback-max-failure-ratio 0.2 : 回滾失敗率20%
如果執行后查看狀態不是設置的,可以在update一下,將服務狀態設置為自己想要的
docker service update --rollback-monitor 20s my-web docker service update --rollback-max-failure-ratio 0.2 my-web # 有兩個地方設置數值沒有成功,手動設置
查看狀態:
2)服務更新
[root@manager ~]# docker service update --image nginx:1.13.5 my-web
和上述策略一致,兩兩更新
更新完成:
3)手動回滾(策略是失敗會回滾,現在沒有失敗)
剛才nginx版本已經是1.13.5了,現在將其還原到1.12.1
[root@manager ~]# docker service update --rollback my-web
手動回滾成功