Docker Volume 基础操作
一、查看 Volume
查看所有 Volume:
docker volume ls
例如:
DRIVER VOLUME NAME
local postgres_data
local redis_data
local nexus_data
查看某个 Volume 的详细信息:
docker volume inspect postgres_data
输出类似:
[
{
"Name": "postgres_data",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/postgres_data/_data"
}
]
这里的 Mountpoint 是 Linux VM 内部 的路径,在 macOS 上不能直接访问。
二、创建 Volume
一般 Compose 会自动创建。
也可以手动:
docker volume create postgres_data
查看:
docker volume ls
三、删除 Volume
删除:
docker volume rm postgres_data
如果正在被容器使用:
volume is in use
需要:
docker stop postgres18
docker rm postgres18
docker volume rm postgres_data
或者:
docker compose down -v这里:
-v
表示:
删除 Compose 创建的所有 Volume。
这个命令以后会经常用。
四、查看 Volume 占用空间
Docker 自带:
docker system df -v例如:
VOLUME NAME SIZE
postgres_data 2.3GB
redis_data 30MB
这个命令很实用。
五、备份 Volume
Docker 官方其实就是建议:
启动一个临时容器。
例如:
docker run --rm \
-v postgres_data:/data \
-v $(pwd):/backup \
alpine \
tar czf /backup/postgres_data.tar.gz -C /data .
结果:
postgres_data.tar.gz
就在当前目录, 以后复制上传都方便。
六、恢复 Volume
先:
docker volume create postgres_data
然后:
docker run --rm \
-v postgres_data:/data \
-v $(pwd):/backup \
alpine \
sh -c "cd /data && tar xzf /backup/postgres_data.tar.gz"
恢复完成。
七、进入 Volume 查看文件
很多人不知道其实可以:
docker run --rm \
-it \
-v postgres_data:/data \
alpine sh
进入以后:
ls
你就能看到:
18/
继续:
cd 18/docker
或者实际的数据目录。
查看:
PG_VERSION
base
global
pg_wal
和 Bind Mount 没区别。
只是:
Finder 看不到而已。
八、复制 Volume 数据
例如:
docker run --rm \
-v postgres_data:/from \
-v postgres_backup:/to \
alpine \
sh -c "cp -a /from/. /to/"
几秒钟。
非常适合:
升级前:
做快照。
九、删除所有没用的 Volume
docker volume prune
会提示:
WARNING!
确认:
y
即可。
十、Compose 最佳实践
建议:
volumes:
postgres_data:
名字:
不要:
volumes:
data:
以后:
几十个项目。
全叫:
data
会疯掉。
建议:
postgres_data
redis_data
nexus_data
gitlab_data
一眼知道用途。
养成一个习惯
之前搭建过:
- PostgreSQL
- Redis
- Nexus
- GitLab
- ELK
以后项目越来越多,建议统一 Volume 命名规范,例如:
postgres_data
postgres_logs
redis_data
nexus_data
gitlab_config
gitlab_logs
gitlab_data
elasticsearch_data
prometheus_data
grafana_data
如果是多个项目,再加项目前缀:
mall_postgres_data
mall_redis_data
blog_postgres_data
这样即使执行:
docker volume ls
看到几十个 Volume,也能立即知道它们属于哪个项目、存放什么数据。
特别实用的小技巧
如果经常需要”重置数据库”,可以把下面几个命令记住:
# 停止并删除容器(保留数据)
docker compose down
# 停止并删除容器,同时删除数据库数据
docker compose down -v
# 删除所有未被使用的 Volume
docker volume prune
用 Volume 后,数据库的生命周期和数据的生命周期被彻底分离了:
down:相当于关机,数据还在。down -v:相当于格式化数据库,重新初始化。up -d:如果 Volume 存在,直接恢复之前的数据;如果不存在,则创建一个全新的数据库。
这种管理方式其实比直接删除宿主机目录更安全,也更符合 Docker 的设计理念。