0%

Docker Volume 教學:輕鬆管理容器數據的秘密武器

嗨!今天我們要來聊聊 Docker 中的一個超實用功能——Docker Volume。如果你已經開始使用 Docker,一定聽過容器是「短暫的」這件事。就像便利商店買的一次性咖啡杯,用完就丟,裡面的咖啡(數據)也跟著不見了。但如果我們希望咖啡能保存下來,甚至在不同的杯子間共享呢?這就是 Docker Volume 要解決的問題!它就像一個神奇的「保溫瓶」,讓你的數據在容器間安全又方便地流動。

什麼是 Docker Volume?

簡單來說,Docker Volume 是 Docker 用來持久化數據的一種機制。容器本身就像一台臨時的電腦,關機後什麼都不剩。但有時候我們需要存東西,比如網站的資料庫數據、用戶上傳的照片,這時候就需要 Volume 這個「外接硬碟」來幫忙。

想像你在外面煮飯:

  • 容器:像是你租來的一個臨時廚房,用完就還回去。
  • 數據:是你做的菜,想帶走給朋友吃。
  • Volume:就像是你帶來的便當盒,把菜裝進去,帶走後下次還能用。

Docker Volume 的核心任務,就是讓數據脫離容器的生命周期,變得可持久、可共享。

Docker Volume 的類型

Docker Volume 有三種類型,像不同的儲存工具:雲端儲物櫃、書桌抽屜和紙便條貼。以下是它們的特色:

  1. Volumes(Docker 管理的)

    通常也叫 “Docker-managed Volume” 或 “Named Volume”
    像是一個「雲端儲物櫃」,你告訴管理員「幫我存東西」,但具體放哪個櫃子你不用管,交給管理員保管。

    由 Docker 自動創建和管理,存放在主機的 /var/lib/docker/volumes 目錄下。

    • 場景:資料庫(如 MySQL)、簡單部署。
    • 優點:簡單,不用自己指定路徑,Docker 幫你搞定。
    • 缺點:位置固定,不太靈活。
    • docker run -v mysql-data:/var/lib/mysql mysql
  2. Bind Mounts(綁定掛載)

    像是「你家書桌抽屜」,你知道東西放哪,想拿就拿,想改就改。

    可以直接指定主機上的某個路徑(比如 /home/user/data)掛載到容器裡。

    • 場景:開發(hotfix)、已有數據。
    • 優點:完全掌控數據位置,適合開發或已有數據的情況。
    • 缺點:需要手動管理主機路徑。
    • docker run -v /home/user/code:/app my-app
  3. tmpfs Mounts(記憶體掛載)

    像一個「紙便條貼」,你隨手寫下臨時筆記,用完就丟。

    數據只存在記憶體(RAM)中,不寫入硬碟,容器停止後即消失。

    • 場景:敏感數據、高效臨時(如日誌)。
    • 優點:速度快、安全,適合臨時數據。
    • 缺點:不持久,關機就沒了。
    • docker run --mount type=tmpfs,destination=/var/log/nginx nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Host]                                                     [Container]
| |
| +---------------------------------+ |
| | /var/lib/docker/volumes/my-data | -----------------> | /app/data (persistent data)
| | (my-data) | "Managed by Docker" |
| +---------------------------------+ |
| |
| +------------------------+ |
| | /home/user/data | ----------------------> | /app/data (host files)
| | (user files) | "User-specified path" |
| +------------------------+ |
| |
| | +----------------------+
| | | /tmp (temporary data)|
| | | |
| | +----------------------+
| | "Memory"
  • Volume:從主機的 Docker 管理目錄連到容器。
  • Bind Mount:從主機指定路徑連到容器。
  • tmpfs Mount:只在容器內,不連主機。

今天我們主要聚焦在 Managed VolumesBind Mounts,因為這是日常應用中最常見的兩兄弟。

常用指令:動手操作看看

好了,理論講完!以下是幾個核心指令,搭配範例讓你馬上上手。

1. 創建一個 Volume

1
docker volume create my-data
  • 這就像買了一個空的便當盒,名字叫 my-data。Docker 會在它的倉庫裡幫你準備好。

2. 查看所有 Volume

1
docker volume ls

輸出:

1
2
DRIVER    VOLUME NAME
local my-data
  • 這是檢查你有多少便當盒的好方法。

3. 在容器中使用 Volume

假設我們跑一個 Nginx 容器,想把網站檔案存在 Volume 裡:

1
docker run -d --name my-nginx -v my-data:/usr/share/nginx/html nginx
  • -v my-data:/usr/share/nginx/html 的意思是:把 my-data 這個便當盒掛載到容器的 /usr/share/nginx/html 目錄。
  • 現在你在容器裡改檔案,數據會安全存進 my-data

4. 使用 Bind Mount

如果你想直接用主機上的資料夾:

1
docker run -d --name my-nginx -v /home/user/website:/usr/share/nginx/html nginx
  • /home/user/website 是主機上的路徑,容器會直接用它,像借用朋友家的冰箱一樣。

5. 檢查 Volume 詳情

1
docker volume inspect my-data
  • 會告訴你這個 Volume 的「身家背景」,比如存放在主機的哪個路徑:
    1
    2
    3
    4
    5
    6
    7
    [
    {
    "Name": "my-data",
    "Driver": "local",
    "Mountpoint": "/var/lib/docker/volumes/my-data/_data"
    }
    ]

6. 清理無用的 Volume

1
docker volume prune

把沒人用的便當盒丟掉,小心別誤刪重要的!

應用操作:一個簡單的案例

假設你想用 Docker 跑一個 MySQL 資料庫,並確保數據不會因為容器停止而丟失。我們來實作:

步驟 1:創建 Volume

1
docker volume create mysql-data

步驟 2:啟動 MySQL 容器

1
docker run -d --name my-mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
  • -v mysql-data:/var/lib/mysql:把資料庫數據存到 mysql-data
  • -e MYSQL_ROOT_PASSWORD=123456:設置 root 密碼。

步驟 3:模擬容器掛掉

停止並刪除容器:

1
2
docker stop my-mysql
docker rm my-mysql

步驟 4:重新啟動新容器

1
docker run -d --name my-mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql

你會發現資料庫數據依然存在,因為它被安全地存在 mysql-data 裡!
這就像你把咖啡裝進保溫瓶,換個杯子倒出來還是熱的。