Docker Swarm系列——5.Swarm服務檔案
在這篇文章中,大家將會了解如何通過docker-compose.yml檔案的形式部署服務。從docker1.13版本開始,新的
docker compose v3
引入適用於Docker Swarm模式的stack deploy
服務部署方式,所有我們就直接使用新的v3標準。
1. 建立檔案
在之前的幾篇文章中,我們都是通過docker CLI
命令列的形式部署服務。命令列雖然方便,但如果服務的配置變動幾次之後,我們還能記得每一次變動的細節嗎?如果要部署多個服務,或者從開發環境轉移到測試、正式環境,我們還能一字不差地把每個服務部署上去嗎?版本變動導致的配置差異如何記錄呢?…
此類上述的問題在於我們無法通過一個良好的形式來記錄每一次編寫的命令列,這就是我們為什麼要引入docker-compose.yml
還記得我們通過docker service create --name http --network httpnet --replicas 2 -p 80:80 nandy/show-host-info:v1
部署的http
服務嗎?這次,我們通過docker-compose.yml
來實現。
$ vim docker-compose.yml version: '3' services: http: image: nandy/show-host-info:v1 deploy: replicas: 2 networks: - httpnet ports: - 80:80 networks: httpnet: external: true
我們先不用馬上弄明白它的語法和含義,只需要大致看一下格式,接下來通過它來部署服務。
2. 部署服務
文章的最開始提到,stack deploy
是compose v3
引入的,先來看一下它的幫助命令:
$ docker stack --help Usage: docker stack COMMAND Manage Docker stacks Commands: deploy Deploy a new stack or update an existing stack ls List stacks ps List the tasks in the stack rm Remove one or more stacks services List the services in the stack Run 'docker stack COMMAND --help' for more information on a command.
什麼是stack
呢?它其實是一個或多個具有緊密關係的服務的集合。舉個例子,我們部署一個網站,可能包括web, api, mysql, redis
等服務,通過它們的緊密配合,網站才能正常執行起來,stack就像例子中地網站的概念。
通過docker stack deploy -c docker-compose.yml first-stack
命令來部署服務:
$ docker stack ls
NAME SERVICES
first-stack 1
$ docker stack ps first-stack
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
9a5un2j3gf60 first-stack_http.1 nandy/show-host-info:v1 host02 Running Running 36 seconds ago
k73s9ycn5dyd first-stack_http.2 nandy/show-host-info:v1 host02 Running Running 36 seconds ago
我們可以看到,新的名為first-stack
的stack和名為first-stack_http
的service已經正常在執行,通過前幾篇文章中介紹的docker service --help
也可以檢視:
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
te7sryp3cufn first-stack_http replicated 2/2 nandy/show-host-info:v1 *:82->80/tcp
$ docker service ps first-stack_http
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERRO PORTS
9a5un2j3gf60 first-stack_http.1 nandy/show-host-info:v1 host02 Running Running 3 minutes ago
k73s9ycn5dyd first-stack_http.2 nandy/show-host-info:v1 host02 Running Running 3 minutes ago
first-stack_http
其實就是之前的http
服務,只是這次加了名為first-stack
的字首,並通過_
下劃線分開,命名規則為{stack-name}_{service-name}
。
3. 檔案說明
docker-compose.yml
檔案主要分為4個模組:
version
,代表【版本】,有v1, v2, v3
三個大版本以及各個小版本如v2.1, v3.4
,版本意味著語法升級、新功能、不相容等。services
,代表【服務】,有多少個服務就有多少個子服務,如web, api, mysql, redis
等。volumes
,代表【儲存】,這取決於服務是否需要在Swarm節點中儲存資料,如示例中的http
服務不需要儲存,因此就沒有。networks
,代表【網路】,有3種建立方式,提前建立、指定建立、預設建立,每個服務都會註冊到對應的網路之中。
可以看出,version, services
必填,volumes, networks
可以預設,但含義不同,儲存預設代表資料不用儲存,網路預設任會建立預設網路{stack-name}_default
。
總結一下,docker-compose.yml
檔案其實是把docker CLI
的命令通過yaml
檔案的格式組織起來,不僅方便檢視、傳輸,還有利於版本控制。但檔案和命令兩種形式在部分語法上還有細微的差別,只有逐漸掌握之後才能熟練編寫。
YAML檔案格式,詳見wiki;STACK檔案語法說明,詳見docker stack deploy;CLI命令建立服務,詳見docker create。