Compose 的運作方式
使用 Docker Compose 時,您會使用 YAML 設定檔(稱為 Compose 檔案)來設定應用程式的服務,然後使用 Compose CLI 從您的設定建立並啟動所有服務。
Compose 檔案或 `compose.yaml` 檔案遵循 Compose 規格 中提供的規則來定義多容器應用程式。這是 Docker Compose 對正式 Compose 規格 的 Docker Compose 實作。
應用程式的運算元件定義為 服務。服務是一個抽象概念,透過執行相同的容器映像檔和設定一次或多次在平台上實作。
服務透過 網路 彼此通訊。在 Compose 規格中,網路是一種平台功能抽象化,可在連線在一起的服務內的容器之間建立 IP 路由。
服務將持續性資料儲存並共用到 磁碟區 中。規格將此類持續性資料描述為具有全域選項的高階檔案系統掛載。
某些服務需要依賴執行階段或平台的設定資料。為此,規格定義了專用的 設定 概念。從服務容器的角度來看,設定與磁碟區相當,因為它們是掛載到容器中的檔案。但實際定義涉及不同的平台資源和服務,這些資源和服務由此類型抽象化。
密鑰 是一種特殊類型的設定資料,適用於不應在沒有安全考量的情況下公開的敏感資料。密鑰以檔案的形式提供給服務,並掛載到其容器中,但提供敏感資料的平台特定資源非常特殊,因此在 Compose 規格中應有不同的概念和定義。
**注意**
使用磁碟區、設定和密鑰,您可以在頂層進行簡單宣告,然後在服務層新增更多平台特定資訊。
專案是在平台上個別部署應用程式規格。專案名稱(使用頂層 `name` 屬性設定)用於將資源分組在一起,並將它們與其他應用程式或使用不同參數安裝的相同 Compose 指定應用程式隔離。如果您正在平台上建立資源,則必須在資源名稱前面加上專案名稱,並設定標籤 `com.docker.compose.project`。
Compose 提供一種方法讓您設定自訂專案名稱並覆蓋此名稱,以便只需傳遞不同的名稱,即可在相同的基礎架構上部署兩次相同的 `compose.yaml` 檔案,而無需進行任何變更。
Compose 檔案
Compose 檔案的預設路徑是放置在工作目錄中的 `compose.yaml`(首選)或 `compose.yml`。Compose 也支援 `docker-compose.yaml` 和 `docker-compose.yml`,以確保與早期版本向下相容。如果兩個檔案都存在,Compose 會優先使用標準的 `compose.yaml`。
您可以使用 片段 和 擴充功能 來保持 Compose 檔案的效率和易於維護。
可以將多個 Compose 檔案 合併 在一起以定義應用程式模型。YAML 檔案的組合是透過根據您設定的 Compose 檔案順序附加或覆蓋 YAML 元素來實作的。簡單的屬性和映射會被最高順序的 Compose 檔案覆蓋,清單會透過附加來合併。每當合併的補充檔案託管在其他資料夾中時,相對路徑都會根據第一個 Compose 檔案的父資料夾來解析。由於某些 Compose 檔案元素可以表示為單個字串或複雜物件,因此合併適用於展開的表單。如需詳細資訊,請參閱 使用多個 Compose 檔案。
如果您想要重複使用其他 Compose 檔案,或將應用程式模型的部分內容分解成單獨的 Compose 檔案,您也可以使用 `include`。如果您的 Compose 應用程式依賴於由不同團隊管理的另一個應用程式,或者需要與其他人共用,則此功能非常有用。
CLI
Docker CLI 讓您可以透過 docker compose
指令及其子指令與 Docker Compose 應用程式互動。使用 CLI,您可以管理在 compose.yaml
檔案中定義的多容器應用程式的生命週期。CLI 指令讓您可以輕鬆地啟動、停止和設定應用程式。
主要指令
要啟動 compose.yaml
檔案中定義的所有服務
$ docker compose up
要停止並移除正在執行的服務
$ docker compose down
如果您想要監控正在執行的容器的輸出並除錯問題,您可以使用以下指令檢視日誌
$ docker compose logs
要列出所有服務及其目前的狀態
$ docker compose ps
如需所有 Compose CLI 指令的完整清單,請參閱參考文件。
說明範例
以下範例說明了上述的 Compose 概念。此範例僅供參考,不具規範性。
考慮一個應用程式,它被拆分為前端 Web 應用程式和後端服務。
前端在執行時會使用由基礎架構管理的 HTTP 設定檔進行設定,提供外部網域名稱,以及由平台的安全密鑰儲存區注入的 HTTPS 伺服器憑證。
後端將資料儲存在永久性磁碟區中。
這兩個服務在隔離的後端網路上彼此通訊,而前端也連接到前端網路,並公開埠 443 供外部使用。


範例應用程式由以下部分組成
- 2 個服務,由 Docker 映像檔支援:
webapp
和database
- 1 個密鑰(HTTPS 憑證),注入前端
- 1 個設定(HTTP),注入前端
- 1 個永久性磁碟區,附加到後端
- 2 個網路
services:
frontend:
image: example/webapp
ports:
- "443:8043"
networks:
- front-tier
- back-tier
configs:
- httpd-config
secrets:
- server-certificate
backend:
image: example/database
volumes:
- db-data:/etc/data
networks:
- back-tier
volumes:
db-data:
driver: flocker
driver_opts:
size: "10GiB"
configs:
httpd-config:
external: true
secrets:
server-certificate:
external: true
networks:
# The presence of these objects is sufficient to define them
front-tier: {}
back-tier: {}
docker compose up
指令會啟動 frontend
和 backend
服務,建立必要的網路和磁碟區,並將設定和密鑰注入前端服務。
docker compose ps
提供服務目前狀態的快照,讓您可以輕鬆查看哪些容器正在執行、其狀態以及它們正在使用的埠
$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
example-frontend-1 example/webapp "nginx -g 'daemon of…" frontend 2 minutes ago Up 2 minutes 0.0.0.0:443->8043/tcp
example-backend-1 example/database "docker-entrypoint.s…" backend 2 minutes ago Up 2 minutes