什麼是 Docker?

Docker 是一個開源的容器化平台,讓開發者可以將應用程式及其所有相依環境打包成一個輕量級、可攜帶的容器 (Container)。容器可以在任何支援 Docker 的環境中運行,確保「在我電腦上能跑」等於「在任何地方都能跑」。

為什麼要使用 Docker?

  • 環境一致性:開發、測試、生產環境完全相同,避免「在我這邊可以跑」的問題
  • 輕量快速:相比傳統虛擬機,容器啟動只需幾秒鐘,佔用資源更少
  • 隔離性:每個容器擁有獨立的檔案系統、網路和程序空間
  • 可攜帶性:一次打包,到處運行 — Linux、macOS、Windows、雲端都支援
  • 易於擴展:搭配 Docker Compose 或 Kubernetes 輕鬆管理多個服務

Docker vs 虛擬機 (VM)

特性Docker 容器虛擬機
啟動速度幾秒幾分鐘
資源佔用共享主機核心,非常輕量需要完整 OS,佔用大量資源
映像大小通常數十 MB ~ 數百 MB通常數 GB
隔離等級程序層級隔離硬體層級隔離
適用情境微服務、CI/CD、快速部署需要完整 OS 或高度隔離的場景

核心概念

在開始使用 Docker 之前,先了解幾個核心概念:

映像 (Image)

映像是一個唯讀的模板,包含了運行應用程式所需的一切:程式碼、執行環境、系統工具、函式庫和設定檔。可以把映像想像成應用程式的「快照」。

容器 (Container)

容器是映像的運行實例。你可以從同一個映像建立多個容器,每個容器之間彼此隔離。容器可以被啟動、停止、刪除,不會影響底層映像。

Dockerfile

Dockerfile 是一個文字檔,定義了如何建立映像的步驟。它就像一份食譜,告訴 Docker 一步步該做什麼。

Registry(映像倉庫)

Registry 是儲存和分發映像的地方。最常用的是 Docker Hub,你也可以使用 GitHub Container Registry 或自建私有 Registry。

Volume(資料卷)

Volume 是 Docker 管理的持久化儲存空間,用來保存容器產生的資料。容器被刪除後,Volume 中的資料仍然存在。


安裝 Docker

macOS

使用 Homebrew 安裝 Docker Desktop:

Loading...

安裝後啟動 Docker Desktop 應用程式。

Ubuntu / Debian

Loading...

驗證安裝

Loading...

基本命令

映像操作

Loading...

容器操作

Loading...

常用的 docker run 參數

Loading...

系統清理

Loading...

Dockerfile 撰寫

Dockerfile 定義了建立映像的每一個步驟。以下是一個 Node.js 應用的範例:

基本範例

Loading...

常用指令說明

指令說明
FROM指定基礎映像
WORKDIR設定工作目錄,後續指令都在此目錄下執行
COPY將本機檔案複製到映像中
RUN在建置過程中執行命令
ENV設定環境變數
EXPOSE宣告容器會使用的埠號(文件用途)
CMD容器啟動時執行的預設命令
ENTRYPOINT容器啟動時的入口程式(不易被覆蓋)
ARG定義建置時期的變數
VOLUME宣告掛載點

多階段建置 (Multi-stage Build)

多階段建置可以大幅減小最終映像的大小,將建置工具與執行環境分離:

Loading...

好處:建置階段的工具(如開發相依套件、原始碼)不會包含在最終映像中,大幅縮小映像體積。

.dockerignore 檔案

類似 .gitignore.dockerignore 告訴 Docker 在建置時忽略哪些檔案:

node_modules
.next
.git
.gitignore
*.md
.env
.env.local
docker-compose.yml

Docker Compose

Docker Compose 讓你用一個 YAML 檔案定義和管理多個容器服務。適合需要同時運行多個服務的場景(例如:應用程式 + 資料庫 + 反向代理)。

docker-compose.yml 範例

Loading...

Compose 常用命令

Loading...

常用配置說明

Loading...

網路 (Networking)

Docker 容器之間透過網路進行通訊。Docker Compose 會自動為同一個專案建立一個預設網路。

基本網路命令

Loading...

容器間通訊

在 Docker Compose 中,服務之間可以直接透過服務名稱作為主機名進行通訊:

Loading...

app 容器中,可以透過 database:5432 連線到資料庫。


資料卷 (Volumes)

容器預設是「無狀態」的,容器被刪除後資料會消失。使用 Volume 可以持久化保存資料。

Volume 類型

Loading...

Volume 管理命令

Loading...

常見部署流程

手動部署到 VPS

Loading...

使用 Docker Hub 部署

Loading...

除錯技巧

查看容器狀態與日誌

Loading...

進入容器除錯

Loading...

常見問題排查

容器啟動後立即停止:

Loading...

埠號衝突:

Loading...

磁碟空間不足:

Loading...

最佳實踐

  • 使用 Alpine 映像:選擇 node:20-alpine 而非 node:20,映像體積可以減少數百 MB
  • 善用多階段建置:分離建置環境和執行環境,減小映像大小
  • 不要在映像中存放機密資訊:使用環境變數或 Docker Secrets 管理密碼和金鑰
  • 使用 .dockerignore:避免將不必要的檔案打包進映像
  • 固定映像版本:使用 node:20-alpine 而非 node:latest,確保建置的可重現性
  • 一個容器一個服務:遵循單一職責原則,每個容器只運行一個主要程序
  • 善用快取:將不常變動的步驟(如安裝相依套件)放在 Dockerfile 前面
  • 設定健康檢查:使用 HEALTHCHECK 指令監控容器健康狀態
  • 使用 restart 策略:設定 restart: unless-stopped 確保服務自動恢復
  • 定期清理:使用 docker system prune 清理未使用的資源,釋放磁碟空間