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"
  }
]

这里的 MountpointLinux 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 的设计理念。