以前介紹了Docker管理工具-Swarm部署記錄,這裏簡單總結下Docker Swarm的平常維護命令,以做爲平時運維筆記.html
Swarm做爲一個管理Docker集羣的工具,首先須要將其部署起來,能夠單獨將Swarm部署於一個節點。另外,天然須要一個Docker集羣,集羣上每個節點均安裝有Docker。具體的Swarm架構圖能夠參照下圖:node
Swarm架構中最主要的處理部分天然是Swarm節點,Swarm管理的對象天然是Docker Cluster,Docker Cluster由多個Docker Node組成,而負責給Swarm發送請求的是Docker Client。Swarm架構圖可讓你們對Swarm有一個初步的認識,好比Swarm的具體工做流程:Docker Client發送請求給Swarm;Swarm處理請求併發送至相應的Docker Node;Docker Node執行相應的操做並返回響應。除此以外,Swarm的工做原理依然還不夠明瞭。深刻理解Swarm的工做原理,能夠先從Swarm提供的命令入手。Swarm支持的命令主要有4個:swarm create、swarm manage、swarm join、swarm list。固然還有一個swarm help命令,該命令用於指導你們如何正確使用swarm命令.mysql
swarm create
Swarm中swarm create命令用於建立一個集羣標誌,用於Swarm管理Docker集羣時,Docker Node的節點發現功能。發起該命令以後,Swarm會前往Docker Hub上內建的發現服務中獲取一個全球惟一的token,用以惟一的標識Swarm管理的Docker集羣。nginx
swarm manage
Swarm中swarm manage是最爲重要的管理命令。一旦swarm manage命令在Swarm節點上被觸發,則說明用戶須要swarm開始管理Docker集羣。從運行流程的角度來說,swarm經歷的階段主要有兩點:啓動swarm、接收並處理Docker集羣管理請求。web
Swarm啓動的過程包含三個步驟:
► 發現Docker集羣中的各個節點,收集節點狀態、角色信息,並監視節點狀態的變化;
► 初始化內部調度(scheduler)模塊;
► 建立並啓動API監聽服務模塊;redis
第一個步驟,Swarm發現Docker集羣中的節點。發現(discovery)是Swarm中用於維護Docker集羣狀態的機制。既然涉及到發現(discovery),那在這以前必須先有註冊(register)。Swarm中有專門負責發現(discovery)的模塊,而關於註冊(register)部分,不一樣的discovery模式下,註冊(register)也會有不一樣的形式。sql
目前,Swarm中提供了5種不一樣的發現(discovery)機制:Node Discovery、File Discovery、Consul Discovery、EtcD Discovery和Zookeeper Discovery。docker
第二個步驟,Swarm內部的調度(scheduler)模塊被初始化。swarm經過發現機制發現全部註冊的Docker Node,並收集到全部Docker Node的狀態以及具體信息。此後,一旦Swarm接收到具體的Docker管理請求,Swarm須要對請求進行處理,並經過全部Docker Node的狀態以及具體信息,來篩選(filter)決策到底哪些Docker Node知足要求,並經過必定的策略(strategy)將請求轉發至具體的一個Docker Node。tomcat
第三個步驟,Swarm建立並初始化API監聽服務模塊。從功能的角度來說,能夠將該模塊抽象爲Swarm Server。須要說明的是:雖然Swarm Server徹底兼容Docker的API,可是有很多Docker的命令目前是不支持的,畢竟管理Docker集羣與管理單獨的Docker會有一些區別。當Swarm Server被初始化並完成監聽以後,用戶便可以經過Docker Client向Swarm發送Docker集羣的管理請求。bash
Swarm的swarm manage接收並處理Docker集羣的管理請求,便是Swarm內部多個模塊協同合做的結果。請求入口爲Swarm Server,處理引擎爲Scheduler,節點信息依靠Disocovery。
swarm join
Swarm的swarm join命令用於將Docker Node添加至Swarm管理的Docker集羣中。從這點也能夠看出swarm join命令的執行位於Docker Node,所以在Docker Node上運行該命令,首先須要在Docker Node上安裝Swarm,因爲該Swarm只會執行swarm join命令,故能夠將其當成Docker Node上用於註冊的agent模塊。
功能而言,swarm join能夠認爲是完成Docker Node在Swarm節點處的註冊(register)工做,以便Swarm在執行swarm manage時能夠發現該Docker Node。然而,上文說起的5種discovery模式中,並不是每種模式都支持swarm join命令。不支持的discovery的模式有Node Discovery與File Discovery。
Docker Node上swarm join執行以後,標誌着Docker Node向Swarm註冊,請求加入Swarm管理的Docker集羣中。Swarm經過註冊信息,發現Docker Node,並獲取Docker Node的狀態以及具體信息,以便處理Docker請求時做爲調度依據。
swarm list
Swarm中的swarm list命令用以列舉Docker集羣中的Docker Node。Docker Node的信息均來源於Swarm節點上註冊的Docker Node。而一個Docker Node在Swarm節點上註冊,僅僅是註冊了Docker Node的IP地址以及Docker監聽的端口號。
使用swarm list命令時,須要指定discovery的類型,類型包括:token、etcd、file、zk以及。而swarm list並未羅列Docker集羣的動態信息,好比Docker Node真實的運行狀態,或者Docker Node在Docker集羣中扮演的角色信息。
==========================下面簡單梳理了一些平常運維中用到的Swarm相關命令=============================
1) 初始化swarm manager並制定網卡地址 # docker swarm init --advertise-addr 182.48.115.237 2) 刪除集羣,強制退出須要加–force (針對manager節點). 到各個節點上執行退出集羣的命令 # docker node rm swarm-node1 # docker swarm leave --force //manager節點退出集羣,須要加--force 3) 查看swarm worker的鏈接令牌 # docker swarm join-token worker 例如: [root@manager-node ~]# docker swarm init --advertise-addr 182.48.115.237 Swarm initialized: current node (1gi8utvhu4rxy8oxar2g7h6gr) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-4roc8fx10cyfgj1w1td8m0pkyim08mve578wvl03eqcg5ll3ig-f0apd81qfdwv27rnx4a4y9jej \ 182.48.115.237:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. 4) 加入docker swarm集羣,做爲worker節點 利用上面執行結果中的命令放在其餘節點上執行,則該節點加入到swarm集羣中做爲worker節點 [root@node1 ~]# docker swarm join --token SWMTKN-1-4roc8fx10cyfgj1w1td8m0pkyim08mve578wvl03eqcg5ll3ig-f0apd81qfdwv27rnx4a4y9jej 182.48.115.237:2377 This node joined a swarm as a worker. 5) 查看swarm manager的鏈接令牌 # docker swarm join-token manager 例如: [root@swarm-manager-node ~]# docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-075gaitl18z3v0p37sx7i5cmvzjjur0fbuixzp4tun0xh0cikd-0y8ttp5h0g54j10amn670w6su \ 172.16.60.220:2377 6) 加入docker swarm集羣,做爲manager節點 利用上面執行結果中的命令放在其餘節點上執行,則該節點加入到swarm集羣中做爲manager管理節點,狀態爲reachable. [root@swarm-manager-node2 ~]# docker swarm join --token SWMTKN-1-075gaitl18z3v0p37sx7i5cmvzjjur0fbuixzp4tun0xh0cikd-0y8ttp5h0g54j10amn670w6su 172.16.60.220:2377 This node joined a swarm as a manager. [root@swarm-manager-node2 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS rpbey5t1v14olke2mgtc430de swarm-node2 Ready Active u6gkfr4j19gq16ddyb76fxsl3 swarm-node1 Ready Active vwbb0imil512a1le04bnkx98u * swarm-manager-node Ready Active Leader ybjvaszg838upeqvvzswhq0tt swarm-manager-node2 Ready Active Reachable 若是以前的leader狀態的manager管理節點掛了後(假如systemctl stop docker, 而後再systemctl start docker), 則新加入的manager節點狀態由reachable變爲leader, 以前的manager節點狀態爲unreachable. [root@swarm-manager-node2 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS rpbey5t1v14olke2mgtc430de swarm-node2 Ready Active u6gkfr4j19gq16ddyb76fxsl3 swarm-node1 Ready Active vwbb0imil512a1le04bnkx98u * swarm-manager-node Ready Active Unreachable ybjvaszg838upeqvvzswhq0tt swarm-manager-node2 Ready Active Leader 7) 使舊令牌無效並生成新令牌 # docker swarm join-token --rotate 8) 查看集羣中的節點 # docker node ls 9) 查看集羣中節點信息 # docker node inspect swarm-node1 --pretty 10) 調度程序能夠將任務分配給節點 # docker node update --availability active swarm-node1 11) 調度程序不向節點分配新任務,可是現有任務仍然保持運行 # docker node update --availability pause swarm-node1 12) 調度程序不會將新任務分配給節點。調度程序關閉任何現有任務並在可用節點上安排它們. 也就是線下節點,不參與任務分配. # docker node update --availability drain swarm-node1 13) 添加節點標籤 # docker node update --label-add label1 --label-add bar=label2 swarm-node1 14) 刪除節點標籤 # docker node update --label-rm label1 swarm-node1 15) 將worker節點升級爲manager節點 # docker node promote swarm-node1 16) 將manager節點降級爲worker節點 # docker node demote swarm-manager-node 17) 查看服務列表 # docker service ls 18) 查看服務的具體信息 # docker service ps my-test 19) 建立一個不定義name,不定義replicas的服務. (以下的nginx是docker的nginx鏡像名稱,不是服務名稱) # docker service create nginx 20) 建立一個指定name的服務 # ocker service create --name my-nginx nginx 21) 建立一個指定name、run cmd的服務 # docker service create --name my-nginx nginx ping www.baidu.com 22) 建立一個指定name、version、run cmd的服務 # docker service create --name my-redis redis:3.0.6 # docker service create --name my-nginx nginx:1.8 /bin/bash 23) 建立一個指定name、port、replicas的服務 # docker service create --name my-nginx --replicas 3 -p 80:80 nginx 24) 爲指定的服務更新一個端口 # docker service update --publish-add 80:80 my-nginx 25) 爲指定的服務刪除一個端口 # docker service update --publish-rm 80:80 my-nginx 26) 將redis:3.0.6更新至redis:3.0.7 # docker service update --image redis:3.0.7 redis 27) 配置運行環境,指定工做目錄及環境變量 # docker service create --name my-nginx --env MYVAR=myvalue --workdir /data/www --user my_user nginx ping www.baidu.com 28) 建立一個my-nginx的服務 # docker service create --name my-nginx nginx ping www.baidu.com 29) 更新my-nginx服務的運行命令 # docker service update --args "ping www.baidu.com" my-nginx 30) 刪除一個服務 # docker service rm my-nginx 31) 在每一個羣組節點上運行web服務 # docker service create --name tomcat --mode global --publish mode=host,target=8080,published=8080 tomcat:latest 32) 建立一個overlay網絡 # docker network create --driver overlay my-network # docker network create --driver overlay --subnet 10.10.10.0/24 --gateway 10.10.10.1 haha-network 33) 建立服務並將網絡添加至該服務 # docker service create --name my-test --replicas 3 --network my-network redis 34) 刪除羣組網絡 # docker service update --network-rm my-network my-test 35) 更新羣組網絡 # docker service update --network-add haha-network my-test 36) 建立羣組並配置cpu和內存 # docker service create --name my_nginx --reserve-cpu 2 --reserve-memory 512m --replicas 3 nginx 37) 更改所分配的cpu和內存 # docker service update --reserve-cpu 1 --reserve-memory 256m my_nginx 38) 建立服務時自定義的幾個參數 指定每次更新的容器數量 --update-parallelism 指定容器更新的間隔 --update-delay 定義容器啓動後監控失敗的持續時間 --update-monitor 定義容器失敗的百分比 --update-max-failure-ratio 定義容器啓動失敗以後所執行的動做 --update-failure-action 好比:建立一個服務並運行3個副本,同步延遲10秒,10%任務失敗則暫停 # docker service create --name mysql_5_6_36 --replicas 3 --update-delay 10s --update-parallelism 1 --update-monitor 30s --update-failure-action pause --update-max-failure-ratio 0.1 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6.36 39) 回滾至以前版本 # docker service update --rollback mysql 自動回滾 若是服務部署失敗,則每次回滾2個任務,監控20秒,回滾可接受失敗率20% # docker service create --name redis --replicas 6 --rollback-parallelism 2 --rollback-monitor 20s --rollback-max-failure-ratio .2 redis:latest 40) 建立服務並將目錄掛在至container中 # docker service create --name mysql --publish 3306:3306 --mount type=bind,src=/data/mysql,dst=/var/lib/mysql --replicas 3 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6.36 須要注意使用bind綁定宿主機目錄會帶來的風險 - 綁定的主機路徑必須存在於每一個集羣節點上,不然會有問題; - 調度程序可能會在任什麼時候候從新安排運行服務容器,若是目標節點主機變得不健康或沒法訪問; - 主機綁定數據不可移植,當你綁定安裝時,不能保證你的應用程序開發方式與生產中的運行方式相同; 41) 添加swarm配置 # echo "this is a mysql config" | docker config create mysql - 42) 查看配置 # docker config ls 查看配置詳細信息 # docker config inspect mysql 43) 刪除配置 # docker config rm mysql 44) 添加配置 # docker service update --config-add mysql mysql 45) 刪除配置 # docker service update --config-rm mysql mysql 46) 添加配置 # docker config create kevinpage index.html 47) 啓動容器的同時添加配置(target若是報錯,就使用dst或destination) # docker service create --name nginx --publish 80:80 --replicas 3 --config src=kevinpage,target=/usr/share/nginx/html/index.html nginx