2025年12月29日 星期一

Docker use Named Volumes(具名磁碟卷)for MySQL

 在 Docker 中,Named Volumes(具名磁碟卷) 是官方強烈推薦用於 MySQL 資料庫的持久化方案。與直接指定主機路徑的 Bind Mounts 不同,Named Volumes 由 Docker 引擎完全託管,能提供更好的效能、安全性和可移植性。

以下是針對 MySQL 使用 Named Volumes 的詳細說明與實作:


1. 為什麼 MySQL 要用 Named Volumes?

  • 極致效能: 在 Linux 環境下,Named Volumes 繞過了部分使用者權限檢查與主機檔案系統的同步開銷,I/O 讀寫效能比 Bind Mounts 更接近原生磁碟。

  • 自動初始化: 當你掛載一個空的 Named Volume 到包含資料的容器路徑(如 /var/lib/mysql)時,Docker 會自動將鏡像中的初始資料複製到該 Volume 中。

  • 管理方便: 你可以使用 docker volume lsinspect 直接管理,不必擔心主機目錄的權限問題(UID/GID 衝突)。

  • 備份與遷移: 透過 Docker API 即可操作,且在不同的作業系統(如從開發用的 Mac 到生產用的 Ubuntu)之間具有更好的一致性。


2. 實作步驟:使用 Docker CLI

你可以先手動建立一個 Volume,或者在啟動容器時由 Docker 自動建立:

Bash
# 1. 手動建立名為 mysql_data 的磁碟卷
docker volume create mysql_data

# 2. 啟動 MySQL 容器並掛載此 Volume
# 注意:冒號左邊是 Volume 名稱,右邊是 MySQL 預設的資料存放路徑
docker run -d \
  --name my-mysql \
  -e MYSQL_ROOT_PASSWORD=your_password \
  -v mysql_data:/var/lib/mysql \
  mysql:latest

3. 實作步驟:使用 Docker Compose(推薦)

docker-compose.yml 中定義 Named Volumes 是最標準的做法,易於維護且清晰:

YAML
version: '3.8'

services:
  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: my-secret-pw
    volumes:
      # 左側為定義的 Volume 名稱,右側為容器內路徑
      - mysql-db-data:/var/lib/mysql

# 關鍵點:必須在最頂層聲明 volumes
volumes:
  mysql-db-data:

4. 管理與查詢

建立完成後,你可以透過以下指令進行管理:

  • 查看清單: docker volume ls(你會看到一個名為 mysql-db-data 的磁碟卷)。

  • 查看實體位置: docker volume inspect mysql-db-data

    • 在 Ubuntu 上,預設路徑通常位於 /var/lib/docker/volumes/mysql-db-data/_data

  • 備份資料: 雖然可以直接去上述路徑拷貝檔案,但推薦的做法是啟動一個臨時容器來打包:

    Bash
    docker run --rm -v mysql-db-data:/source -v $(pwd):/backup alpine tar cvf /backup/mysql_backup.tar /source
    

注意事項

  1. 不要隨意刪除: 執行 docker-compose down 不會刪除 Volume,但執行 docker-compose down -vdocker volume rm 會將資料永久刪除。

  2. 檔案權限: Docker 會處理 Named Volume 的權限,避免了手動掛載主機目錄時常見的 Permission Denied 問題。

  3. 磁碟剩餘空間: 由於資料儲存在 /var/lib/docker 下,請確保該分割區(通常是根目錄 /)有足夠的空間。

這部影片示範了如何透過 Docker Volume 管理 MySQL 資料,幫助你快速理解資料如何在容器移除後依然保持不變。

這部影片詳細演示了 Docker Volumes 的運作原理,並透過 MySQL 的實際操作展示了如何確保資料庫在容器重啟或刪除後依然持久存在。




沒有留言:

張貼留言