Docker 進階實戰:Volume、Port Mapping 與 Docker Compose 完整指南

更新日期: 2025 年 3 月 4 日

當我們學習 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)

假設你的專案有兩個服務:

  1. Web 應用程式(Flask)
  2. 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 進階技巧,現在就試著應用在你的開發環境吧!🚀

Similar Posts