為什麼要用 Docker
在回答「為什麼用 Docker」之前,筆者想先問一個問題:你有沒有經歷過這些情境?
沒有 Docker 的世界
在 Docker 出現之前,軟體開發和維運面臨著諸多棘手的問題。我們先來看看以下三個典型的痛點情境。
情境一:「在我電腦上明明能跑」
週五下午 5:00
├── 開發者:程式碼寫完了,本地測試通過,提交!🎉
├── 週一早上 9:00
│ └── 測試:"這個功能在測試環境跑不起來"
└── 開發者:"不可能,在我電腦上明明能跑啊……"筆者統計過,這個問題通常由以下原因導致:
Python/Node/Java 版本不一致
相依庫版本不一致
作業系統設定不一致
某些環境變數沒有設定
「哦,忘了說我本地裝了個 XXX」
情境二:環境設定的噩夢
情境三:伺服器遷移的恐懼
Docker 如何解決這些問題
Docker 的出現為上述問題提供了完美的解決方案。它透過「一次建立,到處執行」的核心理念,從根本上改變了軟體交付的方式。
核心理念:一次建立,到處執行
Docker 的核心優勢
除了解決上述痛點,Docker 還擁有諸多顯著的技術優勢,包括環境一致性、秒級啟動、高效的資源利用等。
1. 環境一致性
Docker 映像檔包含了應用執行所需的大部分使用者態相依:程式碼、執行時期、系統工具、庫和預設設定。它不包含宿主機核心,也不能消除 CPU 架構、核心能力、外部服務、網路、卷和執行時期設定差異。這意味著:
✅ 開發環境和生產環境可以顯著減少差異
✅ 大幅降低「在我機器上能跑」的問題
✅ 新人入職,一條命令就能啟動開發環境
2. 秒級啟動
傳統虛擬機啟動需要幾分鐘(引導作業系統),而 Docker 容器啟動通常只需要 幾秒甚至幾百毫秒。
筆者實測資料:
空系統
~60 秒
~0.5 秒
MySQL
~90 秒
~3 秒
完整 Web 應用
~120 秒
~5 秒
這個差異對以下情境尤為重要:
CI/CD 流水線:每次建立節省幾分鐘,一天累積下來就是幾小時
彈性擴容:流量高峰時能快速啟動更多實例
開發體驗:快速重啟服務進行除錯
3. 資源效率
Docker 容器共享宿主機核心,無需為每個應用執行完整的作業系統。以一台 64GB 記憶體的實體伺服器為例:
傳統虛擬機方案:每個虛擬機都需要執行完整的作業系統(每個額外佔用如 2GB 記憶體),產生大量資源開銷,實際可用於應用的記憶體可能只有約 18GB。
Docker 方案:容器直接共享宿主機系統,只需付出很少的基礎開銷(OS 及引擎約 4GB),即可將約 60GB 的記憶體全部用於實際應用。
4. 持續交付和部署
Docker 完美契合 DevOps 的工作流程:
使用 Dockerfile 定義映像檔建立過程,使得:
建立過程 可重複、可追溯
任何人都能從程式碼重建完全相同的映像檔
配合 GitHub Actions 等 CI 系統實作自動化
5. 輕鬆遷移
Docker 可以在幾乎任何平台上執行:
✅ 本地開發機 (macOS、Windows、Linux)
✅ 公有雲(AWS、Azure、GCP、阿里雲、騰訊雲)
✅ 私有雲和自建資料中心
✅ 邊緣裝置和 IoT
同一個映像檔,在任何地方執行結果都一致。 這讓應用遷移變得前所未有的簡單。
6. 微服務架構的基石
現代微服務架構幾乎都依賴容器技術。Docker 讓你可以:
隔離服務:每個服務執行在獨立容器中,互不干擾
獨立擴展:哪個服務負載高,就單獨擴展哪個
獨立部署:更新一個服務不影響其他服務
技術多樣:不同服務可以用不同語言和框架
Docker 不適合的情境
筆者認為,技術選型要客觀。Docker 並非銀彈,以下情境可能不太適合:
需要完全隔離的情境:容器共享宿主機核心,隔離性不如虛擬機。如果需要執行不受信任的程式碼,虛擬機可能更安全。
需要特殊核心的情境:容器使用宿主機核心。如果應用需要特定版本的核心或核心模組,可能需要虛擬機。
Windows 原生應用:雖然 Docker 支援 Windows 容器,但生態不如 Linux 容器成熟。傳統 Windows 應用的容器化仍有挑戰。
桌面應用:Docker 主要面向服務端應用。桌面 GUI 應用的容器化雖然可行,但通常得不償失。
與傳統虛擬機的對比總結
關於容器與虛擬機的詳細特性對比,請參閱 Docker vs 虛擬機 中的對比表。總結來說:
效能差異:虛擬機通常有 5-20% 的效能損耗,而容器接近原生效能。
最佳情境:Docker 容器適合微服務、CI/CD、開發環境;虛擬機適合多租戶、高安全需求情境。
最後更新於