Docker 教學 第 1 堂:安裝 Docker、理解概念與第一個容器

本系列為 18 小時 Docker 基礎教學講義,適合初學者,使用 Windows 電腦。 本篇為第 1 堂課,約 3 小時。

第一部分:安裝環境(約 1 小時)

1-1 如何安裝 Docker

這一版的上課節奏會先處理安裝。沒有裝好的人可以立刻跟著處理環境;已經裝好的人則先跑驗證指令,確定後面實作不會卡在工具問題。

Docker Desktop 介紹

在 Windows 上使用 Docker,我們需要安裝 Docker Desktop。它提供了:

  • Docker Engine(核心引擎)
  • Docker CLI(命令列工具)
  • Docker Compose(多容器管理工具)
  • 圖形化介面(GUI),方便觀察容器狀態

系統需求確認

Windows 10/11 系統需求:

  • Windows 10 64-bit: Home 或 Pro 21H2 以上,或 Windows 11
  • 開啟 WSL 2(Windows Subsystem for Linux 2)
  • 至少 4 GB 記憶體
  • BIOS 需要開啟虛擬化功能(通常預設是開的)

檢查虛擬化是否開啟:

  1. Ctrl + Shift + Esc 打開工作管理員
  2. 點「效能」分頁
  3. 看 CPU 區塊右下角,「虛擬化」是否顯示「已啟用」

為什麼安裝 Docker 會提到 WSL 2?

WSL 2(Windows Subsystem for Linux 2) 是 Windows 內建的 Linux 執行環境。Docker Desktop 在 Windows 上通常會透過 WSL 2 來運行 Linux 容器,所以安裝 Docker 時才會看到 WSL 2 相關選項。

初學者不用另外學 WSL,也不用手動打開 Ubuntu。只要 Docker Desktop 正常啟動,後面的 docker 指令就可以照常使用。

課堂提醒

這裡把 WSL 2 當成 Docker Desktop 背後使用的基礎環境就好。本課程的重點是 Docker,不是 Linux 指令或 WSL 管理。

安裝 WSL 2

Docker Desktop 安裝過程通常會協助啟用 WSL 2。如果電腦還沒有安裝 WSL 2,可以先用 PowerShell(以系統管理員身分執行)輸入:

wsl --install

安裝完成後重新開機,再打開 Docker Desktop。

如果系統跳出 Ubuntu 視窗,要求設定使用者名稱和密碼,照畫面設定即可。後面的 Docker 操作不需要主動進入 Ubuntu。

需要確認 WSL 狀態時,可以執行:

wsl --status

如果 Docker Desktop 啟動卡住,可以先關閉 WSL,再重新打開 Docker Desktop:

wsl --shutdown

安裝 Docker Desktop

步驟 1:下載 Docker Desktop

  • 開啟瀏覽器,前往 Docker 官方網站下載頁面
  • 點選「Download for Windows」

步驟 2:執行安裝程式

  • 雙擊下載的 Docker Desktop Installer.exe
  • 確認勾選「Use WSL 2 instead of Hyper-V」
  • 按照指示完成安裝

步驟 3:首次啟動

  • 安裝完成後,從開始功能表啟動 Docker Desktop
  • 第一次啟動會需要一些時間初始化
  • 看到系統匣(右下角)的 Docker 圖示變成穩定狀態就代表啟動成功

步驟 4:同意服務條款

  • 首次啟動會要求同意 Docker 的服務條款
  • 個人學習使用是免費的

驗證安裝是否成功

打開命令提示字元(cmd)或 PowerShell:

# 檢查 Docker 版本
docker --version

應該看到類似:

Docker version 27.x.x, build xxxxxxx
# 跑一個測試容器
docker run hello-world

如果看到以下訊息,恭喜你安裝成功了!

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

解讀 hello-world 發生了什麼事:

  1. Docker 在本機找不到 hello-world 映像檔
  2. 自動從 Docker Hub 下載了這個映像檔
  3. 用這個映像檔建立了一個容器
  4. 容器執行後印出了歡迎訊息
  5. 容器執行完畢後自動停止

Docker Desktop 介面導覽與 GUI 操作

Docker Desktop 提供了圖形化介面(GUI),讓你不用打指令也能管理容器和映像檔。打開 Docker Desktop,認識主要介面:

左側選單:

  1. Containers:查看所有容器的狀態(執行中 / 已停止)
  2. Images:查看本機已下載的映像檔
  3. Volumes:查看資料卷(後面會用到)
  4. Settings(齒輪圖示):
    • General:一般設定
    • Resources:資源相關設定(本課程不需要修改)
    • Docker Engine:進階設定

Containers 頁面的 GUI 操作:

在 Containers 頁面,每個容器旁邊都有操作按鈕:

按鈕功能等同的 CLI 指令
▶ (Play)啟動已停止的容器docker start
⏹ (Stop)停止執行中的容器docker stop
🔄 (Restart)重新啟動容器docker restart
🗑 (Delete)刪除容器docker rm
📋 (Logs)查看容器的輸出 logdocker logs
>_ (Terminal)進入容器的終端docker exec -it ... bash
🔍 (Inspect)查看容器的詳細設定docker inspect

Images 頁面的 GUI 操作:

  • 點選映像檔旁的 ▶ Run 可以直接建立容器,會跳出設定視窗讓你填入:
    • Container name(容器名稱)
    • Ports(端口映射)
    • Volumes(掛載目錄)
    • Environment variables(環境變數)
  • 這個設定視窗其實就是幫你組合 docker run 的參數
  • 點選 🗑 可以刪除映像檔(等同 docker rmi

Volumes 頁面:

  • 查看所有 Volume 的名稱、建立時間、大小
  • 點進去可以瀏覽 Volume 裡面的檔案內容
  • 可以直接刪除不需要的 Volume

Settings 重要設定:

  • 初學者先照 Docker Desktop 預設值使用即可,不需要修改 Resources 或 Docker Engine。

CLI 還是很重要!

Docker Desktop 的 GUI 方便新手入門,也適合快速查看狀態。但在實務工作中,CLI 才是主角

  • 伺服器上通常沒有圖形化介面,只能用 CLI
  • CI/CD 自動化部署只能用指令
  • Dockerfile 和 docker-compose.yml 都是文字檔,要用指令操作
  • 遇到問題時,網路上的解答和文件幾乎都是 CLI 指令

建議:用 GUI 學概念,用 CLI 做操作。本課程的所有實作都會以 CLI 為主,但你隨時可以打開 Docker Desktop 來觀察容器狀態。

常見安裝問題排解

這一段只有在 Docker Desktop 安裝或啟動失敗時才需要看。正常情況下,安裝完 Docker Desktop、啟動成功、能跑 docker run hello-world,就不需要另外操作 WSL,也不用打開 Ubuntu。

問題 1:Docker Desktop 提示需要 WSL 2

  • 先依照 Docker Desktop 安裝程式的畫面指示啟用 WSL 2,通常重新開機後再打開 Docker Desktop 即可。
  • 如果安裝程式無法自動處理,再用 PowerShell(以系統管理員身分執行)輸入:
wsl --install
  • 安裝完成後重新開機,再啟動 Docker Desktop。

問題 2:Docker Desktop 啟動卡住

  • 第一次啟動可能需要幾分鐘,可以先等 Docker Desktop 初始化完成。
  • 如果長時間卡住,可以用 PowerShell 檢查 WSL 狀態:
wsl --status
  • 需要重新啟動 Docker Desktop 背後的 WSL 環境時,可以執行:
wsl --shutdown
  • 執行後重新打開 Docker Desktop。這些 WSL 指令只是排錯用,平常上課不需要進入 Ubuntu。

問題 3:Windows 功能沒有開啟

  • 確認 Windows 已更新到支援 Docker Desktop 的版本。
  • 手動啟用功能:控制台 → 程式和功能 → 開啟或關閉 Windows 功能 → 勾選「虛擬機器平台」和「Windows 子系統 Linux 版」。

問題 4:虛擬化未啟用

  • 需要進入 BIOS 設定(開機時按 F2、Del 或 F10,依主機板而異)。
  • 找到 Virtualization Technology(VT-x / AMD-V),設為 Enabled。

第二部分:Docker 概念(約 1 小時)

1-2 Docker 是甚麼?容器是甚麼

先完成 docker run hello-world 後,再回頭看 Docker 的名詞會比較有感。這一段會用剛才看到的下載、建立與停止流程,去理解 Image、Container、Registry,以及 Docker 解決的環境一致性問題。

Docker 是什麼?

一句話解釋: Docker 是一個可以把你的應用程式「打包」起來的工具,打包完之後不管放到哪台電腦上都能跑。

比喻說明: 想像你要搬家。傳統的方式就像是把家具一件一件搬,到了新家還要重新組裝、調整。但如果你能把整間房間——包含家具、擺設、甚至空氣——直接整個搬過去呢?Docker 做的就是類似的事情。

它把你的程式、程式需要的套件、設定檔、甚至作業系統環境,全部打包成一個「容器(Container)」。這個容器可以在任何有安裝 Docker 的電腦上運行,而且行為完全一致。

名詞解釋:伺服器與部署

  • 伺服器(Server):一台 24 小時開著、專門用來提供服務的電腦。例如你每天在用的網站、App,背後都有伺服器在運行。它跟你的個人電腦本質上一樣,只是通常放在機房裡,透過網路提供服務。
  • 部署(Deploy):把你在自己電腦上寫好的程式,放到伺服器上讓它正式運行、讓使用者可以使用的過程。就像餐廳做好菜之後要「出餐」,部署就是軟體的「出餐」。

為什麼要使用容器化?三大特性:

  1. 可攜性(Portability):容器化的應用程式可以打包成 Image,無論在何種作業環境中,只要安裝了 Docker,就能夠正常運行。這消除了不同環境之間的兼容性問題,使得部署變得更加簡單和快速。
  2. 隔離性(Isolation):使用容器化技術,應用程式之間的相互干擾會被隔離。這樣就能避免環境衝突的問題。例如,當一個應用程式需要特定版本的庫時,不會影響到其他應用程式的運行,提供了更加穩定的執行環境。
  3. 一致性(Consistency):當應用程式打包成 Image 時,無論在開發、測試還是生產環境中,都能確保執行結果的一致性。這對於減少「本地運行正常,部署後失敗」的情況至關重要,從而提高了開發效率與品質。

此外,容器還有一個重要的優勢:輕量化——比虛擬機快很多、佔的資源少很多。

補充:Apple Silicon 與 CPU 架構

現在大多數官方 Image(例如 nodepythonnginxubuntualpine)都已支援多架構。同一個 Image tag 通常可以在不同 CPU 架構的電腦上使用,Docker 會自動下載合適的版本。初學者通常不需要特別處理。

只有遇到這類錯誤時,才需要回頭檢查 Image 是否支援目前平台:

  • no matching manifest for linux/arm64/v8
  • exec format error

如果真的遇到,可以先改用支援多架構的官方 Image,或手動指定平台測試:

docker run --platform linux/amd64 image-name

多架構建置與發布屬於部署與 CI/CD 階段的內容,初學時先知道「Docker 通常會自動選對版本」即可。

傳統部署 vs VM 部署 vs 容器化部署

傳統部署:

  • 所有應用程式直接安裝在同一台伺服器的作業系統上,共用系統函式庫
  • 問題:應用程式之間可能發生衝突(例如 App A 需要 Python 3.8,App B 需要 Python 3.11),一個 App 出問題可能連帶影響其他 App

VM 部署:

  • 用虛擬機在一台實體機器上模擬出多台完整的電腦,每台 VM 有自己的作業系統
  • 解決了隔離問題,但每台 VM 都要跑一整個 OS,啟動慢(幾十秒到幾分鐘)、佔用資源多(每台 VM 吃掉幾 GB 記憶體)
  • 工具:VirtualBox、VMware、Hyper-V

容器化部署:

  • 不需要模擬整個作業系統,所有容器共用主機的 OS 核心,每個容器只包含應用程式和它需要的依賴
  • 既有隔離性,又非常輕量——啟動只要幾秒,佔用通常只有幾十 MB

三種架構比較圖:

傳統部署:              VM 部署:                容器化部署:

┌─────┬─────┬─────┐    ┌──────┐ ┌──────┐       ┌──────┐ ┌──────┐ ┌──────┐
│App A│App B│App C│    │ VM A │ │ VM B │       │容器 A│ │容器 B│ │容器 C│
├─────┴─────┴─────┤    │Guest │ │Guest │       │App+  │ │App+  │ │App+  │
│   Bins / Libs   │    │ OS   │ │ OS   │       │依賴  │ │依賴  │ │依賴  │
├─────────────────┤    │App+  │ │App+  │       └──┬───┘ └──┬───┘ └──┬───┘
│ OS & Shared     │    │依賴  │ │依賴  │          │       │       │
│ Services        │    └──┬───┘ └──┬───┘       ┌──┴───────┴───────┴──┐
├─────────────────┤    ┌──┴────────┴──┐        │    Docker Engine    │
│    Hardware     │    │  Hypervisor  │        ├─────────────────────┤
└─────────────────┘    ├──────────────┤        │      Host OS       │
                       │   Host OS   │        ├─────────────────────┤
                       ├──────────────┤        │     Hardware       │
                       │  Hardware   │        └─────────────────────┘
                       └──────────────┘
比較項目傳統部署VM 部署容器化部署
隔離性無,互相干擾完全隔離程序級隔離
啟動速度快(直接跑)慢(分鐘級)快(秒級)
資源佔用高(每台 VM 一個 OS)低(共用 OS 核心)
可攜性

Docker 的缺點

Docker 優點很多,但也不是完美的,了解它的限制才能在實務中做出更好的選擇:

缺點說明
學習曲線指令多、概念多(Image、Container、Volume、Network…),新手容易搞混
安全性容器預設用 root 執行,且所有容器共用主機的 OS 核心,隔離性不如虛擬機
不適合有狀態的服務容器天生是「用完即丟」的設計,資料庫這類需要持久化資料的服務要靠 Volume 額外處理,正式環境通常會用託管的資料庫服務(如 AWS RDS)而非自己用容器跑
Windows/Mac 的效能開銷在 Linux 上幾乎無損,但 Windows/Mac 需要透過 WSL2 或 VM 跑 Docker,會額外佔用 1~2 GB 記憶體
磁碟空間Image 和 Container 很容易越積越多,佔掉幾十 GB 磁碟空間,需要定期清理
除錯較複雜容器之間的網路問題較難排查,Log 分散在各個容器裡,沒有工具輔助的話不容易追蹤

這些缺點大多有對應的解決方案,Docker 的優點仍然遠大於缺點,這也是它能夠如此普及的原因。

Docker 的核心概念

Docker 有三個最重要的概念:

1. 映像檔(Image)

  • 就像一張「光碟」或「安裝檔」
  • 它是唯讀的,包含了應用程式和所有需要的東西
  • 例如:一個 Python 映像檔裡面就已經裝好了 Python

2. 容器(Container)

  • 映像檔跑起來之後就變成容器
  • 就像把光碟放進電腦裡執行
  • 容器是活的、可以互動的
  • 一個映像檔可以同時跑出多個容器

3. 倉庫(Registry)

  • 存放映像檔的地方
  • 最大的公開倉庫叫 Docker Hub(hub.docker.com)
  • 就像 App Store,你可以上去下載別人做好的映像檔

三者的關係:

Docker Hub(倉庫)  --下載-->  Image(映像檔)  --啟動-->  Container(容器)

小結

  • Docker 把程式和環境打包在一起
  • 容器比虛擬機更輕量、更快
  • 三大核心概念:Image、Container、Registry

第三部分:第一個容器(約 1 小時)

1-3 拉取映像檔與建立 Nginx 容器

什麼是映像檔(Image)

映像檔是什麼?

  • 映像檔是一個唯讀的模板,用來建立容器
  • 它包含了執行應用程式所需的一切:程式碼、執行環境、函式庫、環境變數、設定檔
  • 映像檔是「分層(Layered)」結構的

分層的概念:

┌─────────────────────────────┐
│  你的應用程式程式碼          │  ← 最上層(最常變動)
├─────────────────────────────┤
│  pip install 安裝的套件     │
├─────────────────────────────┤
│  Python 3.11                │
├─────────────────────────────┤
│  Ubuntu / Alpine Linux      │  ← 最底層(基礎系統)
└─────────────────────────────┘

分層的好處:

  • 不同映像檔可以共用相同的底層,節省空間
  • 只有變動的層需要重新下載或建構

Docker Hub 巡禮

Docker Hub(hub.docker.com)是一個公共的映像檔倉庫,開發者可以上傳和下載各種映像檔。它就像是「程式世界的 App Store」,提供官方和社群的多樣映像檔選擇,開發者也可以輕鬆地存儲和分享自己的映像檔,促進團隊協作。

使用 Docker Hub 的好處:

  • 簡化了映像檔的管理,開發者可以在不同環境中快速拉取所需的映像檔
  • 支援版本控制,開發者可以根據需要選擇使用特定版本的映像檔
  • 除了公共倉庫,Docker Hub 也提供私有倉庫選項,適合企業用戶存放敏感資料

帶你逛 Docker Hub:

  1. 搜尋 python,會看到官方映像檔
  2. 點進去看映像檔的說明頁面
  3. 注意「Tags」——不同版本的映像檔

什麼是 Tag?

  • Tag 就是映像檔的版本標籤
  • 例如 python:3.11python:3.11-slimpython:3.11-alpine
  • latest 是預設 tag,代表最新版本
  • 建議:生產環境永遠指定具體版本,不要用 latest

常見的 Tag 命名規則:

  • python:3.11:完整 Debian-based 版本,工具較多,體積通常最大
  • python:3.11-slim:精簡 Debian-based 版本,正式專案常用折衷
  • python:3.11-alpine:Alpine-based,體積最小,但套件相容性/編譯較容易踩坑

基本映像檔操作指令

拉取映像檔:

# 拉取 Python 官方映像檔
docker pull python:3.11

# 拉取特定版本
docker pull python:3.11-slim

查看本機的映像檔:

docker images

輸出解讀:

REPOSITORY   TAG        IMAGE ID       CREATED        SIZE
python       3.11       abc123def456   2 weeks ago    1.01GB
python       3.11-slim  789ghi012jkl   2 weeks ago    155MB
  • REPOSITORY:映像檔名稱
  • TAG:版本標籤
  • IMAGE ID:唯一識別碼
  • SIZE:映像檔大小

比較 python:3.11python:3.11-slim 的大小差異,理解為什麼精簡版很重要。

刪除映像檔:

# 用名稱刪除
docker rmi python:3.11

# 用 ID 刪除
docker rmi abc123def456

注意:如果還有容器正在使用該映像檔(不管是執行中還是已停止),就無法刪除。必須先把相關容器都刪掉(docker rm),才能刪除映像檔。

建議:定期清理不再使用的映像檔,釋放磁碟空間。映像檔很容易越積越多,佔掉幾十 GB 都不奇怪。

搜尋映像檔:

docker search nginx

實作:Pull 一個 Nginx 映像檔並跑起來

在學更複雜的 Flask 之前,先用最簡單的方式體驗「拉取映像檔 → 跑容器 → 看到結果」的完整流程。

Nginx 是什麼?

Nginx(唸作 “engine-x”)是目前全世界最多人使用的 Web 伺服器之一。它由俄羅斯工程師 Igor Sysoev 在 2004 年發布,最初是為了解決當時 Apache 伺服器在高流量下效能不足的問題(稱為 C10K 問題——同時處理一萬個連線)。

遇到新工具,先查官方來源:

學 Docker 時不要只背指令。看到 nginx 這個名字,可以先查三個地方:

  1. Nginx 官網https://nginx.org/
    先確認 Nginx 是什麼。官網會告訴你它是 Web 伺服器,也可以做反向代理、負載均衡、快取等工作。
  2. Nginx 官方文件https://nginx.org/en/docs/
    想理解設定檔、靜態檔案、反向代理時,從 Beginner’s Guide 這類入門文件開始看。
  3. Docker Hub 官方映像檔https://hub.docker.com/_/nginx
    要用 Docker 跑 Nginx 時,看這裡。重點看它是不是 Docker Official Image、有哪些 Tags、Overview 裡有沒有範例指令。

讀文件的順序:官網看「這是什麼」→ 官方文件看「它怎麼運作」→ Docker Hub 看「這個 Image 怎麼用」。

Nginx 的角色:

  • 靜態檔案伺服器:傳送 HTML、CSS、JS、圖片等網頁檔案給瀏覽器
  • 反向代理(Reverse Proxy):站在使用者和後端伺服器之間,把請求轉發到對的地方。例如你的 Flask 跑在 5000 port,Nginx 可以把 80 port 的請求轉給它
  • 負載均衡(Load Balancer):當流量很大時,把請求分散到多台伺服器

Nginx vs Apache:

NginxApache
誕生年份2004 年1995 年
架構事件驅動(非同步),處理大量連線很強每個請求一個線程,連線多了容易吃資源
市佔率目前第一(約 34%)第二(約 29%)
適合場景高流量網站、反向代理傳統網站、需要 .htaccess

現在幾乎所有大型網站(Netflix、Dropbox、WordPress.com)都在用 Nginx。透過 Docker,我們可以一行指令就把它跑起來。

為什麼不能直接用 localhost 上線?

很多初學者寫好一個網站,用 python app.py 跑起來後在瀏覽器看到 http://localhost:5000 能動,就以為「網站完成了」。但 localhost 只是你自己的電腦,別人完全連不到。

要讓網站真正上線、讓全世界的人都能用,中間還需要很多東西:

初學者以為的流程:
  寫好程式 → localhost 能跑 → 完成!

實際上線的流程:
  寫好程式 → Web 伺服器(Nginx)→ 網域(Domain)→ HTTPS 憑證 → 部署到伺服器

localhost 和正式上線的差別:

localhost 開發環境正式上線環境
誰能連只有你自己全世界
網址http://localhost:5000https://your-domain.com
效能一個人用沒問題100 人同時連就可能掛掉
安全性沒有 HTTPS需要 SSL 憑證加密
穩定性電腦關機就斷了24 小時不中斷

Web 伺服器(如 Nginx)扮演的角色:

Flask、Django 這類框架自帶的開發伺服器(python app.py)是專門給開發時測試用的,不適合直接拿來上線,原因是:

  • 一次只能處理很少的請求,多人同時連線就會卡住
  • 沒有安全防護,容易被攻擊
  • 沒有快取機制,效能很差

正式上線時會在前面擋一個 Nginx,由它負責:

  1. 接收所有使用者的請求
  2. 處理靜態檔案(圖片、CSS、JS)——這些 Nginx 處理得比 Python 快幾十倍
  3. 把需要運算的請求轉發給後端的 Flask/Django(這就是反向代理)
  4. 處理 HTTPS 加密
使用者 → Nginx(80/443 port)→ Flask(5000 port)
            ↓
     靜態檔案直接回傳

記住:localhost 是開發用的,不是上線用的。真正的網站都需要 Web 伺服器來處理流量和安全性。

步驟 1:拉取 Nginx 映像檔

docker pull nginx

步驟 2:啟動容器

在執行指令之前,先了解兩個重要的概念:

什麼是宿主機(Host)?

在 Docker 的世界裡,你正在用的這台電腦就叫做宿主機(Host),而 Docker 跑出來的環境叫做容器(Container)。兩者是隔離的:

┌─────────────────────────────────┐
│  宿主機(你的 Windows 電腦)     │
│                                 │
│   ┌──────────┐  ┌──────────┐   │
│   │ 容器 A   │  │ 容器 B   │   │
│   │ (Nginx)  │  │ (MySQL)  │   │
│   └──────────┘  └──────────┘   │
│                                 │
└─────────────────────────────────┘
  • 容器有自己的檔案系統、程序、網路,跟宿主機是分開的
  • 要讓宿主機和容器之間溝通,需要用 -p(端口映射)和 -v(掛載目錄)來「開通道」
  • Docker 指令中看到的「主機:容器」格式,「主機」就是指宿主機

什麼是 Port(連接埠)?

你的電腦只有一個 IP 位址,但上面可能同時跑很多服務(網頁、資料庫、信件…)。Port 就是用來區分這些服務的「門牌號碼」,範圍是 0 ~ 65535。

常見的 Port:

Port用途
80HTTP 網頁(瀏覽器預設)
443HTTPS 加密網頁
3306MySQL 資料庫
5000Flask 預設
8080常用的替代 HTTP Port

當你在瀏覽器輸入 http://localhost:8080 時,就是在連線到你自己電腦(localhost)的 8080 號門。

投影片補充 1:電腦的 Port 在分什麼?

可以把 IP 想成一棟大樓的地址,Port 就是大樓裡每個服務的門牌。電腦總共有 065535 號 port,不同範圍通常有不同用途:

Port 範圍名稱通常用途
0 - 1023Well-known ports系統和標準服務常用,例如網頁、DNS、SSH
1024 - 49151Registered ports應用程式或資料庫常用,例如 MySQL、PostgreSQL、Redis
49152 - 65535Dynamic / private ports系統暫時分配給程式連線使用,通常不用手動指定

常見例子:

Port服務你可以怎麼理解
22SSH遠端登入伺服器
53DNS把網址查成 IP
80HTTP一般網頁
443HTTPS加密網頁
3000Node.js / React 開發伺服器常見 port前端開發時常看到
3306MySQL資料庫連線
5000FlaskPython Flask 開發常見 port
5432PostgreSQL資料庫連線
6379Redis快取資料庫
8080替代 HTTP port開發、測試或 Docker 練習常用

所以 localhost:8080 的意思是:連到「自己這台電腦」的 8080 號門。如果 Docker 指令寫 -p 8080:80,意思就是把主機的 8080 號門,轉到容器裡的 80 號門。

投影片補充 2:查本機目前有哪些 Port 正在被使用

有時候 Docker 容器啟動失敗,不是 Docker 壞掉,而是你要用的 port 已經被其他程式佔用了。可以先用下面的指令看本機目前有哪些 port 正在監聽。

Windows PowerShell:

# 查看目前正在監聽的 port
netstat -ano | findstr LISTENING

# 只查特定 port,例如 8080
netstat -ano | findstr :8080

輸出最後一欄是 PID(Process ID),可以再查是哪個程式:

tasklist /FI "PID eq 1234"

macOS Terminal:

# 查看目前正在監聽的 port
lsof -nP -iTCP -sTCP:LISTEN

# 只查特定 port,例如 8080
lsof -nP -iTCP:8080 -sTCP:LISTEN

如果看到某個 port 已經被佔用,就換一個主機 port。例如原本 -p 8080:80 失敗,可以改成 -p 8081:80

docker run -d --name my-web -p 8080:80 nginx

這裡的 -p 8080:80 就是端口映射——把主機的 8080 port 對應到容器內部的 80 port。容器裡的 Nginx 監聯 80,但從外面要透過 8080 才能連進去。

Windows 小提醒:

  • -p-v 的格式都是「主機:容器」,冒號左邊是你的電腦,右邊是容器內部
  • Windows 路徑用 -v 掛載時要用雙引號,單引號會失敗:
    # 正確 ✓
    -v "C:\my-project:/app"
    
    # 錯誤 ✗
    -v 'C:\my-project:/app'

步驟 3:打開瀏覽器

前往 http://localhost:8080,你會看到 “Welcome to nginx!” 的歡迎頁面。

恭喜!你剛剛用一行指令就架好了一個 Web 伺服器。

步驟 4:用 docker exec 進去容器裡面逛

容器裡面到底長什麼樣?我們可以用 docker exec 進去看看:

# 進入 Nginx 容器
docker exec -it my-web bash

現在你已經「進入」容器內部了,來探索一下:

# 1. 看看現在在哪裡
pwd

# 2. 看看根目錄有什麼
ls /

# 3. 去找 Nginx 的網頁檔案在哪裡
cd /usr/share/nginx/html

# 4. 看看有哪些檔案
ls

# 5. 看看歡迎頁面的內容
cat index.html

# 6. 離開容器
exit

你會看到 /usr/share/nginx/html/index.html 就是剛才瀏覽器顯示的歡迎頁面。這就是容器裡面的檔案系統——跟宿主機完全獨立。

思考一下:如果你用 -v 把宿主機的資料夾掛載到 /usr/share/nginx/html,容器裡看到的就會是你宿主機的檔案,這就是 Volume 掛載的原理。

步驟 5:練習容器操作

# 查看容器狀態
docker ps

# 查看 log
docker logs my-web

# 停止容器
docker stop my-web

# 重新啟動
docker start my-web

# 用完後刪除
docker rm -f my-web
0%