Docker管理工具-Swarm部署記錄

Swarm介紹

Swarm是Docker公司在2014年12月初發布的一套較爲簡單的工具,用來管理Docker集羣,它將一羣Docker宿主機變成一個單一的,虛擬的主機。Swarm使用標準的Docker API接口作爲其前端訪問入口,換言之,各種形式的Docker Client(docker client in Go, docker_py, docker等)均可以直接與Swarm通信。Swarm幾乎全部用Go語言來完成開發,Swarm0.2版本增加了一個新的策略來調度集羣中的容器,使得在可用的節點上傳播它們,以及支持更多的Docker命令以及集羣驅動。Swarm deamon只是一個調度器(Scheduler)加路由器(router),Swarm自己不運行容器,它只是接受docker客戶端發送過來的請求,調度適合的節點來運行容器,這意味着,即使Swarm由於某些原因掛掉了,集羣中的節點也會照常運行,當Swarm重新恢復運行之後,它會收集重建集羣信息。

Docker的Swarm(集羣)模式,集成很多工具和特性,比如:跨主機上快速部署服務,服務的快速擴展,集羣的管理整合到docker引擎,這意味着可以不可以不使用第三方管理工具。分散設計,聲明式的服務模型,可擴展,狀態協調處理,多主機網絡,分佈式的服務發現,負載均衡,滾動更新,安全(通信的加密)等等,下面就來認識下Swarm(對於Swarm管理的詳細操作可以參考:https://www.centos.bz/tag/swarm/page/3/

Swarm架構

Swarm作爲一個管理Docker集羣的工具,首先需要將其部署起來,可以單獨將Swarm部署於一個節點。另外,自然需要一個Docker集羣,集羣上每一個節點均安裝有Docker。具體的Swarm架構圖可以參照下圖:

Swarm架構中最主要的處理部分自然是Swarm節點,Swarm管理的對象自然是Docker Cluster,Docker Cluster由多個Docker Node組成,而負責給Swarm發送請求的是Docker Client。

Swarm關鍵概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1)Swarm
集羣的管理和編排是使用嵌入到docker引擎的SwarmKit,可以在docker初始化時啓動swarm模式或者加入已存在的swarm
 
2)Node
一個節點(node)是已加入到swarm的Docker引擎的實例 當部署應用到集羣,你將會提交服務定義到管理節點,接着Manager
管理節點調度任務到worker節點,manager節點還執行維護集羣的狀態的編排和羣集管理功能,worker節點接收並執行來自
manager節點的任務。通常,manager節點也可以是worker節點,worker節點會報告當前狀態給manager節點
 
3)服務(Service)
服務是要在worker節點上要執行任務的定義,它在工作者節點上執行,當你創建服務的時,你需要指定容器鏡像
 
4)任務(Task)
任務是在docekr容器中執行的命令,Manager節點根據指定數量的任務副本分配任務給worker節點
 
--------------------------------------------------------------------------------------------------------
docker swarm:集羣管理,子命令有init,  join , leave, update。(docker swarm --help查看幫助)
docker service:服務創建,子命令有create, inspect, update, remove, tasks。(docker service--help查看幫助)
docker node:節點管理,子命令有accept, promote, demote, inspect, update, tasks,  ls rm 。(docker node --help查看幫助)
  
node是加入到swarm集羣中的一個docker引擎實體,可以在一臺物理機上運行多個node,node分爲:
manager nodes,也就是管理節點
worker nodes,也就是工作節點
  
1)manager node管理節點:執行集羣的管理功能,維護集羣的狀態,選舉一個leader節點去執行調度任務。
2)worker node工作節點:接收和執行任務。參與容器集羣負載調度,僅用於承載task。
3)service服務:一個服務是工作節點上執行任務的定義。創建一個服務,指定了容器所使用的鏡像和容器運行的命令。
    service是運行在worker nodes上的task的描述,service的描述包括使用哪個docker 鏡像,以及在使用該鏡像的容器中執行什麼命令。
