7.2 Swarm 模式下的容器
在前幾個章節,都是使用 docker container run 來運行一個獨立的容器,而在 Docker Swarm 的模式之下,有了新的物件可以來運行容器。
這邊先回到 Swarm 模式:
$ docker swarm init
Swarm initialized: current node (ne5cwloz00by50gvyh3hj74qt) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1mmrll6hucyytwlv3p06lvbap84ihgm2rquql0952mhloczirw-9fcoakk5hvwwonw7q5cko7p4q 192.168.65.3:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
這個新的物件叫做 Service ( 服務 ),在前幾章節的 docker container run 只能夠一次啟動一個容器,缺乏彈性,而 docker service create 則是拿來解決這個問題的答案。
輸入下方的指令試試看感覺如何:
$ docker service create --name nginx --publish 8080:80 --detach --replicas 3 nginx
sltqjrnlc9cflvm2a4hqgmbqq
接著使用 docker service list 指令來列出 service 物件:
$ docker service list
ID NAME MODE REPLICAS IMAGE PORTS
sltqjrnlc9cf nginx replicated 3/3 nginx *:8080->80/tcp
在啟動 service 時,加入了一個之前沒有看過的參數 --replicas,也就是副本的意思,這邊要求要複製三個 nginx 的映像檔運行而成的容器,就如同下圖所示:

在 Manager Node 上面執行了建立 Service 的指令,這個指令將會根據副本的數量而拆分成該數量的任務,以這個例子來說,就是建立了一個 Servcie,而這個 Service 裡面則有 3 個任務,每一個任務裡面都是 nginx:latest 映像檔運行而成的容器。
Manager Node 會想按照擁有的節點數量想辦法分配到每一個節點上,而因為現在在自己的電腦上執行,所以只有一個節點,這樣子就會把三個容器都坐落在這個節點上;這邊就可以使用以前所學,列出所有的容器來看看。
$ docker container list
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d535277f940 nginx "/docker" 8 min Up 8.. 80/tcp nginx.1..
208142908eee nginx "/docker" 8 min Up 8.. 80/tcp nginx.2..
627ecb54c131 nginx "/docker" 8 min Up 8.. 80/tcp ngnix.3..