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 供外部使用。

Compose application example

範例應用程式由以下部分組成

  • 2 個服務,由 Docker 映像檔支援:webappdatabase
  • 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 指令會啟動 frontendbackend 服務,建立必要的網路和磁碟區,並將設定和密鑰注入前端服務。

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

後續步驟