4)task任務:一個任務包含了一個容器及其運行的命令。task是service的執行實體,task啓動docker容器並在容器中執行任務。

Swarm工作方式

1)Node

2)Service(服務, 任務, 容器)

3)任務與調度

4)服務副本與全局服務

Swarm調度策略

1
2
3
4
5
6
7
8
9
10
11
12
Swarm在scheduler節點(leader節點)運行容器的時候,會根據指定的策略來計算最適合運行容器的節點,目前支持的策略有:spread, binpack, random.
1)Random
顧名思義,就是隨機選擇一個Node來運行容器,一般用作調試用,spread和binpack策略會根據各個節點的可用的CPU, RAM以及正在運
行的容器的數量來計算應該運行容器的節點。
 
2)Spread
在同等條件下,Spread策略會選擇運行容器最少的那臺節點來運行新的容器,binpack策略會選擇運行容器最集中的那臺機器來運行新的節點。
使用Spread策略會使得容器會均衡的分佈在集羣中的各個節點上運行,一旦一個節點掛掉了只會損失少部分的容器。
 
3)Binpack
Binpack策略最大化的避免容器碎片化,就是說binpack策略儘可能的把還未使用的節點留給需要更大空間的容器運行,儘可能的把容器運行在
一個節點上面。

Swarm Cluster模式的特性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
1)批量創建服務
建立容器之前先創建一個overlay的網絡,用來保證在不同主機上的容器網絡互通的網絡模式
  
2)強大的集羣的容錯性
當容器副本中的其中某一個或某幾個節點宕機後,cluster會根據自己的服務註冊發現機制,以及之前設定的值--replicas n,
在集羣中剩餘的空閒節點上,重新拉起容器副本。整個副本遷移的過程無需人工干預,遷移後原本的集羣的load balance依舊好使!
不難看出,docker service其實不僅僅是批量啓動服務這麼簡單,而是在集羣中定義了一種狀態。Cluster會持續檢測服務的健康狀態
並維護集羣的高可用性。
  
3)服務節點的可擴展性
Swarm Cluster不光只是提供了優秀的高可用性,同時也提供了節點彈性擴展或縮減的功能。當容器組想動態擴展時,只需通過scale
參數即可複製出新的副本出來。
  
仔細觀察的話,可以發現所有擴展出來的容器副本都run在原先的節點下面,如果有需求想在每臺節點上都run一個相同的副本,方法
其實很簡單,只需要在命令中將 "--replicas n" 更換成 "--mode=global" 即可!
 
複製服務(--replicas n)
將一系列複製任務分發至各節點當中,具體取決於您所需要的設置狀態,例如「--replicas 3」。
 
全局服務(--mode=global)
適用於集羣內全部可用節點上的服務任務,例如「--mode global」。如果大家在 Swarm 集羣中設有 7 臺 Docker 節點,則全部節點之上都將存在對應容器。
  
4. 調度機制
所謂的調度其主要功能是cluster的server端去選擇在哪個服務器節點上創建並啓動一個容器實例的動作。它是由一個裝箱算法和過濾器
組合而成。每次通過過濾器(constraint)啓動容器的時候,swarm cluster 都會調用調度機制篩選出匹配約束條件的服務器,並在這上面運行容器。
  
------------------Swarm cluster的創建過程包含以下三個步驟----------------------
1)發現Docker集羣中的各個節點,收集節點狀態、角色信息,並監視節點狀態的變化
2)初始化內部調度(scheduler)模塊
3)創建並啓動API監聽服務模塊
  
一旦創建好這個cluster,就可以用命令docker service批量對集羣內的容器進行操作,非常方便!
  
在啓動容器後,docker 會根據當前每個swarm節點的負載判斷,在負載最優的節點運行這個task任務,用 "docker service ls"  "docker service ps + taskID"
可以看到任務運行在哪個節點上。容器啓動後,有時需要等待一段時間才能完成容器創建。

