什麼是 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清理未使用的資源,釋放磁碟空間