Docker 容器化技術
在現代軟體開發中,Docker 已經成為開發者必備的技能之一。無論是前端、後端還是 DevOps 工程師,幾乎都會接觸到容器化技術。
本篇文章將帶你了解什麼是 Docker、為什麼它如此受歡迎,以及它的核心運作原理。
什麼是 Docker?
Docker 是一個開源的平台,用於開發、運送和執行應用程式。它利用「容器化 (Containerization)」技術,將應用程式及其所有相依資源(例如:函式庫、設定檔、編譯環境)打包在一起,確保程式在任何環境下都能以相同的方式執行。
你可能聽過開發者最常說的一句話:「但在我的電腦上跑得動啊! (It works on my machine!)」Docker 的出現就是為了徹底解決這個問題。
為什麼需要 Docker?
在沒有 Docker 之前,部署應用程式通常會遇到以下挑戰:
- 環境不一致:開發環境是 macOS,測試環境是 Ubuntu,生產環境又是 CentOS,不同環境的軟體版本差異常導致錯誤。
- 資源浪費:傳統的虛擬機 (VM) 需要模擬整個作業系統,啟動慢且佔用大量記憶體。
- 依賴衝突:同一台伺服器上若要跑兩個需要不同 PHP 版本的專案,設定起來非常痛苦。
Docker 的優勢:
- 一致性:從開發到部署,環境完全相同。
- 輕量化:容器共用主機的作業系統核心,啟動速度以秒計,佔用資源極小。
- 隔離性:每個容器都是獨立運作的,互不干擾。
- 快速擴展:可以秒級啟動數十個相同的容器來處理高流量。
Docker 的核心三大組件
要掌握 Docker,必須先理解這三個核心概念:
1. 映像檔 (Image)
映像檔就像是程式的「藍圖」或「安裝檔」。它是唯讀的,包含了執行程式所需的所有內容。你可以想像它是虛擬機的 ISO 映像檔,但更輕量。
2. 容器 (Container)
容器是映像檔的「執行實例」。如果映像檔是類別 (Class),容器就是物件 (Object)。你可以啟動、停止、移動或刪除容器。每個容器都是相互隔離的安全平台。
3. 中心倉庫 (Repository / Registry)
這是存放映像檔的地方。最著名的就是 Docker Hub。你可以從上面下載別人做好的映像檔(例如:Nginx, MySQL, Python),也可以上傳自己的映像檔分享給團隊。
containerd 來管理映像檔存儲,這讓 Docker 與業界標準(如 Kubernetes)更加接軌,效能也進一步提升。Docker vs. 虛擬機 (Virtual Machine)
很多人會把 Docker 跟虛擬機混淆,下表簡單列出它們的差異:
| 特性 | Docker 容器 | 虛擬機 (VM) |
|---|---|---|
| 作業系統 | 共用主機作業系統核心 (Kernel) | 包含完整的客用作業系統 (Guest OS) |
| 啟動速度 | 秒級 (Seconds) | 分鐘級 (Minutes) |
| 磁碟佔用 | 極小 (通常 MB 級) | 大 (通常 GB 級) |
| 效能 | 幾乎接近原生速度 | 有虛擬化損耗 |
快速體驗 Docker 的威力
假設你想在本機跑一個 Nginx 網頁伺服器,在沒有 Docker 的情況下,你需要安裝 Nginx 並設定環境。
有了 Docker,你只需要執行一行指令:
# 啟動一個名為 my-web 的 Nginx 容器,並將本機 8080 埠對應到容器 80 埠
docker run -d --name my-web -p 8080:80 nginx
指令說明:
docker run: 建立並啟動容器。-d: 在背景執行 (Detached mode)。--name my-web: 給容器取個名字叫my-web。-p 8080:80: 將主機的 8080 埠號對應到容器內的 80 埠號。nginx: 使用的映像檔名稱。
執行完後,打開瀏覽器輸入 http://localhost:8080,你就能看到 Nginx 的歡迎畫面了!這就是 Docker 的魅力:快速、簡單、標準化。