Swarm集羣部署實例(Swarm Cluster)

1)機器環境(均是centos7.2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
182.48.115.237      swarm的manager節點      manager-node   
182.48.115.238      swarm的node節點         node1
182.48.115.239      swarm的node節點         node2
 
設置主機名
在manager節點上
[[email protected] ~] # hostnamectl --static set-hostname manager-node
 
在node1節點上
[[email protected] ~] # hostnamectl --static set-hostname node1
 
在node2節點上
[[email protected] ~] # hostnamectl --static set-hostname node2
 
在三臺機器上都要設置hosts,均執行如下命令:
[[email protected] ~] # vim /etc/hosts
......
182.48.115.237 manager-node
182.48.115.238 node1
182.48.115.239 node2
 
關閉三臺機器上的防火牆。如果開啓防火牆,則需要在所有節點的防火牆上依次放行2377 /tcp (管理端口)、7946 /udp (節點間通信端口)、4789 /udp (overlay 網絡端口)端口。
[[email protected] ~] # systemctl disable firewalld.service
[[email protected] ~] # systemctl stop firewalld.service

2)分別在manager節點和node節點上安裝docker,並下載swarm鏡像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[[email protected] ~] # yum install -y docker
  
配置docker
[[email protected] ~] # vim /etc/sysconfig/docker
......
OPTIONS= '-H 0.0.0.0:2375 -H unix:///var/run/docker.sock'            // 在OPTIONS參數項後面的 '' 裏添加內容
  
[[email protected] ~] # systemctl restart docker
  
下載swarm鏡像
[[email protected] ~] # docker pull swarm
[[email protected] ~] # docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io /swarm      latest              36b1e23becab        4 months ago        15.85 MB

3)創建swarm(要保存初始化後token,因爲在節點加入時要使用token作爲通訊的密鑰)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[[email protected] ~] # 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.
 
上面命令執行後,該機器自動加入到swarm集羣。這個會創建一個集羣token,獲取全球唯一的 token,作爲集羣唯一標識。後續將其他節點加入集羣都會用到這個token值。
其中,--advertise-addr參數表示其它swarm中的worker節點使用此ip地址與manager聯繫。命令的輸出包含了其它節點如何加入集羣的命令。
 
-------------------------------------------------------------------------------------------------------------------
溫馨提示:
如果再次執行上面啓動swarm集羣的命令,會報錯說這個節點已經在集羣中了
Error response from daemon: This node is already part of a swarm. Use  "docker swarm leave"  to leave this swarm and  join  another one.
 
解決辦法:
[[email protected] ~] # docker swarm leave --help           //查看幫助
[[email protected] ~] # docker swarm leave --force
-------------------------------------------------------------------------------------------------------------------
 
使用docker info 或 docker node  ls  查看集羣中的相關信息
[[email protected] ~] # docker info
.......
Swarm: active
  NodeID: 1gi8utvhu4rxy8oxar2g7h6gr
  Is Manager:  true
  ClusterID: a88a9j6nwcbn31oz6zp9oc0f7
  Managers: 1
  Nodes: 1
  Orchestration:
   Task History Retention Limit: 5
.......
 
[[email protected] ~] # docker node ls                 
ID                           HOSTNAME      STATUS  AVAILABILITY  MANAGER STATUS
1gi8utvhu4rxy8oxar2g7h6gr *  manager-node  Ready   Active        Leader
 
注意上面node ID旁邊那個*號表示現在連接到這個節點上。

4)添加節點到swarm集羣中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
在docker swarm init 完了之後,會提示如何加入新機器到集羣,如果當時沒有注意到,也可以通過下面的命令來獲知 如何加入新機器到集羣。
  
登錄到node1節點上,執行前面創建swarm集羣時輸出的命令:
[[email protected] ~] # docker swarm join --token SWMTKN-1-4roc8fx10cyfgj1w1td8m0pkyim08mve578wvl03eqcg5ll3ig-f0apd81qfdwv27rnx4a4y9jej 182.48.115.237:2377
This node joined a swarm as a worker.
  
