1. 程式人生 > >Docker Swarm系列——5.Swarm服務檔案

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 deploycompose 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