Docker - Compose



Docker Compose 是一種專門設計用於簡化多容器 Docker 應用程式管理的工具。它使用 YAML 檔案來描述應用程式所需的的服務、網路和卷的定義。

基本上,透過 **docker-compose.yml** 檔案,我們定義每個容器的配置:構建上下文、環境變數、要公開的埠以及服務之間的關係。執行所有定義的服務可以透過一個命令 **docker-compose up** 來完成,確保它們能夠協同工作。

Docker Compose 的關鍵概念

Docker Compose 引入了一些必要的關鍵概念,以便有效地理解和使用該工具。這些概念包括用 YAML 編寫的 Docker Compose 檔案的架構、服務、網路、卷和環境變數。讓我們討論一下每個概念。

Docker Compose 檔案機制(YAML)

通常,Docker Compose 檔案將是一個使用 YAML 的 docker-compose.yml 檔案。該檔案描述了應用程式可能需要的關於服務、網路和卷的配置。它提供了一個指南,用於啟動應用程式將在其下執行的環境。理解此檔案的結構對於有效地使用 Docker Compose 至關重要。

YAML 檔案的關鍵元素

  • **版本** - 這定義了 Docker Compose 檔案的格式,以確保與不同的 Docker Compose 功能相容。
  • **服務** - 包含構成應用程式的所有服務的列表(容器)。每個服務都使用無數的配置選項進行描述。
  • **網路** - 它將指定用於容器間通訊的自定義網路,並可能指定配置選項和網路驅動程式。
  • **卷** - 宣告用於允許持久儲存的共享卷。卷可以在服務之間共享,或用於在容器生命週期之外儲存資料。

示例

version: '3.8'
services:
   web:
      image: nginx:latest
      ports:
         - "80:80"
      volumes:
         - web-data:/var/www/html
      networks:
         - webnet

   database:
      image: mysql:latest
      environment:
         MYSQL_ROOT_PASSWORD: example
      volumes:
         - db-data:/var/lib/mysql
      networks:
         - webnet

networks:
   webnet:
      driver: bridge

volumes:
   web-data:
   db-data:
Docker Compose File Mechanism (YAML)

Docker Compose 服務

Docker Compose 中的服務表示構成使用者應用程式的容器。每個服務都在 `docker-compose.yml` 檔案的 `services` 部分中定義,並具有其配置,例如要使用的 Docker 映象、環境中的變數、埠、卷和網路設定。

關鍵服務配置選項

  • **映象** - 此欄位指定應用於服務的 Docker 映象。
  • **構建** - 指定構建上下文的目錄,從而允許指定建立映象或不從登錄檔中拉取映象。
  • **埠** - 將主機埠對映到容器。
  • **卷** - 將卷附加到您的服務以進行持久儲存。
  • **環境** - 服務環境變數。
  • **Depends_on** - 定義服務依賴項,以便它們按適當的順序啟動。

示例

services:
   app:
      image: myapp:latest
      build: .
      ports:
         - "8080:80"
      volumes:
         - app-data:/usr/src/app
      environment:
         - NODE_ENV=production
      depends_on:
         - db

   db:
      image: postgres:latest
      environment:
         POSTGRES_PASSWORD: example

Docker Compose 網路

Docker Compose 網路允許服務之間進行通訊。預設情況下,Docker Compose 為 **docker-compose.yml** 中描述的所有服務定義了一個單一網路。但是,您可以定義自己的自定義網路以更好地控制服務間通訊。

最佳網路配置選項

  • **驅動程式** - 這指定要用於網路的驅動程式(例如,橋接、覆蓋)。
  • **driver_opts** - 網路驅動程式的選項。
  • **ipam** - 指定 IP 地址管理配置,如子網和 IP 範圍。

示例

networks:
   frontend:
      driver: bridge
   backend:
      driver: bridge

services:
   web:
      networks:
         - frontend

   api:
      networks:
         - frontend
         - backend

   db:
      networks:
         - backend

Docker Compose 卷

Docker Compose 使用捲來持久化 Docker 容器建立或使用的的資料。**docker-compose.yml** 檔案中的 **volumes** 部分定義了附加到服務的所有卷,用於以其生命週期存在於容器之外的方式儲存資料。

關鍵卷配置選項

  • **外部** - 指示卷是否在 Docker Compose 外部建立。
  • **驅動程式** - 指定要使用的卷驅動程式。
  • **Driver_opts** - 配置卷驅動程式的選項。

示例

volumes:
   db-data:
   app-data:
      external: true

services:
   database:
      image: postgres:latest
      volumes:
         - db-data:/var/lib/postgresql/data

   app:
      image: myapp:latest
      volumes:
         - app-data:/usr/src/app

Docker Compose 環境變數

環境變數可用於 Docker Compose 中,以將配置設定傳遞到服務中。這些變數可以在服務配置中作為 `environment` 部分的一部分進行定義,或從外部檔案載入。