同理在node2節點上,也執行這個命令
[[email protected] ~] # docker swarm join --token SWMTKN-1-4roc8fx10cyfgj1w1td8m0pkyim08mve578wvl03eqcg5ll3ig-f0apd81qfdwv27rnx4a4y9jej 182.48.115.237:2377
This node joined a swarm as a worker.
  
如果想要將其他更多的節點添加到這個swarm集羣中,添加方法如上一致!
  
然後在manager-node管理節點上看一下集羣節點的狀態:
[[email protected] ~] # docker node ls
ID                           HOSTNAME      STATUS  AVAILABILITY  MANAGER STATUS
1gi8utvhu4rxy8oxar2g7h6gr *  manager-node  Ready   Active        Leader
ei53e7o7jf0g36329r3szu4fi    node1         Ready   Active      
f1obgtudnykg51xzyj5fs1aev    node2         Ready   Active
 
--------------------------------------------------------------------------------------------------------------------
溫馨提示:更改節點的availablity狀態
swarm集羣中node的availability狀態可以爲 active或者drain,其中:
active狀態下,node可以接受來自manager節點的任務分派;
drain狀態下,node節點會結束task,且不再接受來自manager節點的任務分派(也就是下線節點)。
 
[[email protected] ~] # docker node update --availability drain node1    //將node1節點下線。如果要刪除node1節點,命令是"docker node rm --force node1"
[[email protected] ~] # docker node ls
ID                           HOSTNAME      STATUS  AVAILABILITY  MANAGER STATUS
1gi8utvhu4rxy8oxar2g7h6gr *  manager-node  Ready   Active        Leader
ei53e7o7jf0g36329r3szu4fi    node1         Ready   drain      
f1obgtudnykg51xzyj5fs1aev    node2         Ready   Active
 
如上,當node1的狀態改爲drain後,那麼該節點就不會接受task任務分發,就算之前已經接受的任務也會轉移到別的節點上。
 
再次修改爲active狀態(及將下線的節點再次上線)
[[email protected] ~] # docker node update --availability drain node1

