Docker 實用指南:前端開發者的容器化入門

__DevOps
DockerNext.jsDevOpsContainerCI/CD

什麼是 Docker?

Docker 是一個開源的容器化平台,可以將應用程式和其依賴項打包成一個獨立的容器。想像一下,Docker 就像是一個標準化的貨櫃,可以將你的應用程式、資料庫、環境設定等所有需要的東西都裝在裡面,確保在任何地方都能以相同的方式運行。

Docker 的主要優點

  • 一致性:確保開發、測試和生產環境的一致性
  • 隔離性:每個容器都是獨立的,不會互相影響
  • 可移植性:可以在任何支援 Docker 的系統上運行
  • 輕量級:比虛擬機更輕量,啟動更快
  • 版本控制:可以輕鬆管理不同版本的應用程式

安裝 Docker

首先,需要安裝 Docker Desktop(適用於 Windows 和 macOS)或 Docker Engine(適用於 Linux):

Windows

  1. 下載 Docker Desktop for Windows
  2. 安裝並啟動 Docker Desktop
  3. 確保 WSL2 已啟用(Windows 10/11)

macOS

  1. 下載 Docker Desktop for Mac
  2. 安裝並啟動 Docker Desktop

Linux (Ubuntu)

bash
# 更新套件列表
sudo apt update
 
# 安裝必要的套件
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
 
# 添加 Docker 的官方 GPG 金鑰
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
 
# 添加 Docker 倉庫
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
 
# 安裝 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

Docker 基本概念

1. 映像檔(Image)

映像檔是容器的模板,包含了運行應用程式所需的所有檔案和設定。可以將它想像成一個應用程式的「藍圖」。

2. 容器(Container)

容器是映像檔的運行實例,就像是一個正在運行的應用程式。每個容器都是獨立的,有自己的檔案系統、網路和進程空間。

3. Dockerfile

Dockerfile 是一個文字檔案,包含了建立映像檔的指令。它定義了如何建立你的應用程式環境。

為 Next.js 專案建立 Dockerfile

讓我們為一個 Next.js 專案建立 Dockerfile:

dockerfile
# 使用 Node.js 官方映像檔作為基礎
FROM node:18-alpine
 
# 設定工作目錄
WORKDIR /app
 
# 複製 package.json 和 package-lock.json
COPY package*.json ./
 
# 安裝依賴項
RUN npm install
 
# 複製所有源代碼
COPY . .
 
# 建立生產環境的構建
RUN npm run build
 
# 暴露端口
EXPOSE 3000
 
# 啟動應用程式
CMD ["npm", "start"]

建立映像檔

bash
# 在專案根目錄執行
docker build -t my-nextjs-app .

運行容器

bash
docker run -p 3000:3000 my-nextjs-app

Docker Compose:管理多個容器

Docker Compose 可以幫助你管理多個相關的容器。以下是一個包含 Next.js 應用程式和 MongoDB 的範例:

yaml
# docker-compose.yml
version: '3.8'
 
services:
    app:
        build: .
        ports:
            - '3000:3000'
        environment:
            - MONGODB_URI=mongodb://db:27017/myapp
        depends_on:
            - db
 
    db:
        image: mongo:latest
        ports:
            - '27017:27017'
        volumes:
            - mongodb_data:/data/db
 
volumes:
    mongodb_data:

使用 Docker Compose

bash
# 啟動所有服務
docker-compose up
 
# 在背景運行
docker-compose up -d
 
# 停止所有服務
docker-compose down

實用技巧和最佳實踐

1. 使用 .dockerignore

建立 .dockerignore 檔案來排除不需要的檔案:

text
node_modules
.next
.git
.env

2. 多階段構建

使用多階段構建來減少最終映像檔的大小:

dockerfile
# 構建階段
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
 
# 生產階段
FROM node:18-alpine AS runner
WORKDIR /app
COPY --from=builder /app/next.config.js ./
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json
EXPOSE 3000
CMD ["npm", "start"]

3. 環境變數管理

使用環境變數檔案來管理配置:

bash
# .env
NODE_ENV=production
MONGODB_URI=mongodb://db:27017/myapp

4. 資料持久化

使用 Docker volumes 來保存資料:

yaml
# docker-compose.yml
services:
    app:
        volumes:
            - .:/app
            - /app/node_modules

常見問題和解決方案

1. 容器無法啟動

檢查日誌:

bash
docker logs container_name

2. 映像檔太大

  • 使用多階段構建
  • 使用 .dockerignore 排除不必要的檔案
  • 使用輕量級基礎映像檔(如 alpine)

3. 網路問題

檢查容器網路:

bash
docker network ls
docker network inspect network_name

部署到生產環境

1. 使用 Docker Registry

將映像檔推送到 Docker Hub 或私有 Registry:

bash
# 登入 Docker Hub
docker login
 
# 標記映像檔
docker tag my-nextjs-app username/my-nextjs-app:latest
 
# 推送映像檔
docker push username/my-nextjs-app:latest

2. 使用 Docker Swarm 或 Kubernetes

對於大規模部署,考慮使用容器編排工具:

bash
# 初始化 Docker Swarm
docker swarm init
 
# 部署服務
docker stack deploy -c docker-compose.yml myapp

總結

Docker 是一個強大的工具,可以幫助前端開發者:

  • 確保開發環境的一致性
  • 簡化部署流程
  • 提高應用程式的可移植性
  • 更好地管理依賴項

通過掌握 Docker 的基本概念和實用技巧,你可以:

  • 建立可靠的開發環境
  • 簡化團隊協作
  • 提高部署效率
  • 更好地管理應用程式的生命週期

參考來源