Skip to content
DAILY QUOTE

“ ”

容器数据卷

1.什么是容器数据卷

容器数据卷用于解决容器数据持久化和容器间数据共享问题。

应用和运行环境可以打包成镜像,但是数据如果只保存在容器内部,一旦容器被删除,数据也会丢失。

典型场景:

  • MySQL容器删除后,数据库数据不能丢失。
  • 容器中产生的数据需要同步到宿主机。
  • 多个容器之间需要共享同一份数据。

卷技术本质上是目录挂载:把容器内目录挂载到Linux宿主机目录上。

总结:容器数据卷可以实现容器数据持久化、数据同步,也可以实现容器间数据共享。

2.使用数据卷

2.1使用-v挂载目录

命令格式:

bash
docker run -it -v 主机目录:容器内目录 -p 主机端口:容器内端口 镜像名

示例:

bash
ubuntu@Mystpet:/home$ docker run -it -v ~/ceshi:/home ubuntu /bin/bash

说明:

  • ~/ceshi是宿主机目录。
  • /home是容器内目录。
  • 如果宿主机中没有ceshi目录,Docker会自动创建,并且由root用户创建。
  • 运行后,宿主机的~/ceshi目录会和容器内的/home目录关联,二者可以实现文件或数据同步。

2.2查看挂载信息

bash
docker inspect 容器id

示例:

bash
ubuntu@Mystpet:/home$ docker inspect b1a

2.3测试文件同步

在宿主机上修改文件,观察容器内文件变化。

再次测试:

1.停止容器。
2.在宿主机上修改文件。
3.重新启动容器。
4.容器内数据依旧保持同步。

好处:

  • 以后修改文件只需要在本地修改,容器内会自动同步。
  • 即使删除容器,挂载到本地的数据卷也不会丢失,从而实现容器数据持久化。

3.匿名挂载和具名挂载

3.1匿名挂载

匿名挂载只写容器内路径,不指定宿主机路径或卷名。

bash
#1.匿名挂载Nginx配置目录
docker run -d -P --name nginx01 -v /etc/nginx nginx

参数说明:

参数作用
-v /etc/nginx只指定容器内路径,属于匿名挂载
-P随机映射端口

查看所有volume:

bash
ubuntu@Mystpet:~$ docker volume ls
DRIVER    VOLUME NAME
local     5e5e6e21fa5f59292589a3517f27f6e274ce4ca5f4d02e8ffe53f02adfe040ac
local     7b3c1807fd8293e5724c28845e135464a5544b1ffaadd5d72ea11e94a973bed7

这种情况下,-v后面只写了容器内路径,没有写宿主机路径,也没有写卷名,所以Docker会自动生成一个匿名卷。

3.2具名挂载

具名挂载会给数据卷指定名称,方便后续查找和管理。

bash
ubuntu@Mystpet:~$ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

查看容器:

bash
ubuntu@Mystpet:~$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                                          NAMES
9638432745cc   nginx          "/docker-entrypoint.…"   6 seconds ago   Up 4 seconds   0.0.0.0:32768->80/tcp, [::]:32768->80/tcp                                      nginx02

查看volume:

bash
ubuntu@Mystpet:~$ docker volume ls
DRIVER    VOLUME NAME
local     d22ecba4c4f0237d1ef4395c9e07d87dcfd576cd4d452f38069c13cc786e737d
local     juming-nginx

查看指定卷详情:

bash
ubuntu@Mystpet:~$ docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2026-03-22T01:29:26+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

说明:

  • 没有指定宿主机目录时,Docker卷默认存放在/var/lib/docker/volumes/自定义卷名/_data下。
  • 如果指定了宿主机目录,docker volume ls查看不到这个挂载。
  • 大多数情况下更推荐使用具名挂载,因为更方便查找和管理。

4.三种挂载方式

bash
#1.匿名挂载
-v 容器内路径

#2.具名挂载
-v 卷名:容器内路径

#3.指定路径挂载
-v /宿主机路径:容器内路径

对比:

挂载方式写法是否能通过docker volume ls查看
匿名挂载-v 容器内路径可以
具名挂载-v 卷名:容器内路径可以
指定路径挂载-v /宿主机路径:容器内路径不可以

5.设置读写权限

可以通过rorw控制挂载目录的读写权限。

bash
#1.只读挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx

#2.可读可写挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

权限说明:

权限含义
roreadonly,只读
rwreadwrite,可读可写

注意:只要看到ro,就说明这个路径只能通过宿主机操作,容器内部无法写入。