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 需要開啟虛擬化功能(通常預設是開的)
檢查虛擬化是否開啟:
- 按
Ctrl + Shift + Esc打開工作管理員 - 點「效能」分頁
- 看 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 發生了什麼事:
- Docker 在本機找不到
hello-world映像檔 - 自動從 Docker Hub 下載了這個映像檔
- 用這個映像檔建立了一個容器
- 容器執行後印出了歡迎訊息
- 容器執行完畢後自動停止
Docker Desktop 介面導覽與 GUI 操作
Docker Desktop 提供了圖形化介面(GUI),讓你不用打指令也能管理容器和映像檔。打開 Docker Desktop,認識主要介面:
左側選單:
- Containers:查看所有容器的狀態(執行中 / 已停止)
- Images:查看本機已下載的映像檔
- Volumes:查看資料卷(後面會用到)
- Settings(齒輪圖示):
- General:一般設定
- Resources:資源相關設定(本課程不需要修改)
- Docker Engine:進階設定
Containers 頁面的 GUI 操作:
在 Containers 頁面,每個容器旁邊都有操作按鈕:
| 按鈕 | 功能 | 等同的 CLI 指令 |
|---|---|---|
| ▶ (Play) | 啟動已停止的容器 | docker start |
| ⏹ (Stop) | 停止執行中的容器 | docker stop |
| 🔄 (Restart) | 重新啟動容器 | docker restart |
| 🗑 (Delete) | 刪除容器 | docker rm |
| 📋 (Logs) | 查看容器的輸出 log | docker 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):把你在自己電腦上寫好的程式,放到伺服器上讓它正式運行、讓使用者可以使用的過程。就像餐廳做好菜之後要「出餐」,部署就是軟體的「出餐」。
為什麼要使用容器化?三大特性:
- 可攜性(Portability):容器化的應用程式可以打包成 Image,無論在何種作業環境中,只要安裝了 Docker,就能夠正常運行。這消除了不同環境之間的兼容性問題,使得部署變得更加簡單和快速。
- 隔離性(Isolation):使用容器化技術,應用程式之間的相互干擾會被隔離。這樣就能避免環境衝突的問題。例如,當一個應用程式需要特定版本的庫時,不會影響到其他應用程式的運行,提供了更加穩定的執行環境。
- 一致性(Consistency):當應用程式打包成 Image 時,無論在開發、測試還是生產環境中,都能確保執行結果的一致性。這對於減少「本地運行正常,部署後失敗」的情況至關重要,從而提高了開發效率與品質。
此外,容器還有一個重要的優勢:輕量化——比虛擬機快很多、佔的資源少很多。
補充:Apple Silicon 與 CPU 架構
現在大多數官方 Image(例如
node、python、nginx、ubuntu、alpine)都已支援多架構。同一個 Image tag 通常可以在不同 CPU 架構的電腦上使用,Docker 會自動下載合適的版本。初學者通常不需要特別處理。只有遇到這類錯誤時,才需要回頭檢查 Image 是否支援目前平台:
no matching manifest for linux/arm64/v8exec 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:
- 搜尋
python,會看到官方映像檔 - 點進去看映像檔的說明頁面
- 注意「Tags」——不同版本的映像檔
什麼是 Tag?
- Tag 就是映像檔的版本標籤
- 例如
python:3.11、python:3.11-slim、python: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 155MBREPOSITORY:映像檔名稱TAG:版本標籤IMAGE ID:唯一識別碼SIZE:映像檔大小
比較
python:3.11和python: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 這個名字,可以先查三個地方:
- Nginx 官網:
https://nginx.org/
先確認 Nginx 是什麼。官網會告訴你它是 Web 伺服器,也可以做反向代理、負載均衡、快取等工作。 - Nginx 官方文件:
https://nginx.org/en/docs/
想理解設定檔、靜態檔案、反向代理時,從 Beginner’s Guide 這類入門文件開始看。 - 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:
| Nginx | Apache | |
|---|---|---|
| 誕生年份 | 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:5000 | https://your-domain.com |
| 效能 | 一個人用沒問題 | 100 人同時連就可能掛掉 |
| 安全性 | 沒有 HTTPS | 需要 SSL 憑證加密 |
| 穩定性 | 電腦關機就斷了 | 24 小時不中斷 |
Web 伺服器(如 Nginx)扮演的角色:
Flask、Django 這類框架自帶的開發伺服器(python app.py)是專門給開發時測試用的,不適合直接拿來上線,原因是:
- 一次只能處理很少的請求,多人同時連線就會卡住
- 沒有安全防護,容易被攻擊
- 沒有快取機制,效能很差
正式上線時會在前面擋一個 Nginx,由它負責:
- 接收所有使用者的請求
- 處理靜態檔案(圖片、CSS、JS)——這些 Nginx 處理得比 Python 快幾十倍
- 把需要運算的請求轉發給後端的 Flask/Django(這就是反向代理)
- 處理 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 用途 80 HTTP 網頁(瀏覽器預設) 443 HTTPS 加密網頁 3306 MySQL 資料庫 5000 Flask 預設 8080 常用的替代 HTTP Port 當你在瀏覽器輸入
http://localhost:8080時,就是在連線到你自己電腦(localhost)的 8080 號門。
投影片補充 1:電腦的 Port 在分什麼?
可以把 IP 想成一棟大樓的地址,Port 就是大樓裡每個服務的門牌。電腦總共有 0 到 65535 號 port,不同範圍通常有不同用途:
| Port 範圍 | 名稱 | 通常用途 |
|---|---|---|
0 - 1023 | Well-known ports | 系統和標準服務常用,例如網頁、DNS、SSH |
1024 - 49151 | Registered ports | 應用程式或資料庫常用,例如 MySQL、PostgreSQL、Redis |
49152 - 65535 | Dynamic / private ports | 系統暫時分配給程式連線使用,通常不用手動指定 |
常見例子:
| Port | 服務 | 你可以怎麼理解 |
|---|---|---|
22 | SSH | 遠端登入伺服器 |
53 | DNS | 把網址查成 IP |
80 | HTTP | 一般網頁 |
443 | HTTPS | 加密網頁 |
3000 | Node.js / React 開發伺服器常見 port | 前端開發時常看到 |
3306 | MySQL | 資料庫連線 |
5000 | Flask | Python Flask 開發常見 port |
5432 | PostgreSQL | 資料庫連線 |
6379 | Redis | 快取資料庫 |
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