Docker 數據卷(Volume)詳細介紹
1. 什么是 Docker 數據卷?
Docker 數據卷(Volume)是一種用于 持久化數據 和 容器間數據共享 的機制。由于容器的存儲是臨時的,容器刪除后其中的數據會丟失,因此使用數據卷可以保證數據不會隨著容器的銷毀而丟失。
2. 數據卷的特點
- 持久化存儲:容器刪除后,數據卷仍然存在,不會隨容器刪除而丟失。
- 容器間共享:多個容器可以掛載同一個數據卷,實現數據共享。
- 高性能:相比于
bind mount
(綁定掛載),數據卷由 Docker 管理,性能更優。 - 獨立于文件系統:可以在不同的操作系統或存儲驅動(如 overlay2、aufs)間使用。
3. 常見的 Docker 數據卷操作
3.1 創建和管理數據卷
(1)創建數據卷
docker volume create my_volume
這個命令會創建一個名為
my_volume
的數據卷,并由 Docker 管理。
(2)查看所有數據卷
docker volume ls
列出當前所有的 Docker 數據卷。
(3)查看數據卷詳細信息
docker volume inspect my_volume
顯示
my_volume
的詳細信息,包括存儲位置、驅動等。
(4)刪除數據卷
docker volume rm my_volume
刪除
my_volume
數據卷。注意:如果某個容器正在使用該數據卷,刪除會失敗。
(5)清理未使用的數據卷
docker volume prune
刪除所有未被任何容器使用的 Docker 數據卷。
4. 在容器中使用數據卷
4.1 使用 --mount
掛載數據卷
推薦使用 --mount
,它的語法清晰,適用于復雜場景:
docker run -d --name my_container --mount source=my_volume,target=/app busybox
source=my_volume
:使用名為my_volume
的 Docker 數據卷。target=/app
:把my_volume
掛載到容器內的/app
目錄。
4.2 使用 -v
掛載數據卷
-v
語法較老,但仍然常用:
docker run -d --name my_container -v my_volume:/app busybox
作用與 --mount
相同,但 -v
不支持某些高級選項(如 readonly
)。
5. 綁定掛載(Bind Mounts)
除了 Docker 管理的數據卷,Docker 還支持將宿主機目錄直接掛載到容器中:
docker run -d --name my_container -v /host/path:/container/path busybox
這種方式適用于:
- 開發環境(宿主機和容器同步文件)。
- 日志文件存儲(容器刪除后,日志仍然保留)。
? 注意:Bind Mount 依賴于宿主機的路徑,可能會導致跨平臺兼容性問題。
6. 只讀掛載
為了提高安全性,可以使用 :ro
(只讀)掛載:
docker run -d --name my_container -v my_volume:/app:ro busybox
容器可以讀取
/app
目錄下的內容,但不能修改。
同樣,使用 --mount
:
docker run -d --name my_container --mount source=my_volume,target=/app,readonly busybox
7. 共享數據卷
多個容器可以共享同一個數據卷:
docker run -d --name container1 -v my_volume:/app busybox
docker run -d --name container2 -v my_volume:/app busybox
container1
和container2
都可以訪問/app
目錄,實現數據共享。
8. 備份和恢復數據卷
8.1 備份數據卷
docker run --rm -v my_volume:/data -v $(pwd):/backup busybox tar -czf /backup/backup.tar.gz -C /data .
-v my_volume:/data
:將my_volume
掛載到容器的/data
。-v $(pwd):/backup
:把宿主機當前目錄掛載到容器的/backup
。tar -czf
:打包/data
目錄下的內容,生成backup.tar.gz
。
8.2 恢復數據卷
docker run --rm -v my_volume:/data -v $(pwd):/backup busybox tar -xzf /backup/backup.tar.gz -C /data
該命令會把
backup.tar.gz
中的數據解壓到my_volume
里。
9. 刪除數據卷
9.1 刪除單個數據卷
docker volume rm my_volume
9.2 刪除未被使用的所有數據卷
docker volume prune
這個命令會刪除所有沒有被任何容器使用的 Docker 數據卷。
10. 數據卷與 Docker Compose
在 docker-compose.yml
文件中,可以定義數據卷:
version: '3'
services:app:image: busyboxvolumes:- my_volume:/app
volumes:my_volume:
然后運行:
docker-compose up -d
my_volume
會自動創建并掛載到/app
。
11. 總結
重點知識回顧
關鍵點 | 說明 |
---|---|
docker volume create my_volume | 創建數據卷 |
docker volume ls | 查看所有數據卷 |
docker volume inspect my_volume | 查看數據卷詳情 |
docker volume rm my_volume | 刪除數據卷 |
docker volume prune | 清理未使用的數據卷 |
docker run -v my_volume:/app busybox | 掛載數據卷 |
docker run -v /host/path:/container/path busybox | 綁定掛載 |
docker run -v my_volume:/app:ro busybox | 只讀掛載 |
docker-compose.yml | 在 Docker Compose 中使用數據卷 |
tar -czf 和 tar -xzf | 備份和恢復數據卷 |
Docker 數據卷是 持久化數據 和 容器間數據共享 的關鍵工具,合理使用可以大大提高數據管理的靈活性和安全性。對于使用數據卷的必要性和好處,請閱讀文章:docker數據卷的好處與必要性