測驗:Docker 入門 – 基礎概念
共 5 題,點選答案後會立即顯示結果
1. Docker 主要解決什麼問題?
2. Docker 容器與虛擬機(VM)的主要差異是什麼?
3. 關於 Docker Image(映像檔)的描述,何者正確?
4. 以下指令的作用是什麼?
docker pull python:3.11
5. 在專案中看到 Dockerfile 這個檔案,它的用途是什麼?
一句話說明
Docker 把應用程式和它需要的環境打包在一起,確保「在我電腦能跑」等於「在任何電腦都能跑」。
這篇文章會教你
讀完本篇後,你能夠:
- 理解 Docker 解決什麼問題(環境一致性、相依套件管理)
- 區分 Docker 與虛擬機的差異
- 認識 Docker 的核心概念:Image、Container、Registry
「在我電腦能跑啊!」的痛
每個開發者都遇過這種狀況:
你:「程式寫好了,測試通過,可以部署了!」
同事:「我跑不起來欸,說缺少某個套件。」
你:「不可能,在我電腦能跑啊!」
(三小時後...)
你:「喔,你的 Python 是 3.8,我的是 3.11...」
Code language: CSS (css)問題出在哪?
| 可能的差異 | 你的電腦 | 同事的電腦 |
|---|---|---|
| 程式語言版本 | Python 3.11 | Python 3.8 |
| 作業系統 | macOS | Windows |
| 系統套件 | 已安裝 ffmpeg | 沒安裝 |
| 環境變數 | 設好了 | 沒設 |
這些「環境差異」讓程式在不同電腦上行為不一致,甚至完全跑不起來。
Docker 怎麼解決這個問題?
Docker 的解法很直接:把環境也打包進去。
沒有 Docker 時
你交付的是「程式碼」:
app.py ← 你的程式
requirements.txt ← 相依套件清單
README.md ← 「請先安裝 Python 3.11,然後 pip install...」
Code language: CSS (css)對方要自己準備環境,每個人裝出來可能都不一樣。
有 Docker 時
你交付的是「程式碼 + 環境」打包在一起:
Docker Image = 你的程式 + Python 3.11 + 所有套件 + 需要的系統工具
對方只要執行這個 Image,環境保證一模一樣。
Docker vs 虛擬機:差在哪?
你可能想:「虛擬機不是也可以把整個環境打包嗎?」
沒錯,但兩者有關鍵差異:
| 比較項目 | 虛擬機 (VM) | Docker 容器 |
|---|---|---|
| 包含什麼 | 完整作業系統 + 應用程式 | 只有應用程式 + 必要套件 |
| 啟動時間 | 幾分鐘 | 幾秒 |
| 記憶體使用 | GB 等級 | MB 等級 |
| 檔案大小 | 幾十 GB | 幾百 MB |
白話翻譯:
- 虛擬機像是「買一整棟房子,只用一個房間」
- Docker 容器像是「租一個房間,共用大樓的水電」
Docker 容器共用底層的作業系統核心,所以非常輕量。
架構對比圖解
虛擬機架構:
┌─────────┐ ┌─────────┐ ┌─────────┐
│ App A │ │ App B │ │ App C │
├─────────┤ ├─────────┤ ├─────────┤
│ Guest OS│ │ Guest OS│ │ Guest OS│ ← 每個都要完整 OS
└────┬────┘ └────┬────┘ └────┬────┘
└──────────┼──────────┘
┌────┴────┐
│Hypervisor│
├─────────┤
│ Host OS │
└─────────┘
Docker 架構:
┌─────────┐ ┌─────────┐ ┌─────────┐
│ App A │ │ App B │ │ App C │
├─────────┤ ├─────────┤ ├─────────┤
│ 必要套件 │ │ 必要套件 │ │ 必要套件 │ ← 只裝需要的
└────┬────┘ └────┬────┘ └────┬────┘
└──────────┼──────────┘
┌────┴────┐
│ Docker │ ← 共用 OS 核心
├─────────┤
│ Host OS │
└─────────┘
核心概念:三個關鍵詞
使用 Docker 時,你會一直看到這三個詞:
1. Image(映像檔)
一句話:程式的「模板」或「藍圖」,包含所有執行需要的東西。
類比:就像餐廳的「食譜」,記錄了做這道菜需要的材料和步驟。
# 你會看到這樣的指令
docker pull python:3.11 # 下載 Python 3.11 的 Image
docker images # 列出所有 Image
Code language: PHP (php)重點:Image 是唯讀的,不會改變。
2. Container(容器)
一句話:根據 Image 建立的「執行中的實體」。
類比:食譜是 Image,照著食譜做出來的「那一盤菜」是 Container。
# 你會看到這樣的指令
docker run python:3.11 # 根據 Image 建立並執行 Container
docker ps # 列出執行中的 Container
Code language: PHP (php)重點:
- 一個 Image 可以建立多個 Container
- Container 可以修改(但通常不建議直接改)
3. Registry(倉庫)
一句話:存放和分享 Image 的地方。
類比:就像 GitHub 是放程式碼的地方,Registry 是放 Image 的地方。
最常用的公開 Registry 是 Docker Hub(hub.docker.com)。
# 這行指令其實是從 Docker Hub 下載
docker pull nginx # 等於 docker pull docker.io/nginx
Code language: PHP (php)三者關係
Registry(倉庫)
│
│ docker pull(下載)
▼
Image(映像檔)
│
│ docker run(執行)
▼
Container(容器)──→ 正在跑的應用程式
Docker 的常見應用場景
場景 1:開發環境統一
團隊新成員加入:
傳統方式:「請照這份 10 頁文件設定環境」→ 設定 2 天
Docker 方式:「docker compose up」→ 5 分鐘搞定
場景 2:測試不同版本
需要同時測試 Python 3.8、3.9、3.11?
docker run python:3.8 python --version
docker run python:3.9 python --version
docker run python:3.11 python --version
Code language: CSS (css)不用在電腦上安裝三個版本的 Python。
場景 3:乾淨的測試環境
每次測試都從乾淨的環境開始,不受之前測試的影響。
場景 4:部署一致性
開發、測試、正式環境用同一個 Image,減少「只在某個環境出問題」的情況。
Vibe Coder 檢查點
看到專案有 Docker 相關檔案時,確認這些事:
- [ ] 有
Dockerfile嗎?這是建立 Image 的說明書 - [ ] 有
docker-compose.yml嗎?這是一次啟動多個服務的設定 - [ ] README 有說明怎麼用 Docker 啟動嗎?
小結:Docker 解決的核心問題
| 問題 | Docker 的解法 |
|---|---|
| 環境不一致 | 把環境打包進 Image |
| 設定環境麻煩 | 一個指令就能啟動 |
| 需要測試多版本 | 不同 Image 互不影響 |
| 部署與開發不同 | 用同一個 Image |
下一篇預告
學會概念後,下一篇我們會實際動手:
- 安裝 Docker Desktop
- 執行第一個 Container
- 理解
docker run指令
本篇重點回顧
- Docker 解決什麼問題:環境不一致導致「在我電腦能跑」的困擾
- Docker vs 虛擬機:Docker 更輕量,共用作業系統核心
- 三個核心概念:
- Image:程式的模板/藍圖
- Container:執行中的實體
- Registry:存放 Image 的倉庫
進階測驗:Docker 入門 – 實戰應用
測驗目標:驗證你是否能在實際情境中應用所學。
共 5 題,包含情境題與錯誤診斷題。
共 5 題,包含情境題與錯誤診斷題。
1. 團隊新成員環境設定 情境題
你是資深工程師,新來的同事小華要加入專案開發。過去每次新人來,都要花 1-2 天設定開發環境(Python 版本、相依套件、資料庫連線等)。
你想改善這個問題,讓新人可以快速開始開發。根據 Docker 的特性,最佳的解決方案是?
你想改善這個問題,讓新人可以快速開始開發。根據 Docker 的特性,最佳的解決方案是?
2. 多版本相容性測試 情境題
你的 Python 套件需要支援 Python 3.8、3.9、3.10、3.11 四個版本。你需要在本機測試這四個版本的相容性。
最有效率的做法是?
最有效率的做法是?
3. 開發與部署環境差異 情境題
你在本機開發的網站功能都正常,但部署到正式伺服器後卻出現問題。經過調查,發現是因為正式伺服器的作業系統和你的開發環境不同。
要預防這類問題再發生,你應該?
要預防這類問題再發生,你應該?
4. 指令理解診斷 錯誤診斷
小明想要執行一個 Python 3.11 的容器來測試程式,他執行了以下指令:
docker pull python:3.11
執行完成後,小明說:「奇怪,我的程式怎麼沒有跑起來?」
問題出在哪裡?
問題出在哪裡?
5. 概念混淆診斷 錯誤診斷
新同事問你:「我想要修改目前正在跑的 Container 裡面的程式碼,這樣以後每次用這個 Image 啟動都會有新的程式碼對吧?」
這個說法有什麼問題?
這個說法有什麼問題?