開發者必學 Docker:映像檔、容器與 Compose
你可能聽過 Docker 能簡化開發流程,但初次接觸 映像檔 (images)、容器 (containers) 和 Docker Compose 這些術語時,可能會覺得一頭霧水。本指南將化繁為簡,帶你了解如何在專案中有效運用 Docker。
Docker 是什麼?為何你該關注?
Docker 是一個平台,能將應用程式及其相依性打包成標準化單元,稱為容器 (container)。容器輕量、可攜,且彼此隔離。它們解決了經典的「在我的機器上可以運作」問題,確保應用程式在任何環境中都能以相同方式運行。
與虛擬機不同,容器共享主機作業系統核心,因此啟動更快、效率更高。這就是 Docker 成為現代開發與部署流程要角的原因。
映像檔 vs. 容器:建構基礎
映像檔 (image) 是唯讀範本,包含應用程式程式碼、執行環境、函式庫與設定。容器 (container) 則是映像檔的執行實例。可以把映像檔想成類別 (class),容器則是物件 (object)。
你使用 Dockerfile 建立映像檔。以下是 Node.js 應用程式的簡單範例:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Dockerfile 中的每一行都會建立一個層 (layer)。層會被快取,因此只有後續步驟變更時,重建速度會更快。
常用 Docker 指令
docker build -t my-app .— 從當前目錄建立映像檔docker run -p 3000:3000 my-app— 執行容器並對應連接埠docker ps— 列出執行中的容器docker stop <container_id>— 停止容器docker rmi <image_id>— 移除映像檔
Docker Compose:管理多容器應用程式
真實世界的應用程式通常需要多個服務:網頁伺服器、資料庫、快取。Docker Compose 讓你用單一 YAML 檔案定義並執行多容器應用程式。
以下是搭配 PostgreSQL 與 Redis 的 Node.js 應用程式的 docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
cache:
image: redis:7
volumes:
pgdata:
執行 docker compose up,所有服務會一起啟動。depends_on 確保資料庫與快取在網頁服務之前啟動。
重要 Compose 指令
docker compose up -d— 在分離模式下啟動所有服務docker compose down— 停止並移除容器、網路docker compose logs -f web— 追蹤特定服務的日誌docker compose exec web sh— 在執行中的容器內開啟 shell
開發最佳實踐
- 使用 .dockerignore 將 node_modules、.git 及其他不必要檔案排除在建置情境之外。
- 保持映像檔精簡,使用基於 Alpine 的映像檔與多階段建置。
- 不要以 root 身分執行 — 在 Dockerfile 中建立非 root 使用者以提升安全性。
- 使用 volume 保存持久性資料,並在開發時使用 bind mount 實現即時程式碼重載。
- 固定版本,在 Dockerfile 與 Compose 檔案中指定版本,避免非預期的更新。
何時使用 Docker(以及何時不該用)
當你需要跨團隊一致的環境、輕鬆管理相依性,或微服務架構時,Docker 表現出色。對於簡單的靜態網站或腳本,可能顯得殺雞用牛刀。請根據專案複雜度與部署需求來評估。
常見問題
映像檔與容器有何不同?
映像檔是靜態範本;容器是該映像檔的執行實例。你可以從同一個映像檔執行多個容器。
單一容器也需要 Docker Compose 嗎?
不需要,單一容器可使用 docker run。當你有多個需要互相通訊的服務時,Compose 才實用。
如何在 Docker 中保存資料?
使用 volume 或 bind mount。Volume 由 Docker 管理,適合資料庫;bind mount 將主機目錄對應到容器內,適合開發使用。
準備好最佳化你的 Docker 應用程式了嗎?如果你正在處理容器內的 Nginx 日誌,試試我們的 Nginx 日誌分析器,快速解析與分析日誌。