從零開始學習docker(十七)Swarm mode ---service
service,大家應該不陌生,我們在之前講過。一個service就對應一個container容器。我們之前使用docker compose時,一個service時部署在一臺機器上面的。但是我們在swarm下面,我們建立一個service時,他可能會執行在我們cluster中的任何一個節點中去,下面詳細介紹。
docker service 命令
docker service create 有點像docker run
在swarm下面,我們不適用docker run命令來執行容器。docker run表示在本地建立一個container。而service不一定執行在本地。所以在swarm下,一般不用docker run。
我們用建立一個service:
vincent@swarm-manager:~$ docker service create --name demo busybox sh -c "while true; do sleep 3600;done"
lf0wx1k2xz3l88mandyifkdm7
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged
檢視service情況:
vincent@swarm-manager:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS lf0wx1k2xz3l demo replicated 1/1 busybox:latest
那麼這個service執行在哪個節點上呢?
vincent@swarm-manager:~$ docker service ps demo ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS hkgsjp3dswfh demo.1 busybox:latest swarm-worker-1 Ready Ready 3 seconds ago
說明執行在swarm-worker-1。
MODE replicated表示這個service是可以水平擴充套件的
如何擴充套件?
docker service scale demo=5
vincent@swarm-manager:~$ docker service scale demo=5
demo scaled to 5
overall progress: 5 out of 5 tasks
1/5: running
2/5: running
3/5: running
4/5: running
5/5: running
verify: Service converged
vincent@swarm-manager:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
lf0wx1k2xz3l demo replicated 5/5 busybox:latest
可以看到成功擴充套件了5個service。5/5表示:分母表示這個service的scale是多少,分子表示有多少個已經正常啟動了。
vincent@swarm-manager:~$ docker service ps demo
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
kvngsxo8q1jv demo.1 busybox:latest swarm-worker-2 Running Running 3 minutes ago
w9uw1zoncfki demo.2 busybox:latest swarm-worker-1 Running Running 2 minutes ago
sxsro5dzepjc demo.3 busybox:latest swarm-manager Running Running 2 minutes ago
klxhs3ec1j6c demo.4 busybox:latest swarm-manager Running Running 2 minutes ago
yxov6fzvwsyr demo.5 busybox:latest swarm-worker-2 Running Running 2 minutes ago
可以看到有兩個service在swarm-worker-2節點上,有兩個service在swarm-manager節點上,有一個在swarm-worker-1節點上。
我們去swarm-worker-1驗證一下:
vincent@swarm-worker-1:~$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1644c316b53 busybox:latest "sh -c 'while true; …" 3 minutes ago Up 3 minutes demo.2.w9uw1zoncfkikb1iayit9mdba
有一個container。再去swarm-work-2驗證一下:
vincent@swarm-worker-2:~$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0607b0aa4ad busybox:latest "sh -c 'while true; …" 4 minutes ago Up 4 minutes demo.5.yxov6fzvwsyrfue8q1redjyx9
9ccc6696214e busybox:latest "sh -c 'while true; …" 6 minutes ago Up 6 minutes demo.1.kvngsxo8q1jvd5mv6k9lcvxf1
有兩個container。再去swarm-manager驗證一下:
vincent@swarm-manager:~$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
128053167c33 busybox:latest "sh -c 'while true; …" 5 minutes ago Up 5 minutes demo.4.klxhs3ec1j6cek8914lk5mhdt
dd1dca1864dc busybox:latest "sh -c 'while true; …" 5 minutes ago Up 5 minutes demo.3.sxsro5dzepjc0mgs1phzz12ro
有兩個container。
將service橫向擴充套件5個以後,一切正常。
如果刪除容器,會怎麼樣?
我們將swarm-worker-2中的一個容器刪掉:
vincent@swarm-worker-2:~$ docker rm -f 9ccc6696214e
9ccc6696214e
然後早swarm-maganger上檢視:
vincent@swarm-manager:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
lf0wx1k2xz3l demo replicated 5/5 busybox:latest
發現還是5個。但是這已經不是之前的5個容器了。
vincent@swarm-manager:~$ docker service ps demo
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vq4lgu31i4bn demo.1 busybox:latest swarm-worker-1 Running Running 3 minutes ago
kvngsxo8q1jv \_ demo.1 busybox:latest swarm-worker-2 Shutdown Failed 3 minutes ago "task: non-zero exit (137)"
w9uw1zoncfki demo.2 busybox:latest swarm-worker-1 Running Running 10 minutes ago
sxsro5dzepjc demo.3 busybox:latest swarm-manager Running Running 10 minutes ago
klxhs3ec1j6c demo.4 busybox:latest swarm-manager Running Running 10 minutes ago
yxov6fzvwsyr demo.5 busybox:latest swarm-worker-2 Running Running 10 minutes ago
可以看到,我們在swarm-worker-2上的一個容器已經shutdown了,但是在swarm-worker-1上重新啟動了一個。因此swarm-worker-1上有兩個container。
因此,swarm不僅保證可以橫向擴充套件,而且還保證一定數目的有效的。
當swarm發現scale中的部分節點上的service失效,那麼他會通過cluster的任一節點上重啟一個,達到scale。可以確保系統是有效穩定的。
docker service rm demo
可以刪除demo.
vincent@swarm-manager:~$ docker service rm demo
demo