嗨!今天我們要來聊聊 Docker 中的一個超實用功能——Docker Volume。如果你已經開始使用 Docker,一定聽過容器是「短暫的」這件事。就像便利商店買的一次性咖啡杯,用完就丟,裡面的咖啡(數據)也跟著不見了。但如果我們希望咖啡能保存下來,甚至在不同的杯子間共享呢?這就是 Docker Volume 要解決的問題!它就像一個神奇的「保溫瓶」,讓你的數據在容器間安全又方便地流動。
什麼是 Docker Volume?
簡單來說,Docker Volume 是 Docker 用來持久化數據的一種機制。容器本身就像一台臨時的電腦,關機後什麼都不剩。但有時候我們需要存東西,比如網站的資料庫數據、用戶上傳的照片,這時候就需要 Volume 這個「外接硬碟」來幫忙。
想像你在外面煮飯:
- 容器:像是你租來的一個臨時廚房,用完就還回去。
- 數據:是你做的菜,想帶走給朋友吃。
- Volume:就像是你帶來的便當盒,把菜裝進去,帶走後下次還能用。
Docker Volume 的核心任務,就是讓數據脫離容器的生命周期,變得可持久、可共享。
Docker Volume 的類型
Docker Volume 有三種類型,像不同的儲存工具:雲端儲物櫃、書桌抽屜和紙便條貼。以下是它們的特色:
Volumes(Docker 管理的)
通常也叫 “Docker-managed Volume” 或 “Named Volume”
像是一個「雲端儲物櫃」,你告訴管理員「幫我存東西」,但具體放哪個櫃子你不用管,交給管理員保管。由 Docker 自動創建和管理,存放在主機的
/var/lib/docker/volumes
目錄下。- 場景:資料庫(如 MySQL)、簡單部署。
- 優點:簡單,不用自己指定路徑,Docker 幫你搞定。
- 缺點:位置固定,不太靈活。
docker run -v mysql-data:/var/lib/mysql mysql
Bind Mounts(綁定掛載)
像是「你家書桌抽屜」,你知道東西放哪,想拿就拿,想改就改。
可以直接指定主機上的某個路徑(比如
/home/user/data
)掛載到容器裡。- 場景:開發(hotfix)、已有數據。
- 優點:完全掌控數據位置,適合開發或已有數據的情況。
- 缺點:需要手動管理主機路徑。
docker run -v /home/user/code:/app my-app
tmpfs Mounts(記憶體掛載)
像一個「紙便條貼」,你隨手寫下臨時筆記,用完就丟。
數據只存在記憶體(RAM)中,不寫入硬碟,容器停止後即消失。
- 場景:敏感數據、高效臨時(如日誌)。
- 優點:速度快、安全,適合臨時數據。
- 缺點:不持久,關機就沒了。
docker run --mount type=tmpfs,destination=/var/log/nginx nginx
1 | [Host] [Container] |
- Volume:從主機的 Docker 管理目錄連到容器。
- Bind Mount:從主機指定路徑連到容器。
- tmpfs Mount:只在容器內,不連主機。
今天我們主要聚焦在 Managed Volumes 和 Bind Mounts,因為這是日常應用中最常見的兩兄弟。
常用指令:動手操作看看
好了,理論講完!以下是幾個核心指令,搭配範例讓你馬上上手。
1. 創建一個 Volume
1 | docker volume create my-data |
- 這就像買了一個空的便當盒,名字叫
my-data
。Docker 會在它的倉庫裡幫你準備好。
2. 查看所有 Volume
1 | docker volume ls |
輸出:
1 | DRIVER VOLUME NAME |
- 這是檢查你有多少便當盒的好方法。
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 | docker stop my-mysql |
步驟 4:重新啟動新容器
1 | docker run -d --name my-mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql |
你會發現資料庫數據依然存在,因為它被安全地存在 mysql-data
裡!
這就像你把咖啡裝進保溫瓶,換個杯子倒出來還是熱的。