5)在Swarm中部署服務(這裏以nginx服務爲例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
Docker 1.12版本提供服務的Scaling、health check、滾動升級等功能,並提供了內置的dns、vip機制,實現service的服務發現和負載均衡能力。
 
在啓動容器之前,先來創建一個覆蓋網絡,用來保證在不同主機上的容器網絡互通的網絡模式
[[email protected] ~] # docker network create -d overlay ngx_net
[[email protected] ~] # docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8bbd1b7302a3        bridge              bridge               local            
9e637a97a3b9        docker_gwbridge     bridge               local            
b5a41c8c71e7        host                host                 local            
1x45zepuysip        ingress             overlay             swarm            
3ye6vfp996i6        ngx_net             overlay             swarm            
0808a5c72a0a        none                null                 local
   
在manager-node節點上使用上面這個覆蓋網絡創建nginx服務:
其中,--replicas 參數指定服務由幾個實例組成。
注意:不需要提前在節點上下載nginx鏡像,這個命令執行後會自動下載這個容器鏡像(比如此處創建tomcat容器,就將下面命令中的鏡像改爲tomcat鏡像)。
[[email protected] ~] # docker service create --replicas 1 --network ngx_net --name my-test -p 80:80 nginx
   
就創建了一個具有一個副本(--replicas 1 )的nginx服務,使用鏡像nginx
   
使用 docker service  ls  查看正在運行服務的列表
[[email protected] ~] # docker service ls
ID            NAME     REPLICAS  IMAGE            COMMAND
0jb5eebo8j9q  my- test   1 /1        nginx
   
查詢Swarm中服務的信息
-pretty 使命令輸出格式化爲可讀的格式,不加 --pretty 可以輸出更詳細的信息:
[[email protected] ~] # docker service inspect --pretty my-test
ID:   0jb5eebo8j9qb1zc795vx3py3
Name:   my- test
Mode:   Replicated
  Replicas:  1
Placement:
UpdateConfig:
  Parallelism: 1
  On failure:  pause
ContainerSpec:
  Image:   nginx
Resources:
Networks: 3ye6vfp996i6eq17tue0c2jv9
Ports:
  Protocol = tcp
  TargetPort = 80
  PublishedPort = 80
   
  查詢到哪個節點正在運行該服務。如下該容器被調度到manager-node節點上啓動了,然後訪問http: //182 .48.115.237即可訪問這個容器應用(如果調度到其他節點,訪問也是如此)
  [[email protected] ~] # docker service ps my-test
ID                         NAME       IMAGE            NODE          DESIRED STATE  CURRENT STATE          ERROR
2m8qqpoa0dpeua5jbgz1infuy  my- test .1  nginx  manager-node  Running        Running 3 minutes ago
   
注意,如果上面命令執行後,上面的 STATE 字段中剛開始的服務狀態爲 Preparing,需要等一會才能變爲 Running 狀態,其中最費時間的應該是下載鏡像的過程。
   
   
有上面命令可知,該服務在manager-node節點上運行。登陸該節點,可以查看到nginx容器在運行中
[[email protected] ~] # docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS               NAMES
1ea1d72007da        nginx:latest    "nginx -g 'daemon off"    4 minutes ago       Up 4 minutes        80 /tcp               my- test .1.2m8qqpoa0dpeua5jbgz1infuy
   
-----------------------------------------------------------在Swarm中動態擴展服務(scale)-----------------------------------------------------------
當然,如果只是通過service啓動容器,swarm也算不上什麼新鮮東西了。Service還提供了複製(類似kubernetes裏的副本)功能。可以通過 docker service scale 命令來設置服務中容器的副本數:
   
比如將上面的my- test 容器動態擴展到5個,命令如下:
[[email protected] ~] # docker service scale my-test=5
   
和創建服務一樣,增加scale數之後,將會創建新的容器,這些新啓動的容器也會經歷從準備到運行的過程,過一分鐘左右,服務應該就會啓動完成,這時候可以再來看一下 nginx 服務中的容器
[[email protected] ~] # docker service ps my-test
ID                         NAME       IMAGE            NODE          DESIRED STATE  CURRENT STATE          ERROR
2m8qqpoa0dpeua5jbgz1infuy  my- test .1  nginx  manager-node  Running        Running 9 minutes ago
aqko8yhmdj53gmzs8gqhoylc2  my- test .2  nginx  node2         Running        Running 2 minutes ago
erqk394hd4ay7nfwgaz4zp3s0  my- test .3  nginx  node1         Running        Running 2 minutes ago
2dslg6w16wzcgboa2hxw1c6k1  my- test .4  nginx  node1         Running        Running 2 minutes ago
bmyddndlx6xi18hx4yinpakf3  my- test .5  nginx  manager-node  Running        Running 2 minutes ago
   
可以看到,之前my- test 容器只在manager-node節點上有一個實例,而現在又增加了4個實例。
這5個副本的my- test 容器分別運行在這三個節點上,登陸這三個節點,就會發現已經存在運行着的my- test 容器。
   
-----------------------------------------------------------------------------------------------------
特別需要清楚的一點:
如果一個節點宕機了(即該節點就會從swarm集羣中被踢出),則Docker應該會將在該節點運行的容器,調度到其他節點,以滿足指定數量的副本保持運行狀態。
   
比如:
將node1宕機後或將node1的docker服務關閉,那麼它上面的task實例就會轉移到別的節點上。當node1節點恢復後,它轉移出去的task實例不會主動轉移回來,
只能等別的節點出現故障後轉移task實例到它的上面。使用命令 "docker node ls" ,發現node1節點已不在swarm集羣中了。
   
然後過一會查詢服務的狀態列表
[[email protected] ~] # docker service ps my-test
ID                         NAME           IMAGE            NODE          DESIRED STATE  CURRENT STATE           ERROR
2m8qqpoa0dpeua5jbgz1infuy  my- test .1      docker.io /nginx   manager-node  Running        Running 33 minutes ago
aqko8yhmdj53gmzs8gqhoylc2  my- test .2      docker.io /nginx   node2         Running        Running 26 minutes ago
di99oj7l9x6firw1ai25sewwc  my- test .3      docker.io /nginx   node2         Running        Running 6 minutes ago
erqk394hd4ay7nfwgaz4zp3s0   \_ my- test .3  docker.io /nginx   node1         Shutdown       Complete 5 minutes ago
aibl3u3pph3fartub0mhwxvzr  my- test .4      docker.io /nginx   node2         Running        Running 6 minutes ago
2dslg6w16wzcgboa2hxw1c6k1   \_ my- test .4  docker.io /nginx   node1         Shutdown       Complete 5 minutes ago
bmyddndlx6xi18hx4yinpakf3  my- test .5      docker.io /nginx   manager-node  Running        Running 26 minutes ago
   
發現,node1節點出現故障後,它上面之前的兩個task任務已經轉移到node2節點上了。
登陸到node2節點上,可以看到這兩個運行的task任務。當訪問182.48.115.239節點的80端口,swarm的負載均衡會把請求路由到一個任意節點的可用的容器上。
[[email protected] ~] # docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS               NAMES
216abf6bebea        docker.io /nginx :latest    "nginx -g 'daemon off"    7 minutes ago       Up 7 minutes        80 /tcp               my- test .3.di99oj7l9x6firw1ai25sewwc
1afd12cc9140        docker.io /nginx :latest    "nginx -g 'daemon off"    7 minutes ago       Up 7 minutes        80 /tcp               my- test .4.aibl3u3pph3fartub0mhwxvzr
cc90da57c25e        docker.io /nginx :latest    "nginx -g 'daemon off"    27 minutes ago      Up 27 minutes       80 /tcp               my- test .2.aqko8yhmdj53gmzs8gqhoylc2
   
再次在node2節點上將從node1上轉移過來的兩個task關閉
[[email protected] ~] # docker stop my-test.3.di99oj7l9x6firw1ai25sewwc my-test.4.aibl3u3pph3fartub0mhwxvzr
my- test .3.di99oj7l9x6firw1ai25sewwc
my- test .4.aibl3u3pph3fartub0mhwxvzr
   
再次查詢服務的狀態列表,發現這兩個task又轉移到node1上了(即在swarm cluster集羣中啓動的容器,在worker node節點上刪除或停用後,該容器會自動轉移到其他的worker node節點上)
[[email protected] ~] # docker service ps my-test
ID                         NAME           IMAGE            NODE          DESIRED STATE  CURRENT STATE                ERROR
2m8qqpoa0dpeua5jbgz1infuy  my- test .1      docker.io /nginx   manager-node  Running        Running 38 minutes ago    
aqko8yhmdj53gmzs8gqhoylc2  my- test .2      docker.io /nginx   node2         Running        Running 31 minutes ago    
7dhmc63rk0bc8ngt59ix38l44  my- test .3      docker.io /nginx   node1         Running        Running about a minute ago
di99oj7l9x6firw1ai25sewwc   \_ my- test .3  docker.io /nginx   node2         Shutdown       Complete about a minute ago
erqk394hd4ay7nfwgaz4zp3s0   \_ my- test .3  docker.io /nginx   node1         Shutdown       Complete 9 minutes ago    
607tyjv6foc0ztjjvdo3l3lge  my- test .4      docker.io /nginx   node1         Running        Running about a minute ago
aibl3u3pph3fartub0mhwxvzr   \_ my- test .4  docker.io /nginx   node2         Shutdown       Complete about a minute ago
2dslg6w16wzcgboa2hxw1c6k1   \_ my- test .4  docker.io /nginx   node1         Shutdown       Complete 9 minutes ago    
bmyddndlx6xi18hx4yinpakf3  my- test .5      docker.io /nginx   manager-node  Running        Running 31 minutes ago
  
----------------------------------------------------------------------------------------------------
同理,swarm還可以縮容,如下,將my- test 容器變爲1個。
[[email protected] ~] # docker service scale my-test=1
[[email protected] ~] # docker service ps my-test
ID                         NAME       IMAGE            NODE          DESIRED STATE  CURRENT STATE          ERROR
2m8qqpoa0dpeuasdfsdfdfsdf  my- test .1  nginx  manager-node  Running        Running 3 minutes ago
  
登錄node2節點,使用docker  ps 查看,會發現容器被stop而非 rm
  
---------------------------------------------------------------------------------------------------
刪除容器服務
[[email protected] ~] # docker service --help       //查看幫助
[[email protected] ~] # docker service rm my-test    //這樣就會把所有節點上的所有容器(task任務實例)全部刪除了
my-nginx
   
---------------------------------------------------------------------------------------------------
除了上面使用scale進行容器的擴容或縮容之外,還可以使用docker service update 命令。 可對 服務的啓動 參數 進行 更新/修改。
[[email protected] ~] # docker service update --replicas 3 my-test
my- test
  
更新完畢以後,可以查看到REPLICAS已經變成3 /3
[[email protected] ~] # docker service ls
ID            NAME          REPLICAS  IMAGE      COMMAND 
d7cygmer0yy5  my- test        3 /3        nginx      /bin/bash
  
[[email protected] ~] # docker service ps my-test
ID                         NAME             IMAGE  NODE          DESIRED STATE  CURRENT STATE            ERROR
ddkidkz0jgor751ffst55kvx4  my- test .1      nginx  node1         Running          Preparing 4 seconds ago
1aucul1b3qwlmu6ocu312nyst   \_ my- test .1  nginx  manager-node  Shutdown       Complete 5 seconds ago 
4w9xof53f0falej9nqgq064jz   \_ my- test .1  nginx  manager-node  Shutdown       Complete 19 seconds ago
0e9szyfbimaow9tffxfeymci2   \_ my- test .1  nginx  manager-node  Shutdown       Complete 30 seconds ago
27aqnlclp0capnp1us1wuiaxm  my- test .2      nginx  manager-node  Running        Preparing 1 seconds ago
7dmmmle29uuiz8ey3tq06ebb8  my- test .3      nginx  manager-node  Running        Preparing 1 seconds ago
  
docker service update 命令,也可用於直接 升級 鏡像等。
[[email protected] ~] # docker service update --image nginx:new my-test
  
[[email protected] ~] # docker service ls
ID            NAME          REPLICAS  IMAGE         COMMAND 
d7cygmer0yy5  my- test        3 /3        nginx:new      /bin/bash

6)Swarm中使用Volume(掛在目錄,mount)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
查看docker volume的幫助信息
[[email protected] ~] # docker volume --help
   
Usage:  docker volume COMMAND
   
Manage Docker volumes
   
Options:
       --help   Print usage
   
Commands:
   create      Create a volume
   inspect     Display detailed information on one or  more  volumes
   ls           List volumes
   rm           Remove one or  more  volumes
   
Run  'docker volume COMMAND --help'  for  more  information on a  command .
   
[[email protected] ~] # docker volume create --name myvolume
myvolume
  
[[email protected] ~] # docker volume ls
DRIVER              VOLUME NAME
local                11b68dce3fff0d57172e18bc4e4cfc252b984354485d747bf24abc9b11688171
local                1cd106ed7416f52d6c77ed19ee7e954df4fa810493bb7e6cf01775da8f9c475f
local                myvolume
  
參數src寫成 source 也可以;dst表示容器內的路徑,也可以寫成target
[[email protected] ~] # docker service create  --replicas 2 --mount type=volume,src=myvolume,dst=/wangshibo --name test-nginx nginx
相關文章
相關標籤/搜索