Compose 的工作原理

使用 Docker Compose,您可以使用一個 YAML 配置檔案(稱為 Compose 檔案)來配置應用程式的服務,然後使用 Compose CLI 從您的配置中建立和啟動所有服務。

Compose 檔案(或 compose.yaml 檔案)遵循 Compose 規範 中提供的規則來定義多容器應用程式。這是 Docker Compose 對正式 Compose 規範 的實現。

應用程式的計算元件被定義為 服務。服務是一個抽象概念,在平臺上透過執行相同容器映象和配置(一次或多次)來實現。

服務透過 網路 互相通訊。在 Compose 規範中,網路是平臺能力抽象,用於在連線在一起的服務中的容器之間建立 IP 路由。

服務將持久資料儲存到 並進行共享。規範將這種持久資料描述為具有全域性選項的高階檔案系統掛載。

某些服務需要依賴於執行時或平臺的配置資料。為此,規範定義了一個專門的 配置 概念。從服務容器的角度來看,配置類似於卷,因為它們被掛載到容器中。但實際定義涉及不同的平臺資源和服務,它們被此型別抽象出來。

秘密 是配置資料的一種特殊型別,用於敏感資料,這些資料在沒有安全考慮的情況下不應該被公開。秘密作為掛載到容器中的檔案提供給服務,但提供敏感資料的平臺特定資源足夠獨特,因此在 Compose 規範中值得一個單獨的概念和定義。

注意

使用卷、配置和秘密,您可以在頂級進行簡單的宣告,然後在服務級別新增更多平臺特定資訊。

專案是在平臺上部署應用程式規範的單個例項。專案的名稱(使用頂級 name 屬性設定)用於將資源分組在一起,並將其與其他應用程式或同一 Compose 指定應用程式的其他安裝(具有不同的引數)隔離開。如果要在平臺上建立資源,則必須使用專案作為字首來命名資源,並設定標籤 com.docker.compose.project

Compose 提供了一種方法來設定自定義專案名稱並覆蓋此名稱,因此相同的 compose.yaml 檔案可以在同一基礎設施上部署兩次,無需更改,只需傳遞一個不同的名稱即可。

Compose 檔案

Compose 檔案的預設路徑是 compose.yaml(首選)或 compose.yml,它位於工作目錄中。Compose 也支援 docker-compose.yamldocker-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

下一步