開發者 Docker 指南:映像檔、容器與 Compose
作為開發者,您可能經常遇到環境不一致的困擾:「在我的機器上可以運行啊!」Docker 透過將應用程式打包成容器來解決這個問題。本指南將解釋 Docker 映像檔、容器和 Compose,幫助您一致地建置、交付和運行應用程式。
什麼是 Docker?
Docker 是一個用於在容器中開發、交付和運行應用程式的平台。容器是輕量、獨立、可執行的套件,包含運行軟體所需的一切:程式碼、執行環境、系統工具、程式庫和設定。
映像檔 vs. 容器
映像檔是一個唯讀範本,包含建立容器的指令。容器是映像檔的可執行實例。您可以從同一個映像檔建立多個容器,每個容器彼此隔離。
使用映像檔
映像檔是從 Dockerfile 建置的,Dockerfile 是一個包含指令的文字檔。以下是一個簡單的 Node.js 範例:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
使用以下指令建置映像檔:
docker build -t my-app .
列出映像檔:docker images
運行容器
從映像檔啟動容器:
docker run -d -p 3000:3000 --name my-container my-app
這會以分離模式(-d)運行容器,映射埠 3000,並將其命名為 my-container。
列出運行中的容器:docker ps
停止容器:docker stop my-container
移除容器:docker rm my-container
為什麼要使用 Docker Compose?
當您的應用程式依賴多個服務(資料庫、快取等)時,管理單個容器會變得繁瑣。Docker Compose 讓您使用 YAML 檔案定義和運行多容器應用程式。
Compose 檔案範例
建立 docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
啟動所有服務:docker compose up -d
停止並移除:docker compose down
開發者最佳實踐
- 使用 .dockerignore:排除不必要的檔案(node_modules、.git)以加速建置。
- 多階段建置:透過分離建置和運行階段,保持生產映像檔精簡。
- 利用快取:將 Dockerfile 指令從最少變化到最頻繁變化排序。
- 正確標記映像檔:在生產環境中避免使用
latest;使用語意化版本。 - 掃描漏洞:使用
docker scan檢查映像檔是否有已知問題。
常用指令速查表
| 指令 | 說明 |
|---|---|
docker build -t name . | 從 Dockerfile 建置映像檔 |
docker run -p host:container image | 運行容器並映射埠 |
docker ps -a | 列出所有容器 |
docker exec -it container bash | 在運行中的容器內開啟 shell |
docker compose up | 啟動 Compose 檔案中定義的服務 |
docker compose logs -f | 追蹤所有服務的日誌 |
常見問題
映像檔和容器有什麼區別?
映像檔是靜態範本;容器是該映像檔的運行實例。您可以從一個映像檔建立多個容器。
什麼時候應該使用 Docker Compose?
當您的應用程式需要多個服務(例如網頁伺服器、資料庫、快取)一起運行時,請使用 Compose。它簡化了開發和測試的協作。
如何在 Docker 中持久化資料?
使用卷冊或綁定掛載。卷冊由 Docker 管理並儲存在專用區域;綁定掛載連結到主機目錄。兩者都能在容器重新啟動後保留資料。
準備好簡化您的 Docker 工作流程了嗎?試試我們的 Nginx 日誌分析器 來快速除錯容器日誌。