乾貨-使用Docker swarm mode創建多節點容器集群
1.初始化創建swarm
docker swarm init --advertise-addr <MANAGER-IP>
--listen-addr:指定swarm節點監聽的地址/網路介面及埠,默認埠為0.0.0.0:2377
--advertise-addr:指定為其它swarm節點提供API access和overlay networking的監聽地址和埠,若不指出,會使用--listen-addr指定的埠;若系統有多個IP地址,這個參數必須指定監聽到哪個網路地址
2.查看swarm信息
docker info
有相關swarm信息(示例如下)
Swarm: active
Advertisements
NodeID: os0l8xe87o0nz0sc04vrrpppl
Is Manager: true
ClusterID: o1c3g9ockktlagwpqirgb49no
Managers: 1
Nodes: 2
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 3
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Advertisements
Expiry Duration: 3 months
Node Address: 192.168.1.146
Manager Addresses:
192.168.1.146:2377
3.增加swarm節點
docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 192.168.99.100:2377
4.查看主節點供連接信息
docker swarm join-token worker
docker swarm join-token manager
重新生成token
swarm join-token --rotate
強烈建議manager節點為奇數個,方便在某節點故障時選舉出leader,以下為manager節點規劃和可FT數,以此類推,即swarm cluster允許(N-1)/2個節點故障。
分散式manager節點配置:不同節點上配置的manager節點數,保證更好的容錯性
運行manager-only節點(默認manager節點也是worker節點),即將節點狀態變為drain狀態
docker node update --availability drain <NODE-ID>
節點從故障中恢復
docker swarm init --force-new-cluster --listen-addr node01:2377
The --force-new-cluster flag puts the Docker Engine into swarm mode as a manager node of a single-node cluster. It discards cluster membership information that existed before the loss of the quorum but it retains data necessary to the Swarm cluster such as services, tasks and the list of worker nodes.This flag forces an existing node that was part of a quorum that was lost to restart as a single node Manager without losing its data
5.在主節點上查看所有節點信息
docker node ls
6.創建(發布)服務
docker service create --replicas 1 --name helloworld alpine ping docker.com
--replicas:服務實例數
--name:服務名稱
alpine:鏡像名稱
ping docker.com:執行的命令等參數
還有其它常用參數如:
--publish:設置映射到外面的埠
--env:設置環境變數
--workdir:設置運行目錄
--user:設置運行用戶
--mode:設置任務模式
--network:創建overlay網路
--update-delay:設置更新時間間隔
--update-parallelism:設置同時更新的任務數,默認是1
--update-failure-action:設置更新失敗后的行為,如continue
具體查詢--help或https://docs.docker.com/engine/reference/commandline/service_create/
配置掛載項:--mount
掛載項分為卷掛載(默認)和綁定掛載,卷是指容器任務完成並被移除后仍然存在的存儲,推薦使用已有的卷掛載
docker service create --mount src=<VOLUME-NAME>,dst=<CONTAINER-PATH> --name myservice <IMAGE>
docker service create --mount type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=<DRIVER>,volume-opt=<KEY0>=<VALUE0>,volume-opt=<KEY1>=<VALUE1> --name myservice <IMAGE>
綁定掛載是指來自那些調度部署容器任務的主機文件系統路徑,docker會掛載到容器內部的路徑,這個文件系統路徑必須在swarm初始化容器任務之前已存在,同時綁定掛載是有風險的,通常情況下不推薦使用,因為需要在每個機器上存在此掛載的文件系統路徑,調度程序隨時可能重新調度分配那些不健康或者無法連接的服務容器,並且此種掛載不能保證開發和生產一致。
docker service create --mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH> --name myservice <IMAGE>
docker service create --mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH>,readonly --name myservice <IMAGE>
7.查看服務狀態
docker service ls
8.查看服務詳細信息
docker service inspect --pretty helloworld
--pretty:以人性華(非json)方式顯示,方便查看
9.查看有哪些節點運行此服務
docker service ps helloworld
也可在每個swarm節點上直接使用docker ps查看運行的容器
10.變更服務任務數(只能在manager節點執行,可同時變更多個服務的任務數)
docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>
例如:docker service scale helloworld=5表示實例數變更為5個
11.刪除服務(只能在manager節點執行)
docker service rm helloworld
可通過docker service inspect helloworld確認是否刪除
12.滾動更新
docker service update --image redis:3.0.7 redis
默認更新步驟如下:
關閉第一個任務(實例)
開始在此關閉節點執行計劃中的更新
更新完成後啟動此任務
如果被更新的節點狀態返回為RUNNING,等待指定的delay時間,然後停止下一個任務
如果,在更新的任意時間,任務返回FAILED,則暫停更新
更新完成後可以使用docker service inspect --pretty redis查看服務的images是否更新成功
若更新失敗,使用docker service inspect --pretty <SERVICE-ID>會顯示失敗,可重新使用docker service update <SERVICE-ID>再次重啟更新
使用docker service ps <SERVICE-ID>可查看滾動更新
13.停用節點
docker node update --availability drain <NODE-ID>
被信用的節點即不會再接受新的任務指派,也會停止節點上所有運行的任務,此節點上的服務狀態會顯示為Shutdown,且它的任務會被重新指派到新的可用節點上
14.啟用節點
docker node update --availability active <NODE-ID>
此時節點可以接受新的任務指派
15.查看本地節點信息
docker node inspect self --pretty
16.提升或者降職節點
docker node promote node-3 node-2
docker node demote node-3 node-2
17.節點退出swarm
docker swarm leave
主管理節點退出時需要加--force
待節點退出后,可在任意管理節點從節點列表中刪除掉此節點
docker node rm node-2
18.創建overlay網路
docker network create --driver overlay my-network