入门篇里我们用 -v 做了简单的目录挂载,这篇专门深入讲 Docker 的数据卷。
为什么需要数据卷
Docker 容器的文件系统是隔离的,而且容器删掉之后里面的数据也跟着没了。这就带来两个问题:
- 数据不持久 — 数据库、日志这些重要数据不能跟着容器走,容器删了数据得还在
- 不好修改 — 想改个配置、看个日志还要先进容器,很麻烦
数据卷就是解决这两个问题的,它把宿主机上的目录或文件挂载到容器里,让容器和宿主机共享数据。这样数据落在宿主机磁盘上,容器怎么删怎么重建都不影响。改配置也直接在本地改,不用进容器。同时卷还能被多个容器共享,方便容器之间交换数据。
三种挂载方式
Docker 有三种数据挂载方式,适用场景各不相同。
匿名卷(Anonymous Volume)
只指定容器内的挂载路径,不给卷起名字,Docker 会自动生成一个随机 ID:
docker run -d -p 8080:80 -v /data nginx
Docker 会在宿主机的 /var/lib/docker/volumes/ 下创建一个随机命名的目录(如 3f2a1b.../_data),挂载到容器的 /data。
docker volume ls 能看到这个匿名卷:
$ docker volume ls
DRIVER VOLUME NAME
local 3f2a1b8e9c7d4a5f6e2b1c0d8a9f7e3b
匿名卷的名字是随机哈希,没法复用。容器加 --rm 退出后,关联的匿名卷会被自动清理。适合临时数据,用完即走。
具名卷(Named Volume)
给数据卷指定一个可读的名字,便于复用和管理:
docker run -d -p 8080:80 -v nginx-data:/data nginx
如果 nginx-data 这个卷不存在,Docker 会自动创建;如果已存在,就直接复用。数据存放在 /var/lib/docker/volumes/nginx-data/_data。
--rm 不会删具名卷——具名卷通常放的是重要数据,Docker 不会因为容器消失就把它也清掉。
目录挂载(Bind Mount)
把宿主机上指定的目录或文件直接挂载到容器内,不经过 Docker 的卷管理系统:
docker run -d -p 8080:80 -v /home/user/html:/usr/share/nginx/html nginx
宿主机上的 /home/user/html 会直接出现在容器的对应路径,两边实时同步。
怎么区分这三种写法? 关键是看 -v 的第一个参数:
| 写法 | 类型 | 存储位置 |
|---|---|---|
-v /data | 匿名卷 | /var/lib/docker/volumes/<随机ID>/_data |
-v nginx-data:/data | 具名卷 | /var/lib/docker/volumes/nginx-data/_data |
-v /home/user/html:/data | 目录挂载 | 宿主机上的任意路径 |
以 / 开头的是目录挂载(Bind Mount),否则是卷(Volume)。卷里不带冒号的是匿名卷,带冒号的是具名卷。
只读挂载:
末尾加 :ro 可以让容器对该路径只读,防止容器意外改到宿主机上的文件:
docker run -d -p 8080:80 -v /home/user/config:/etc/nginx/conf.d:ro nginx
管理命令
docker volume create
手动创建具名卷。虽然 docker run -v 会自动创建不存在的卷,但提前创建可以更好地控制生命周期:
docker volume create nginx-data
docker volume ls
列出所有数据卷:
$ docker volume ls
DRIVER VOLUME NAME
local nginx-data
local mysql-data
local 3f2a1b8e9c7d...
docker volume inspect
查看某个数据卷的详细信息,包括宿主机上的实际存储路径:
$ docker volume inspect nginx-data
[
{
"CreatedAt": "2026-06-15T07:00:00Z",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/nginx-data/_data",
"Name": "nginx-data",
"Scope": "local"
}
]
Mountpoint 就是数据卷在宿主机上的真实目录,可以直接去那里看数据或做备份。
docker volume rm
删除一个或多个数据卷:
docker volume rm nginx-data
正在被容器用的卷删不掉,得先停掉相关容器再删。
docker volume prune
批量删除所有没有被任何容器引用的数据卷:
docker volume prune
执行前会有确认提示,常用于清理开发环境里积攒的匿名卷垃圾,生产环境慎用。
用 docker inspect 查看挂载信息
docker inspect 可以查看容器、镜像、网络等任意 Docker 对象的详细信息。看容器的挂载情况时,关注 Mounts 字段:
docker inspect <容器名或ID>
输出的 Mounts 部分长这样:
"Mounts": [
{
"Type": "volume",
"Name": "nginx-data",
"Source": "/var/lib/docker/volumes/nginx-data/_data",
"Destination": "/data",
"Mode": "",
"RW": true
},
{
"Type": "bind",
"Source": "/home/user/html",
"Destination": "/usr/share/nginx/html",
"Mode": "",
"RW": false
}
]
Type为volume表示卷(匿名/具名),bind表示目录挂载Source是宿主机路径,Destination是容器内路径RW为false表示只读挂载(:ro)
