在分佈式應用程序中,應用程序的不同部分稱為“服務”。 想像一個影音共享網站,它可能包含用於將應用程序數據存儲在數據庫中的服務,用於在用戶上傳內容後在後台進行影音轉碼的服務,用於前端的服務等等。服務實際上只是“容器”。服務僅運行一個映像檔,但它統一了映像的運行方式、使用的端口、運行的容器副本的數量,以便該服務具有所需的容量。擴展服務會更改運行該應用程序的容器數量,從而在流程中為該服務分配更多的計算資源。使用Docker定義、運行和擴展服務非常容易,只需編寫docker-compose.yml
文件即可。
docker-compose.yml
是YAML
檔,它決定Docker容器的運作方式。
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: username/repo:tag
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "4000:80"
networks:
- webnet
networks:
webnet:
在我們開始執行docker stack deploy
前先執行以下指令:
$ docker swarm init
接下來執行docker stack deploy
,我們會需要給他一個名字,就先叫做getstartedlab
:
$ docker stack deploy -c docker-compose.yml getstartedlab
取得應用程序中一個服務ID:
$ docker service ls
查找以getstartedlab_web
命名的服務。服務ID、副本數、映像檔名稱和公開的端口會被列出。
或者,您可以執行docker stack services
:
$ docker stack services getstartedlab
ID NAME MODE REPLICAS
IMAGE PORTS
bqpve1djnk0x getstartedlab_web replicated 5/5 username/repo:tag *:4000->80/tcp
在服務中運行的單個容器稱為task
。task
會獲得唯一的ID,這些ID會按數字遞增,直至您在docker-compose.yml中定義的副本數。
$ docker service ps getstartedlab_web
如果僅列出系統上的所有容器,也會顯示task
,但是不會進行過濾:
docker container ls -q
要查看所有task
,可以執行docker stack ps
,加上應用程序名稱
$ docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
uwiaw67sc0eh getstartedlab_web.1 username/repo:tag docker-desktop Running Running 9 minutes ago
sk50xbhmcae7 getstartedlab_web.2 username/repo:tag docker-desktop Running Running 9 minutes ago
c4uuw5i6h02j getstartedlab_web.3 username/repo:tag docker-desktop Running Running 9 minutes ago
0dyb70ixu25s getstartedlab_web.4 username/repo:tag docker-desktop Running Running 9 minutes ago
aocrb88ap8b0 getstartedlab_web.5 username/repo:tag docker-desktop Running Running 9 minutes ago