0%

Docker Compose:輕鬆管理多個容器

在現代應用開發中,微服務架構已成為主流,而 Docker 提供了優秀的 Containerlize 解決方案。但當需要同時管理多個 Container 時,手動啟動與配置每個 Container 可能得繁瑣,這時候 Docker Compose 就派上用場。本文將介紹 Docker Compose 的基本概念、使用方式以及實際應用場景,幫助您快速掌握這項工具。

什麼是 Docker Compose?

Docker Compose 是一個用來定義和管理多個 Docker Container 的工具。透過編寫 docker-compose.yml 檔案,可以使用簡單的命令來同時啟動、停止和協調多個 Container,讓應用程式各組件能夠順暢的一同運作。

優勢

  • 簡化多個 Container 管理:使用 YAML 文件一次性定義所有 Container ,省去繁瑣的指令操作。
  • 環境一致性:確保開發、測試、部署環境一致。
  • 自動化服務啟動:設定依賴關係,按順序啟動 Container 。
  • 支援擴展性:輕鬆擴展或縮小 Container 數量,適應不同需求。

基本架構

docker-compose.yml 文件包含以下幾個部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '1'
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
ports:
- "3306:3306"
  • version: 指定 Compose 文件的版本。
  • services: 定義應用服務,EX: web(NGINX)與 db(MySQL)。
  • image: 指定使用的 Docker image。
  • ports: 將容器內部 Port 映射到主機。
  • volumes: 掛載主機目錄到容器內。
  • environment: 設置環境變數,例如 MySQL 的 root 密碼。

基本指令

啟動與管理容器

指令 功能說明
docker-compose up 啟動所有服務
docker-compose up -d 以背景模式運行容器
docker-compose down 停止並移除所有容器
docker-compose ps 查看運行中容器的狀態
docker-compose logs 查看容器日誌
docker-compose restart 重新啟動服務
docker-compose build 建立 image 檔,通常用於自定義 Dockerfile

使用範例

範例:簡單的 LAMP 環境(Linux + Apache + MySQL + PHP)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: '3.8'
services:
apache:
image: httpd:latest
ports:
- "8080:80"
volumes:
- ./www:/usr/local/apache2/htdocs/
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: rootpass
ports:
- "3306:3306"
php:
image: php:7.4-apache
volumes:
- ./www:/var/www/html/

啟動該應用環境:

1
docker-compose up -d

瀏覽 http://localhost:8080,即可看到運行的網站。

應用場景

Docker Compose 適合以下情境:

  • 開發與測試環境搭建:快速啟動所需服務(EX: 資料庫、快取、API)。
  • CI/CD 自動化測試:在 CI/CD 流水線中管理多個微服務。
  • 本機模擬雲端架構:模擬實際部署環境,提升開發一致性。

進階功能介紹

多環境配置

可以使用多個 Compose 文件來管理不同的環境,例如:

1
docker-compose -f docker-compose.dev.yml up

擴展與縮放

使用以下指令快速擴展服務數量:

1
docker-compose up --scale web=3

常見問題與除錯

Container 啟動失敗

  • 檢查 docker-compose logs 取得詳細錯誤資訊。
  • 確保 YAML 文件格式正確,避免縮排錯誤。

Port 衝突

  • 確保主機 Port 未被其他應用佔用,或修改 ports 設定。

無法連接容器間服務

  • 使用服務名稱而非 IP,例如 db 連接 mysql 而非 localhost