創建的容器都是沒有指定 volume的,為什么docker volume ls命令會看到很多volume列表?
有那么一天,停止了世界所有的容器(在你電腦上),執行以下命令
docker volume ls
docker volume ls | wc -l
哎呦,我去,怎么這么多啥玩意,再執行以下命令看占了我多少磁盤空間
# 使用 docker inspect 命令(如果 volume 驅動支持大小 Size 報告):
docker volume inspect <volume_name> --format '{{ .Size }}'
# 查看所有 volumes 的詳細信息(這玩意不太準,可以當做估算大小吧)
docker system df -v
# 更精確
sudo du -sh /var/lib/docker/volumes/*
# 如果你想要更精確的結果,可以直接查看 Docker volume 的存儲位置的實際磁盤占用大小
# linux通常在 /var/lib/docker/volumes/ 目錄下
# 在 macOS 上,Docker Desktop 使用的是一個特殊的虛擬機來運行 Docker 引擎,因此 Docker volumes 的實際存儲位置比較特殊:
# ~/Library/Containers/com.docker.docker/Data/vms/0/data/docker/volumes/
# 還有一個 macOS 下的 orbstack
# OrbStack Docker volumes 的默認存儲路徑(跟 docker volume inspect 命令輸出的不一致)
# 通過 brew 安裝的 orbstack Docker volumes 的默認存儲路徑(通過下面命令找到了)
find / -type d -name "volumes" 2>/dev/null | grep -i orbstack
/System/Volumes/Data/Users/<your_username>/OrbStack/docker/volumes
~/OrbStack/docker/volumes
這是因為 Docker 有一個特性叫做"匿名卷"(Anonymous Volumes)。即使你沒有顯式指定 volume,Docker 也會在以下情況自動創建 volume:
1.Dockerfile 中的 VOLUME 指令
# 當 Dockerfile 包含這樣的指令時,會自動創建匿名卷
VOLUME /data
2.Docker Compose/Swarm/Stack 中的隱式聲明
services:
db:
image: mysql
# MySQL 鏡像的 Dockerfile 中定義了 VOLUME,會自動創建
3.某些鏡像的默認行為
比如:
- MySQL 會為數據目錄創建 volume
- Redis 會為數據文件創建 volume
- MongoDB 會為數據庫文件創建 volume
查看這些自動創建的 volume 的來源:
# 查看 volume 詳細信息
docker volume inspect volume_name
# 查看容器的 volume 掛載信息
docker inspect container_name | grep -A 10 "Mounts"
那么真正需要的問題來,不知道也就算了,現在知道了,我們不希望莫名其妙多了好多莫名的 volume,應該清理?以及如何保持純凈或最佳實踐?
清理建議:
1.使用 docker volume ls -f dangling=true 查看未被使用的 volume
2.使用 docker volume prune 清理未使用的 volume
3.如果要避免創建匿名卷,可以:
- 在 docker run 時使用 --rm 參數(容器刪除時自動刪除匿名卷)
- 顯式定義具名卷(named volume)
- 使用 bind mount 替代 volume
docker volume 相關命令
docker volume 幫助命令
docker volume --help
列出所有 volumes
docker volume ls
查看指定的 volume 的詳細信息
docker volume inspect <volume_name>
查看哪些容器正在使用特定的 volume
docker ps -a filter volume=<volume_name>
查看 volume 的具體內容
ls /var/lib/docker/volumes/<volume_name>/_data
查看 dangling (未被使用) 的 volumes
docker volume ls -f dangling=true
刪除指定的 volume
docker volume rm <volume_name>
列出并刪除指定條件的 volumes
docker volume ls -qf dangling=true | xargs -r docker volume rm
刪除所有未使用的 volumes
docker volume prune
最佳實踐是在生產環境中使用具名卷,這樣更容易管理和維護:
# 創建具名卷
docker run -v my_volume:/data image_name
非生產環境,比如開發/測試環境,使用 tmpfs,性能更高,這樣容器刪除或重啟會直接清空,無殘留
# 創建使用 tmpfs 的容器
docker run --tmpfs /app/cache nginx
# 可以指定大小和權限
docker run --tmpfs /app/cache:rw,size=1g,noexec nginx
# or
# 限制 tmpfs 大小
docker run --tmpfs /tmp:size=100M nginx
# 設置權限
docker run --tmpfs /tmp:rw,noexec,nosuid,size=100M nginx
# 臨時文件
docker run --tmpfs /tmp nginx
# 會話數據
docker run --tmpfs /app/sessions my-web-app
# 緩存數據
docker run --tmpfs /app/cache redis
tmpfs 不適用的場景
- 數據庫等需要持久化的
- 用戶上傳文件等需要支持持久化的
- 配置文件
- 日志文件
- 等
更佳的混合使用策略
# docker-compose.yml 示例
services:
web:
image: nginx
volumes:
- ./data:/app/data # 持久化數據使用 volume
tmpfs:
- /tmp # 臨時文件使用 tmpfs
- /app/cache # 緩存使用 tmpfs
總結:
- tmpfs 適合處理臨時數據、緩存和敏感信息
- 需要持久化的數據還是應該使用 volume 或 bind mount
- 建議根據數據特性選擇合適的存儲方式,可以混合使用不同的存儲策略
[支持/訂閱](https://afdian.com/a/taadis)作者,以獲得更多服務.

浙公網安備 33010602011771號