開發者必學 Docker:映像、容器與 Compose
你大概聽過 Docker 和容器,但可能不太確定它們如何融入你的日常開發流程。或者你已經試過 Docker,卻對映像(image)、容器(container)和 Compose 這些概念感到困惑。本指南將透過實用範例帶你掌握必備知識,讓你能在專案中有效運用 Docker。
什麼是 Docker 映像與容器?
把 Docker 映像想成應用程式的藍圖。它包含執行程式碼所需的一切:作業系統、執行環境、函式庫,以及你的應用程式檔案。映像不可變,並且是從 Dockerfile 建置而成。
容器則是映像的執行實例。當你啟動容器時,Docker 會從映像建立一個隔離環境。你可以從同一個映像執行多個容器,每個容器都有自己的狀態。
主要差異
| 映像 | 容器 |
|---|---|
| 唯讀模板 | 可執行的實例 |
| 從 Dockerfile 建置 | 從映像建立 |
| 儲存於登錄檔 | 在主機上執行 |
| 不可變 | 短暫(可停止、啟動、刪除) |
建置你的第一個 Docker 映像
讓我們建立一個簡單的 Node.js 應用程式並將其容器化。首先在專案根目錄建立一個 Dockerfile:
# 使用官方 Node.js 執行環境作為父映像
FROM node:18-alpine
# 設定工作目錄
WORKDIR /app
# 複製 package.json 與 package-lock.json
COPY package*.json ./
# 安裝依賴套件
RUN npm ci --only=production
# 複製其餘應用程式程式碼
COPY . .
# 對外開放應用程式執行的連接埠
EXPOSE 3000
# 定義執行應用程式的指令
CMD ["node", "server.js"]
使用以下指令建置映像:
docker build -t my-node-app .
從映像執行容器:
docker run -p 3000:3000 -d my-node-app
你的應用程式現在可以透過 http://localhost:3000 存取。
管理容器
以下是一些管理容器的重要指令:
docker ps– 列出執行中的容器docker ps -a– 列出所有容器(包括已停止的)docker stop <container_id>– 停止執行中的容器docker rm <container_id>– 移除已停止的容器docker logs <container_id>– 檢視容器日誌docker exec -it <container_id> sh– 在執行中的容器內開啟 shell
用 Docker Compose 簡化多容器應用程式
真實的應用程式通常需要多個服務:網頁伺服器、資料庫、快取等。用個別的 docker run 指令來管理這些服務相當繁瑣。Docker Compose 讓你使用 YAML 檔案定義並執行多容器應用程式。
建立一個 docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=db
depends_on:
- db
db:
image: postgres:15-alpine
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
使用以下指令啟動所有服務:
docker compose up -d
使用以下指令停止並移除它們:
docker compose down
開發最佳實踐
- 使用 .dockerignore 將不必要的檔案(node_modules、.git)排除在建置情境之外。
- 善用層快取:安排 Dockerfile 指令的順序,讓依賴套件在複製原始碼之前先行安裝。
- 使用多階段建置以保持正式環境映像精簡。
- 將資料儲存於磁碟區,以供資料庫及其他有狀態服務使用。
- 使用 Compose 進行本機開發,以複製類似正式環境的設定。
常見問題
映像與容器有何不同?
映像是一個唯讀模板,定義應用程式及其依賴項目。容器則是映像的執行實例,頂部帶有可寫入層。
我可以在正式環境使用 Docker Compose 嗎?
Docker Compose 主要為開發與測試而設計。正式環境請考慮使用 Kubernetes 或 Docker Swarm 等容器编排工具。
如何在 Docker 中保存資料?
使用磁碟區(volume)或綁定掛載(bind mount)。磁碟區由 Docker 管理,是保存容器產生資料的首選方式。
準備好將你的應用程式容器化了嗎?如果你需要將文件或指南轉換為 PDF 給團隊使用,試試我們的 Word 轉 PDF 轉換器,分享精美的文件。