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

Published February 4, 2025 by 徐培鈞
架構

當我們學習 Docker 的基礎時,已經掌握了鏡像(Image)容器(Container)Dockerfile,能夠建立並運行容器。

但在實際開發過程中,我們還需要解決以下幾個問題:

  • 如何讓容器內的程式碼與本機同步?(不想每次修改程式後都要重建容器)
  • 如何讓容器內的應用程式可以被本機存取?(確保 Flask 或其他 Web 應用程式能在瀏覽器打開)
  • 如果有多個服務(如 Web + 資料庫 + 快取)該怎麼管理?(避免每次手動啟動所有服務)

為了解決這些問題,Docker 提供了 Volume(資料卷)、Port Mapping(端口對應)與 Docker Compose

這篇文章將帶你深入理解這三個關鍵概念,並提供詳細的指令與範例,讓你能夠順利應用在開發環境中!


Volume(資料卷):本機與容器同步資料夾

概念

Docker Volume(資料卷)允許我們將本機的資料夾掛載到容器內

這樣可以確保本機的程式碼變更會即時反映在容器內,而不需要每次修改程式碼後都重新建構(docker build)或重啟容器。

類比

你可以把 Volume 想像成雲端同步資料夾,你在本機修改的檔案,容器內也會同步更新。

這對於開發環境來說非常重要,因為這樣就不需要在每次修改程式碼後重建鏡像,能夠提升開發效率

📌 常用指令

功能將當前資料夾掛載到容器內的 /app
功能列出所有 Docker Volume
功能刪除某個 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 就像是把辦公室內線電話(容器端口)轉接到手機(本機端口),這樣外部才能撥打這支電話。

常用指令

功能把容器內的 5000 端口對應到本機的 5000 端口
功能檢查容器是否在運行
功能停止運行中的容器

🔹 示範:啟動 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 常見語法:從零開始理解映像檔、容器與 Dockerfile

常用指令

功能啟動所有服務
功能查看所有正在運行的容器
功能停止並刪除所有服務

🔹 示範:啟動所有服務

docker-compose up -d

這條指令的作用是:

  • 讀取 docker-compose.yml 設定檔
  • 自動啟動 Flask 應用程式(web)與 Redis 服務
  • -d 參數讓它在背景執行,不佔用終端機

🔹 示範:停止所有服務

docker-compose down

這樣就能一次性關閉所有服務,而不用手動停止每個容器。


總結:這篇文章學到了什麼?

Volume(資料卷):讓本機資料夾與容器同步,修改程式碼後無需重建容器
Port Mapping(端口對應):讓容器內的應用程式對外開放,確保 Web 應用程式可以在本機訪問
Docker Compose:一次性啟動多個容器,適用於需要 Web 伺服器 + 資料庫 + 其他服務的應用

透過這篇文章,相信你已經掌握了 Docker 進階技巧,現在就試著應用在你的開發環境吧!🚀