Compose 的工作原理

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

Compose 檔案或 `compose.yaml` 檔案遵循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 應用程式依賴於由不同團隊管理的其他應用程式,或者需要與他人共享,這將非常有用。

命令列介面

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 概念。該示例不具有規範性。

考慮一個分為前端 Web 應用程式和後端服務的應用程式。

前端在執行時使用基礎設施管理的 HTTP 配置檔案進行配置,該配置檔案提供外部域名,以及平臺安全金鑰儲存注入的 HTTPS 伺服器證書。

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

兩個服務透過隔離的後端網路相互通訊,而前端也連線到前端網路並暴露埠 443 供外部使用。

Compose application example

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

  • 兩個服務,由 Docker 映象支援:`webapp` 和 `database`
  • 一個秘密(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` 命令啟動 `frontend` 和 `backend` 服務,建立必要的網路和卷,並將配置和秘密注入到 `frontend` 服務中。

`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

接下來做什麼