開發者 Docker 指南:映像檔、容器與 Compose

DevOps2026-10-08TryQuickToolBox

你已經建好了一個能在自己機器上運作的應用程式,但部署時卻問題百出。依賴項目遺失、版本不一致,設定更是一團亂。Docker 將你的應用程式及其環境打包成單一可攜的單位,解決了這些問題。本文將透過實用範例說明 Docker 映像檔、容器與 Docker Compose,協助你簡化開發流程。

什麼是 Docker 映像檔?

Docker 映像檔是一個唯讀範本,內含你的應用程式程式碼、執行環境、函式庫、環境變數與設定檔。可以把它想成應用程式環境的快照。映像檔是從 Dockerfile 建置而成,這是一個包含指令的文字檔。

以下是 Node.js 應用程式的簡單 Dockerfile:

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

每個指令都會建立一個層(layer)。層會被快取,因此程式碼變更後重新建置時,只會從變更的層開始重新執行後續步驟。這讓建置速度更快。

什麼是 Docker 容器?

容器是映像檔的執行中實例。它是一個隔離的行程,擁有自己的檔案系統、網路與行程空間,但共用主機的作業系統核心。與虛擬機相比,這讓容器更輕量且啟動更快。

若要從映像檔執行容器:

docker run -d -p 3000:3000 --name myapp my-node-app

這會以分離模式(-d)啟動容器,將主機的 3000 埠對應到容器的 3000 埠(-p 3000:3000),並將其命名為 myapp。

容器預設是短暫的。容器停止時,寫入內部的任何資料都會遺失。若要保存資料,請使用磁碟區:

docker run -v /host/data:/app/data my-node-app

為什麼要使用 Docker Compose?

真實應用程式通常需要多個服務:網頁伺服器、資料庫、快取等。用 docker run 逐一執行並手動連結它們相當繁瑣。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 -d

Compose 會建立網路,讓服務能透過名稱互相存取(例如 db、cache)。它也會處理磁碟區建立與依賴順序。

開發者必備的 Docker 指令

開發時使用 Docker 的最佳實踐

常見陷阱與避免方法

陷阱 1:映像檔過於臃腫。 使用像 ubuntu 這樣的完整作業系統基礎映像檔可能導致映像檔超過 1GB。請使用 slim 或 alpine 變體。

陷阱 2:建置緩慢。 將 Dockerfile 指令依變更頻率由低到高排序。先複製套件檔案並安裝依賴,再複製原始碼。

陷阱 3:資料遺失。 資料庫一定要使用磁碟區。否則容器移除時資料就會消失。

陷阱 4:網路混淆。 在 Compose 中,服務透過預設網路以服務名稱作為主機名稱互相通訊。不要用 localhost 來存取另一個服務。

常見問題

映像檔與容器有何不同?

映像檔是唯讀範本;容器是該映像檔的執行中實例。你可以從同一個映像檔執行多個容器。

我可以在正式環境使用 Docker Compose 嗎?

Compose 主要用於開發與測試。正式環境請考慮 Kubernetes 或 Docker Swarm 等協調器,不過 Compose 也能用於簡單部署。

如何用新程式碼更新容器?

用 docker build 重新建置映像檔,然後重新建立容器:docker compose up -d --build。

準備好簡化你的開發流程了嗎?試試我們的 Nginx 日誌分析器,快速除錯你的容器化網頁伺服器日誌。