Compose 運作方式

使用 Docker Compose 時,您需利用 YAML 設定檔(稱為 Compose 檔案)來設定應用程式的服務,然後透過 Compose CLI 建立並啟動設定檔中的所有服務。

Compose 檔案(即 compose.yaml 檔案)遵循 Compose 規範 (Compose Specification) 中定義多容器應用程式的規則。這是 Docker Compose 對正式 Compose 規範 的實作。

應用程式的運算組件被定義為服務 (services)。服務是一個抽象概念,透過在平台上執行相同容器映像檔與設定一次或多次來實現。

服務之間透過網路 (networks)進行通訊。在 Compose 規範中,網路是一種平台功能抽象,用於在連線的服務容器之間建立 IP 路由。

服務將持久性資料儲存並共用至儲存卷 (volumes) 中。本規範將此類持久性資料描述為具有全域選項的高階檔案系統掛載。

某些服務需要依賴於執行環境或平台的設定資料。為此,規範定義了一個專用的設定 (configs)概念。從容器內部來看,設定的行為類似於儲存卷——它們被掛載為檔案。然而,設定在平台層級的定義方式有所不同。

機密 (secret) 是一種針對敏感資料的特定設定資料類型,在沒有安全考量的情況下不應公開。機密作為掛載到容器中的檔案提供給服務使用,但提供敏感資料的平台特定資源有其獨特性,因此在 Compose 規範中有明確的概念與定義。

注意

透過儲存卷、設定與機密,您可以在頂層進行簡單的宣告,然後在服務層級加入更多特定平台的資訊。

專案 (project) 是應用程式規範在平台上的個別部署。專案名稱(使用頂層 name 屬性設定)用於將資源分組,並將其與其他應用程式或同一 Compose 指定應用程式但具備不同參數的安裝進行隔離。如果您要在平台上建立資源,必須在資源名稱前加上專案前綴,並設定 com.docker.compose.project 標籤。

Compose 提供了一種設定自訂專案名稱並覆寫該名稱的方法,因此同一個 compose.yaml 檔案可以在不進行變更的情況下,僅透過傳遞不同的名稱,即可在同一基礎架構上部署兩次。

Compose 檔案

Compose 檔案的預設路徑為位於工作目錄中的 compose.yaml(建議)或 compose.yml。為了向後相容舊版本,Compose 也支援 docker-compose.yamldocker-compose.yml。若兩者皆存在,Compose 會優先採用標準的 compose.yaml

您可以使用片段 (fragments)擴充 (extensions)來保持 Compose 檔案的高效與易於維護。

多個 Compose 檔案可以合併 (merged)在一起以定義應用程式模型。YAML 檔案的組合是透過根據您設定的 Compose 檔案順序附加或覆寫 YAML 元素來實現的。簡單屬性與映射 (maps) 會被順序最優先的 Compose 檔案覆寫,列表 (lists) 則會透過附加方式合併。當合併的補充檔案位於其他資料夾中時,相對路徑會根據第一個 Compose 檔案的父資料夾來解析。由於某些 Compose 檔案元素可以表示為單一字串或複雜物件,因此合併適用於展開後的格式。更多資訊,請參閱使用多個 Compose 檔案

如果您想要重複使用其他 Compose 檔案,或是將應用程式模型的部分內容拆分到個別的 Compose 檔案中,也可以使用 include。如果您的 Compose 應用程式依賴於由不同團隊管理,或需要與他人共用的其他應用程式,這將非常有用。

CLI

Docker CLI 讓您可以透過 docker compose 指令及其子指令與您的 Docker Compose 應用程式互動。如果您使用 Docker Desktop,Docker Compose CLI 已預設包含在內。

使用 CLI,您可以管理定義在 compose.yaml 檔案中的多容器應用程式生命週期。CLI 指令讓您能夠輕鬆地啟動、停止與設定您的應用程式。

關鍵指令

若要啟動 compose.yaml 檔案中定義的所有服務:

$ docker compose up

若要停止並移除正在執行的服務:

$ docker compose down 

如果您想要監控執行中容器的輸出並進行除錯,可以使用以下指令檢視日誌:

$ docker compose logs

若要列出所有服務及其當前狀態:

$ docker compose ps

欲取得所有 Compose CLI 指令的完整列表,請參閱參考文件

說明範例

以下範例說明了上述的 Compose 概念。該範例僅供說明,非規範性範例。

考慮一個拆分為前端網頁應用程式與後端服務的應用程式。

前端在執行時期由基礎架構管理的 HTTP 設定檔進行設定,提供外部網域名稱,並注入由平台安全機密儲存庫提供的 HTTPS 伺服器憑證。

後端將資料儲存在持久性儲存卷中。

兩個服務在隔離的後端網路 (back-tier network) 上相互通訊,同時前端也連接到前端網路 (front-tier network) 並對外開放 443 連接埠。

Compose application example

範例應用程式包含以下部分:

  • 兩個服務,由 Docker 映像檔提供支援:webappdatabase
  • 一個機密(HTTPS 憑證),注入到前端
  • 一個設定(HTTP),注入到前端
  • 一個持久性儲存卷,掛載到後端
  • 兩個網路
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

接下來

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.