在正式進入 Log 的研究之前,我們先來個 Docker Compose 的回顧,
為什麼要特別提 Docker Compose 呢?
因為就我目前的使用經驗,Docker Compose 就像是在編寫 Docker Container 的骨架,
如果看懂了 Docker Compose 的架構,即使設定檔有很多可以使用的參數,也不會太難理解,
因此,如果要推薦 Docker 的入門者一件事,我認為就是提供他 Docker Compose 的範例,讓他跑跑看 Docker,會比自己呼叫 Docker CLI 建立 Container 來得愉快許多。
讀者還記得我在 D7 - Docker 概念架構 的架構圖嗎?
我認為 Docker 在使用上有這些關鍵的子系統,
其中,Docker Compose 的功能就是把這些子系統組織起來,並編寫成設定檔,
透過這個設定檔,定義出這組 Container 之間的關聯,
例如哪個 container 綁定了哪個路徑 (Volume)、哪兩個 container 共享了同一個網路 (Network) 等等,
在定義好之後,使用 docker compose up
就能把這一整組服務跑起來,
當然還有關閉、暫停、查看等等的指令,
這組服務的 container 接下來就可以很容易地被重啟、複製、或再現。
--project-name
讀者可以先想一下,如果如果我有兩個資料夾,都用了相同內容的 docker-compose.yml,那會怎麼樣呢?
.
├── ProjectA
│ └── backend
│ └── docker-compose.yml
└── ProjectB
└── backend
└── docker-compose.yml
答案是,使用 Docker Compose 時,ProjectA 跟 ProjectB 的 backend 只會建立一組 Docker 資源,
換句話說,ProjectA 所啟動的 container,也會被 ProjectB 認為是它所啟動的,
這個情境會發生在,當我只有一台 Server,但我想要建立出多個獨立的環境給不同使用者做測試時,
例如 dev 環境給開發者們、staging 環境給客戶、production 環境給真實的使用者,
使用的網域、資料庫、Port 可能都是獨立的,
因此我在前陣子才發現 Docker Compose 也有提供了一個方便的參數,專門處理這個情境,
使用 Docker Compose 指令時,可以加入參數 --project-name <project_name>
(-p
),
用來定義這組 Docker 及相關資源的命名都加入 project_name 來作為前綴,
如此一來,即使是同一個定義檔,Docker Compose 也能啟動兩組互不干涉的 Container。
(這裡小心,如果 Volume 的路徑相同,還是會互相干擾)
如果要講到 YAML 中的各種參數細節,這一點篇幅大概是寫不完的,
但可以抓到一個大方向,
在第一層的關鍵字有:
version
services
volumes
networks
configs
& secrets
version
定義了 Docker Compose 應支援的版本,services
定義各個 container 及詳細內容與關聯,volumes
跟 networks
定義共用的資源,configs
跟 secrets
定義共同的設定或外部資料,
這些內容其實也都是 Docker CLI 能做的事情,像是 docker run
或 docker volume create
,
剩下的,就是要使用時把規則查清楚,就像查表或翻字典一樣。
這裡,就讓我附上一些官方文件來結束這一回合。
首先可以快速瀏覽 Docker Compose Overview,瞭解一下整體架構跟重點,
接著到 Compose Specification 查看在 YAML 中可以定義的參數,
最後是 Overview of docker compose CLI,編列了 Docker Compose 可以使用的行為跟參數,
參數的小細節實在太多,我就偷懶讓大家自己去發現了,
那我們明天見,繼續回到 Log 的議題上。