1)服務器環境javascript
節點名稱 | 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)前提條件java
TCP端口2377集羣管理端口node
TCP與UDP端口7946節點之間通信端口python
TCP與UDP端口4789 overlay網絡通信端口nginx
1)master建立Swarm(要保存初始化後token,由於在節點加入時要使用token做爲通信的密鑰) web
[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聯繫。命令的輸出包含了其它節點如何加入集羣的命令。redis
使用docker info 或者 docker node ls 查看集羣中的相關信息 docker
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節點排除,不分配任務,只做爲管理節點
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
手動回滾成功