設定環境變數的基本方法

  • **內聯** - 在服務定義中註冊環境變數。
  • **env_file** - 此命令允許從外部檔案載入環境變數。

示例

services:
   web:
      image: myapp:latest
      environment:
         - NODE_ENV=production
         - API_KEY=12345

   database:
      image: postgres:latest
      env_file:
         - .env

在 .env 檔案中 -

POSTGRES_USER=myuser
POSTGRES_PASSWORD=mypassword
POSTGRES_DB=mydatabase

透過紮實地理解這些基本原理,開發人員能夠很好地使用 Docker Compose 來管理和編排在 Docker 容器數量方面非常複雜和龐大的應用程式。

重要的 Docker Compose 命令

Docker Compose 是一個用於管理 Docker 應用程式的工具,它提供了有用的命令和操作,例如啟動、停止、構建、執行或對一個或多個容器執行其他操作。在本節中,讓我們瞭解必要的 Docker Compose 命令,並附帶示例。

Docker Compose Up 命令

**docker-compose** up 命令啟動並執行整個應用程式(如 **docker-compose.yml** 檔案中定義的那樣),同時建立並啟動所有服務、網路和卷。此外,如果該服務的映象從未構建過,它會構建必要的 Docker 映象。

示例

$ docker-compose up
Docker Compose Up Command

Docker Compose Down 命令

命令 **`docker-compose down`** 停止並刪除 `docker-compose.yml` 檔案中定義的所有容器、網路和卷。因此,此命令有助於清理應用程式迄今為止佔用的資源,從某種意義上說,您可以確保沒有殘留的容器或網路在某個地方繼續執行。

$ docker-compose down
Docker Compose Down Command

Docker Build 命令

此命令用於為 `docker-compose.yml` 檔案中定義的服務構建或重建 Docker 映象。當 Dockerfile 或原始碼發生更改時,它會執行;需要建立新的映象。

示例

$ docker-compose build

Docker Compose Start、Stop、Restart 命令

  • **`docker-compose start`** 將啟動已建立的容器,而無需重新建立它們,從而啟動先前停止的服務。
  • **`docker-compose stop`** 停止當前正在執行的容器,而不會丟棄它們;因此,以後可以重新啟動服務。
  • **`docker-compose restart`** 在您對環境或配置進行了更改並希望重新啟動它們時非常有用。

示例

$ docker-compose start
$ docker-compose stop
$ docker-compose restart
Docker Compose Start, Stop, Restart Commands

Docker Compose Status 命令

**docker-compose ps** 命令顯示 **docker-compose.yml** 檔案中定義的所有服務的狀況,指出容器的狀況、名稱、狀態和埠。此命令用於檢查服務的當前狀態。

示例

$ docker-compose ps
Docker Compose Status Command

Docker Compose Logs 命令

命令 **`docker-compose logs`** 獲取並顯示定義 `docker-compose.yml` 中服務的日誌的捆綁包。它對於除錯和監控應用程式至關重要,因為這主要涉及執行容器的即時輸出。

示例

$ docker-compose logs
Docker Compose Logs Command

Docker Compose Exec 命令

**docker-compose exec** 命令在正在執行的服務容器中執行任意命令。這對於在應用程式內執行系統命令或直接在容器內執行指令碼非常方便。

示例

$ docker-compose exec <service_name> <command>
$ docker-compose exec web bash
Docker Compose Exec Command

結論

總之,Docker Compose 是一個不可或缺的工具,用於管理多容器 Docker 應用程式,它既可以簡化基本設定,又可以為更復雜的場景提供強大的功能。

無論您是在本地開發、部署到生產環境還是與 CI/CD 管道整合,Docker Compose 都提供了靈活性和控制力,以便有效地管理容器化應用程式。

關於 Docker Compose 的常見問題

1. Docker Compose 如何處理服務之間的依賴關係?

當在 yml 檔案中使用 **depends_on** 屬性時,Docker Compose 會自動解決服務之間的依賴關係。如果一個服務依賴於另一個服務(例如,Web 伺服器和資料庫),Compose 會先啟動被依賴的服務,確保依賴項啟動並執行,然後再啟動依賴的服務。這意味著無需手動干預,並且應用程式的啟動過程非常流暢。

2. 我可以在生產環境中使用 Docker Compose 嗎?

雖然 Docker Compose 主要用於開發和測試,但在生產環境中也可以使用,但需要注意一些問題。Compose 確實簡化了應用程式的部署和擴充套件,但它缺乏大型生產環境所需的某些功能:例如負載均衡和滾動更新。在生產環境中,對於編排和管理大規模、高可用性的容器化應用程式,請考慮使用 Docker Swarm 或 Kubernetes 等工具。

廣告

© . All rights reserved.