Docker 進階實戰:Volume、Port Mapping 與 Docker Compose 完整指南
更新日期: 2025 年 3 月 4 日
本文為 Docker 基本介紹系列文,第 4 篇:
- AMD64 與 ARM64 的全面解析:新手必讀指南
- 新手必看!如何在筆電安裝 Docker?完整架構選擇指南
- Docker 新手指南:從鏡像到容器,完整概念與操作教學
- Docker 進階實戰:Volume、Port Mapping 與 Docker Compose 完整指南 👈進度
- 使用 Docker 運行 Python:互動模式與腳本執行完整指南
當我們學習 Docker 的基礎時,已經掌握了鏡像(Image)、容器(Container) 和 Dockerfile,能夠建立並運行容器。
但在實際開發過程中,我們還需要解決以下幾個問題:
- 如何讓容器內的程式碼與本機同步?(不想每次修改程式後都要重建容器)
- 如何讓容器內的應用程式可以被本機存取?(確保 Flask 或其他 Web 應用程式能在瀏覽器打開)
- 如果有多個服務(如 Web + 資料庫 + 快取)該怎麼管理?(避免每次手動啟動所有服務)
為了解決這些問題,Docker 提供了 Volume(資料卷)、Port Mapping(端口對應)與 Docker Compose。
這篇文章將帶你深入理解這三個關鍵概念,並提供詳細的指令與範例,讓你能夠順利應用在開發環境中!
Volume(資料卷):本機與容器同步資料夾
概念
Docker Volume(資料卷)允許我們將本機的資料夾掛載到容器內。
這樣可以確保本機的程式碼變更會即時反映在容器內,而不需要每次修改程式碼後都重新建構(docker build
)或重啟容器。
類比
你可以把 Volume 想像成雲端同步資料夾,你在本機修改的檔案,容器內也會同步更新。
這對於開發環境來說非常重要,因為這樣就不需要在每次修改程式碼後重建鏡像,能夠提升開發效率。
📌 常用指令
指令 | 功能 |
---|---|
docker run -v $(pwd):/app my-python-app | 將當前資料夾掛載到容器內的 /app |
docker volume ls | 列出所有 Docker Volume |
docker volume rm <volume_name> | 刪除某個 Volume |
🔹 示範:啟動容器並掛載本機程式碼
docker run -v $(pwd):/app my-python-app
這條指令的作用是:
-v $(pwd):/app
:將 當前資料夾($(pwd)
代表當前目錄)掛載到容器內的/app
資料夾。my-python-app
:運行my-python-app
這個應用程式。
這樣當你修改本機的 app.py
,容器內的程式碼也會同步更新!🔥
Port Mapping(端口對應):讓容器內的應用程式對外開放
概念
當你在 Docker 容器內運行 Flask 或其他 Web 應用程式時,它通常會監聽某個 內部端口(例如 Flask 預設監聽 5000
端口)。
但是,這個端口預設情況下是無法被外部存取的。
我們需要使用 Port Mapping(端口對應),讓容器內的端口與本機的端口綁定,這樣才能透過瀏覽器訪問 Flask 應用程式。
類比
Port Mapping 就像是把辦公室內線電話(容器端口)轉接到手機(本機端口),這樣外部才能撥打這支電話。
常用指令
指令 | 功能 |
---|---|
docker run -p 5000:5000 my-python-app | 把容器內的 5000 端口對應到本機的 5000 端口 |
docker ps | 檢查容器是否在運行 |
docker stop <container_id> | 停止運行中的容器 |
🔹 示範:啟動 Flask 應用程式並開放端口
docker run -p 5000:5000 my-python-app
這條指令的作用是:
-p 5000:5000
:把容器內的 5000 端口對應到本機的 5000 端口,這樣你就可以透過http://localhost:5000
訪問 Flask 應用程式。
如果你在瀏覽器開啟 http://localhost:5000
,應該會看到 Flask 應用程式的輸出!🎉
Docker Compose:一次管理多個服務
概念
當你的專案有多個容器需要協作(例如 Flask 需要連接 Redis 或 MySQL),如果用 docker run
來啟動每個容器會非常麻煩。
因此,Docker 提供了 Docker Compose,讓你可以透過 一個設定檔 來管理多個容器,並一次性啟動所有服務!
類比
Docker Compose 就像是一個「指揮中心」,當你的應用程式需要 Web 伺服器、資料庫、快取等多個組件時。
你不需要手動逐一啟動它們,而是使用 Docker Compose 一次性啟動所有服務。
Docker Compose 設定檔(docker-compose.yml)
假設你的專案有兩個服務:
- Web 應用程式(Flask)
- Redis 快取
你可以建立一個 docker-compose.yml
,定義這兩個服務:
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: redis:alpine
ports:
- "6379:6379"
常用指令
指令 | 功能 |
---|---|
docker-compose up -d | 啟動所有服務 |
docker-compose ps | 查看所有正在運行的容器 |
docker-compose down | 停止並刪除所有服務 |
🔹 示範:啟動所有服務
docker-compose up -d
這條指令的作用是:
- 讀取
docker-compose.yml
設定檔 - 自動啟動 Flask 應用程式(web)與 Redis 服務
-d
參數讓它在背景執行,不佔用終端機
🔹 示範:停止所有服務
docker-compose down
這樣就能一次性關閉所有服務,而不用手動停止每個容器。
總結:這篇文章學到了什麼?
✅ Volume(資料卷):讓本機資料夾與容器同步,修改程式碼後無需重建容器
✅ Port Mapping(端口對應):讓容器內的應用程式對外開放,確保 Web 應用程式可以在本機訪問
✅ Docker Compose:一次性啟動多個容器,適用於需要 Web 伺服器 + 資料庫 + 其他服務的應用
透過這篇文章,相信你已經掌握了 Docker 進階技巧,現在就試著應用在你的開發環境吧!🚀