7.8 打包所有服務
在過去的幾個小節中,我們都是透過輸入指令的方式來建立 service,這就會遇到和 Docker Compose 相同的問題,當服務越來越多,每次都要輸入相同的指令是強人所難,這時候我們可以接續的 docker-compose.yml 的概念來撰寫 Swarm 的預期狀態檔案,其實有許多的語法都和 Docker Compose 相同,唯一不一樣的就是加入了 deploy 這個參數。
以上一個小節的 Drupal 搭配 PostgreSQL 來做範例,寫成一個 YAML 檔案,並且一鍵啟動服務。
version: '3.9'
services:
drupal:
image: drupal:7.92
secrets:
- source: my_secret
target: /my_secret
networks:
- dev
ports:
- 80:80
deploy:
replicas: 1
restart_policy:
condition: on-failure
pg:
image: postgres:14-alpine
configs:
- source: my_config
target: /my_config
volumes:
- pg:/var/lib/postgresql/data
networks:
- dev
environment:
- POSTGRES_PASSWORD=password
deploy:
replicas: 1
restart_policy:
condition: on-failure
placement:
constraints: [node.id == 您的節點 ID]
secrets:
my_secret:
external: true
configs:
my_config:
external: true
volumes:
pg:
external: true
networks:
dev:
external: true
大部分的參數相信在 Docker Compose 的章節都有介紹過,今天就著重在 deploy 內的參數,deploy 內的參數只有在 Swarm 模式下有用,若是使用 docker compose up
去執行這份檔案,不僅會直接略過這些參數的,而且還會因為 Docker Compose 不支援 secret 以及 config 物件而出錯。
secret 以及 config 都在上一個小節介紹了,轉成 YAML 的寫法其實和 CLI 是一模一樣的,至於 external 在 Docker Compose 的章節就有解釋過了。
replicas 則是副本,這在前面小節也不斷地使用,至於 restart_policy 就是 Docker Compose 寫的 restart,只是在 Swarm 模式下稍微的囉唆一點,且要放在 deploy 內。
大部分都是把 CLI 直接轉成 YAML 的格式,在官方的文件中可以找到全部的寫法,重點還是如何靈活運用是最重要的。
像我一開始使用時,就不知道寫在 YAML 內的 constraints 前面還需要加上 placement 的參數,但其實官方文件就有了,所以認真的閱讀官方文件很重要,一本書很難把所有的情境都涵蓋,了解基礎的使用方式,才能擴大使用的範圍。
如何一鍵啟動?
在 Docker Compose 的章節,我們使用 docker compose up
作為啟動多個容器的方式,而在 Swarm 模式下,docker compose up
這段指令就派不上用場了,要轉而使用 docker stack deploy
這段指令。
root@ubuntu-s-1vcpu-512mb-10gb-sgp1-01:~# docker stack deploy --compose-file docker-compose.yml dev <- 不換行
Creating service dev_drupal
Creating service dev_pg
--compose-file
則為定義預期狀態的 YAML 檔案,不一定要叫做 docker-compose.yml。
而最後的參數則為這個 stack 的命名,可以根據這個 stack 所作的事情來命名。
可以看到 stack 最終的結果還是建立了兩個 service,所以一開始也不需要想得太過複雜,它就是 Swarm 模式下結合多個 service 的方法。
所以到底什麼是 stack 呢?使用上很像 Docker Compose,就是把整個應用程式的預期狀態放入一個 stack 內,並且交由 Docker Swarm 全權處理,如下圖所示: