【Docker 入門系列】#01 什麼是 Docker?為什麼開發者需要它?

測驗:Docker 入門 – 基礎概念

共 5 題,點選答案後會立即顯示結果

1. Docker 主要解決什麼問題?

  • A. 程式碼版本管理的問題
  • B. 不同電腦環境不一致導致程式無法執行的問題
  • C. 程式執行速度太慢的問題
  • D. 網路連線不穩定的問題

2. Docker 容器與虛擬機(VM)的主要差異是什麼?

  • A. Docker 容器比虛擬機更安全
  • B. Docker 容器可以跨平台,虛擬機不行
  • C. Docker 容器共用作業系統核心,所以更輕量且啟動更快
  • D. Docker 容器有完整的圖形介面,虛擬機沒有

3. 關於 Docker Image(映像檔)的描述,何者正確?

  • A. Image 是程式的模板,包含執行需要的所有東西,且是唯讀的
  • B. Image 是正在執行的程式實體,可以隨時修改
  • C. 一個 Image 只能建立一個 Container
  • D. Image 必須自己從頭製作,不能從網路下載

4. 以下指令的作用是什麼?

docker pull python:3.11
  • A. 執行 Python 3.11 的容器
  • B. 從 Registry 下載 Python 3.11 的 Image
  • C. 將本機的 Python 3.11 上傳到 Registry
  • D. 刪除 Python 3.11 的 Image

5. 在專案中看到 Dockerfile 這個檔案,它的用途是什麼?

  • A. 記錄容器執行時的 log
  • B. 設定多個服務一起啟動的方式
  • C. 存放 Docker 的環境變數
  • D. 建立 Image 的說明書,描述如何打包程式和環境

一句話說明

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 指令

本篇重點回顧

  1. Docker 解決什麼問題:環境不一致導致「在我電腦能跑」的困擾
  2. Docker vs 虛擬機:Docker 更輕量,共用作業系統核心
  3. 三個核心概念
    • Image:程式的模板/藍圖
    • Container:執行中的實體
    • Registry:存放 Image 的倉庫

進階測驗:Docker 入門 – 實戰應用

測驗目標:驗證你是否能在實際情境中應用所學。
共 5 題,包含情境題與錯誤診斷題。

1. 團隊新成員環境設定 情境題

你是資深工程師,新來的同事小華要加入專案開發。過去每次新人來,都要花 1-2 天設定開發環境(Python 版本、相依套件、資料庫連線等)。

你想改善這個問題,讓新人可以快速開始開發。根據 Docker 的特性,最佳的解決方案是?
  • A. 寫一份詳細的環境設定文件,讓新人照著做
  • B. 把自己電腦的環境複製一份給新人
  • C. 用 Docker 把開發環境打包成 Image,新人只需執行一個指令就能啟動
  • D. 安裝虛擬機並把整個系統複製給新人使用

2. 多版本相容性測試 情境題

你的 Python 套件需要支援 Python 3.8、3.9、3.10、3.11 四個版本。你需要在本機測試這四個版本的相容性。

最有效率的做法是?
  • A. 在電腦上安裝四個版本的 Python,用 pyenv 切換
  • B. 用不同版本的 Python Docker Image 分別執行測試
  • C. 建立四台虛擬機,每台裝一個 Python 版本
  • D. 只測試最新版本,假設其他版本也能用

3. 開發與部署環境差異 情境題

你在本機開發的網站功能都正常,但部署到正式伺服器後卻出現問題。經過調查,發現是因為正式伺服器的作業系統和你的開發環境不同。

要預防這類問題再發生,你應該?
  • A. 把開發電腦換成和正式伺服器一樣的作業系統
  • B. 要求營運團隊把正式伺服器改成和你一樣的環境
  • C. 每次部署前都仔細對照環境設定
  • D. 開發、測試、部署都使用同一個 Docker Image

4. 指令理解診斷 錯誤診斷

小明想要執行一個 Python 3.11 的容器來測試程式,他執行了以下指令:
docker pull python:3.11
執行完成後,小明說:「奇怪,我的程式怎麼沒有跑起來?」

問題出在哪裡?
  • A. python:3.11 這個 Image 不存在
  • B. docker pull 只是下載 Image,要執行容器需要用 docker run
  • C. 需要先執行 docker images 才能使用
  • D. Python 版本寫錯了,應該是 3.11.0

5. 概念混淆診斷 錯誤診斷

新同事問你:「我想要修改目前正在跑的 Container 裡面的程式碼,這樣以後每次用這個 Image 啟動都會有新的程式碼對吧?」

這個說法有什麼問題?
  • A. Container 內的程式碼不能修改
  • B. 修改後需要重新啟動 Container 才會生效
  • C. 修改 Container 不會影響原本的 Image,下次從同一個 Image 啟動還是舊的程式碼
  • D. 只有管理員權限才能修改 Container

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *