【Docker】14.存储卷与管理卷Volume

文章目录

  • [1. 什么是存储卷?](#1. 什么是存储卷?)
    • [1.1 为什么我们需要存储卷](#1.1 为什么我们需要存储卷)
    • [1.2 什么是存储卷](#1.2 什么是存储卷)
  • [2. 管理卷 Volume](#2. 管理卷 Volume)
    • [2.1 创建卷](#2.1 创建卷)
      • [2.1.1 Volume 命令操作](#2.1.1 Volume 命令操作)
        • [2.1.1.1 docker volume create](#2.1.1.1 docker volume create)
        • [2.1.1.2 docker volume inspect](#2.1.1.2 docker volume inspect)
        • [2.1.1.3 docker volume ls](#2.1.1.3 docker volume ls)
        • [2.1.1.4 docker volume rm](#2.1.1.4 docker volume rm)
        • [2.1.1.5 docker volume prune](#2.1.1.5 docker volume prune)
      • [2.1.2 -v 或者--mount 指定](#2.1.2 -v 或者--mount 指定)
        • [2.1.2.1 -v参数](#2.1.2.1 -v参数)
        • [2.1.2.2 --mount 参数](#2.1.2.2 --mount 参数)
          • [2.1.2.2.1 命名卷](#2.1.2.2.1 命名卷)
          • [2.1.2.2.2 匿名卷](#2.1.2.2.2 匿名卷)
      • [2.1.3 Dockerfile 匿名卷](#2.1.3 Dockerfile 匿名卷)
    • [2.2 操作案例](#2.2 操作案例)
      • [2.2.1 Docker 命令创建管理卷](#2.2.1 Docker 命令创建管理卷)
      • [2.2.2 Docker -v 创建管理卷](#2.2.2 Docker -v 创建管理卷)
      • [2.2.3 Docker mount 创建管理卷](#2.2.3 Docker mount 创建管理卷)
      • [2.3.4 Docker 卷生命周期](#2.3.4 Docker 卷生命周期)
      • [2.3.5 Docker 卷共享](#2.3.5 Docker 卷共享)

1. 什么是存储卷?

1.1 为什么我们需要存储卷

Docker 的文件系统叫 UnionFS。它由一堆只读层和一个薄薄的可写层组成。

只读层(Image Layers):镜像内容,不可修改

可写层 (writable Layer):容器运行时所有增删改的临时存放地。

实验一:(由于之前做过就不具体写步骤了)

先启动一个 Nginx 容器,然后钻进它的"可写层",把默认网页改掉。

现在,这个 index.html 的新内容就只存在于刚才说的"可写层"里。

假设我们现在执行 docker rm -f web1 强行删除它,刷新浏览器会发现,刚才改的"Hello Docker"不见了,网页回到了初始状态。

这就是容器的"易失性"。数据会随容器的生命周期终结。

如果这不仅是一个网页,而是存放了三年的 MySQL 数据库,这一删数据永久丢失。

这也就是为什么我们要讲存储卷这个东西的原因:

容器需要随时被销毁和重建来保持灵活性,但数据却要求天长地久、永不丢失。

所以,我们需要一种"外挂"机制来保证数据不被丢失。
我们希望可以达到以下四点:

  1. 数据生命周期>容器生命周期
  2. 容器间数据可共享
  3. 容器间数据可互相访问
  4. 高性能读写(绕过UnionFS瓶颈)

1.2 什么是存储卷

我们可以把容器想象成一间租来的房子,随时可能被拆迁;而存储卷就像是一个稳固的地下室,房子拆了,数据还在地下室里锁着。
为了实现这种"数据持久化",Docker 提供了三种不同的挂载方式,它们在架构和性能上各有千秋。

  1. Volume(docker管理卷):默认映射到宿主机的/var/lib/docker/volumes 目录下,只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是由容器引擎 daemon 自行创建一个空的目录,或者使用一个已经存在的目录,与存储卷建立存储关系,这种方式极大解脱用户在使用卷时的耦合关系。(就像是插入U盘会自动在我的电脑出现插入U盘的盘符,不需要手动进行操作才能让盘符出来)

    缺陷是用户无法指定那些使用目录,临时存储比较适合。

    例如:我有两个容器mysql和springboot,我想把mysql的存储挂载在一个大的目录下,另一个挂载到别的目录就不行。

  2. Bind Mount(绑定数据卷):映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个特定的路径,在容器中也需要指定一个特定的路径,两个已知的路径建立关联关系,实际生产使用这个比较多。可以实现不同目录和应用的规划,上面那个实现不了的例子,这个就可以实现。

  3. tmpfs mount(临时数据卷):映射到于宿主机内存中,一旦容器停止运行,tmpfs mounts 会被移除,数据就会丢失,用于高性能的临时数据存储。

挂载方式 存储位置 管理权限 经典场景
Volume Docker专用区 Docker引擎 数据库,持久化数据
Bind Mount 宿主机任意路径 用户/操作系统 代码开发,配置同步
tmpfs 宿主机内存 内存/内核 密码,极速临时缓存

2. 管理卷 Volume

2.1 创建卷

存储卷可以通过命令方式创建,也可以在创建容器的时候通过 -v和--mount 指定。


2.1.1 Volume 命令操作

命令 别名 功能 备注
docker volume create 创建存储卷
docker volume inspect 显示存储卷详细信息
docker volume ls docker volume list 列出存储卷
docker volume prune 清理所有无用数据卷
docker volume rm 删除卷,使用中的无法删除

2.1.1.1 docker volume create

功能:创建存储卷

语法:

java 复制代码
docker volume create [OPTIONS] [VOLUME]

关键参数:

  • -d, --driver:指定驱动,默认是 local。一般我们不去动他,如果要动的话可以去官网看一下,有相关案例。
  • --label:指定元数据

例子1:创建匿名卷

shell 复制代码
root@yudukai:~# docker volume create
42ec01ee8a2955c46c92da283c5144a3be2e274c9e3c3989ae70c7779c8adcdf
# 列出存储卷
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     1b40b6c51f943d3096fca2a774c655be707e5f5228d6e0b66ab31ac2c11580f5
local     42ec01ee8a2955c46c92da283c5144a3be2e274c9e3c3989ae70c7779c8adcdf   <-----就是这个
local     ff090565aa2ce5a2ed03d4789ff006c79d5e06685ab0f3c32cab8905d7c1ea44
# 查看卷的详细内容
root@yudukai:~# docker volume inspect 42ec01ee8a2955c46c92da283c5144a3be2e274c9e3c3989ae70c7779c8adcdf
[
    {
        "CreatedAt": "2026-10-08T15:08:13+08:00",
        "Driver": "local",
        "Labels": {
            "com.docker.volume.anonymous": ""
        },
        "Mountpoint": "/var/lib/docker/volumes/42ec01ee8a2955c46c92da283c5144a3be2e274c9e3c3989ae70c7779c8adcdf/_data",
        "Name": "42ec01ee8a2955c46c92da283c5144a3be2e274c9e3c3989ae70c7779c8adcdf",
        "Options": null,
        "Scope": "local"
    }
]
# 查看目录下面有没有内容
root@yudukai:~# ls -l /var/lib/docker/volumes/42ec01ee8a2955c46c92da283c5144a3be2e274c9e3c3989ae70c7779c8adcdf/_data
total 0
root@yudukai:~# 

例子2:创建命名卷

shell 复制代码
root@yudukai:~# docker volume create myvoltest1
myvoltest1
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     1b40b6c51f943d3096fca2a774c655be707e5f5228d6e0b66ab31ac2c11580f5
local     42ec01ee8a2955c46c92da283c5144a3be2e274c9e3c3989ae70c7779c8adcdf
local     ff090565aa2ce5a2ed03d4789ff006c79d5e06685ab0f3c32cab8905d7c1ea44
local     myvoltest1
root@yudukai:~# docker volume inspect myvoltest1 
[
    {
        "CreatedAt": "2026-10-08T15:19:28+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/myvoltest1/_data",
        "Name": "myvoltest1",
        "Options": null,
        "Scope": "local"
    }
]
root@yudukai:~# ls -l /var/lib/docker/volumes/myvoltest1/_data
total 0
root@yudukai:~# 

例子3:指定元数据

shell 复制代码
root@yudukai:~# docker volume create --label MYTEST=1 myvoltest2
myvoltest2
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     1b40b6c51f943d3096fca2a774c655be707e5f5228d6e0b66ab31ac2c11580f5
local     42ec01ee8a2955c46c92da283c5144a3be2e274c9e3c3989ae70c7779c8adcdf
local     ff090565aa2ce5a2ed03d4789ff006c79d5e06685ab0f3c32cab8905d7c1ea44
local     myvoltest1
local     myvoltest2
root@yudukai:~# docker volume inspect myvoltest2
[
    {
        "CreatedAt": "2026-10-09T08:58:53+08:00",
        "Driver": "local",
        "Labels": {
            "MYTEST": "1"
        },
        "Mountpoint": "/var/lib/docker/volumes/myvoltest2/_data",
        "Name": "myvoltest2",
        "Options": null,
        "Scope": "local"
    }
]
root@yudukai:~# ls -l /var/lib/docker/volumes/myvoltest2/_data
total 0
root@yudukai:~# 

2.1.1.2 docker volume inspect

功能:查看卷详细信息

语法:

java 复制代码
docker volume inspect [OPTIONS] VOLUME [VOLUME...]

关键参数:

  • -f:指定相应个格式,如 json

例子:

java 复制代码
root@yudukai:~# docker volume inspect myvoltest1 myvoltest2 myvoltest3 myvoltest4
[
    {
        "CreatedAt": "2026-10-08T15:19:28+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/myvoltest1/_data",
        "Name": "myvoltest1",
        "Options": null,
        "Scope": "local"
    },
    {
        "CreatedAt": "2026-10-09T08:58:53+08:00",
        "Driver": "local",
        "Labels": {
            "MYTEST": "1"
        },
        "Mountpoint": "/var/lib/docker/volumes/myvoltest2/_data",
        "Name": "myvoltest2",
        "Options": null,
        "Scope": "local"
    },
    {
        "CreatedAt": "2026-10-09T10:47:25+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/myvoltest3/_data",
        "Name": "myvoltest3",
        "Options": null,
        "Scope": "local"
    },
    {
        "CreatedAt": "2026-10-09T10:47:29+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/myvoltest4/_data",
        "Name": "myvoltest4",
        "Options": null,
        "Scope": "local"
    }
]
root@yudukai:~# 

2.1.1.3 docker volume ls

功能:列出卷

语法:

java 复制代码
docker volume ls [OPTIONS]

关键参数:

  • --format:指定相应个格式,如 json,table
  • --filter,-f:过滤,目前支持根据lable进行过滤
  • -q:仅显示名称

例子:

shell 复制代码
root@yudukai:~# docker volume ls --format json
{"Availability":"N/A","Driver":"local","Group":"N/A","Labels":"com.docker.volume.anonymous=","Links":"N/A","Mountpoint":"/var/lib/docker/volumes/1b40b6c51f943d3096fca2a774c655be707e5f5228d6e0b66ab31ac2c11580f5/_data","Name":"1b40b6c51f943d3096fca2a774c655be707e5f5228d6e0b66ab31ac2c11580f5","Scope":"local","Size":"N/A","Status":"N/A"}
{"Availability":"N/A","Driver":"local","Group":"N/A","Labels":"com.docker.volume.anonymous=","Links":"N/A","Mountpoint":"/var/lib/docker/volumes/42ec01ee8a2955c46c92da283c5144a3be2e274c9e3c3989ae70c7779c8adcdf/_data","Name":"42ec01ee8a2955c46c92da283c5144a3be2e274c9e3c3989ae70c7779c8adcdf","Scope":"local","Size":"N/A","Status":"N/A"}
{"Availability":"N/A","Driver":"local","Group":"N/A","Labels":"com.docker.volume.anonymous=","Links":"N/A","Mountpoint":"/var/lib/docker/volumes/ff090565aa2ce5a2ed03d4789ff006c79d5e06685ab0f3c32cab8905d7c1ea44/_data","Name":"ff090565aa2ce5a2ed03d4789ff006c79d5e06685ab0f3c32cab8905d7c1ea44","Scope":"local","Size":"N/A","Status":"N/A"}
{"Availability":"N/A","Driver":"local","Group":"N/A","Labels":"","Links":"N/A","Mountpoint":"/var/lib/docker/volumes/myvoltest1/_data","Name":"myvoltest1","Scope":"local","Size":"N/A","Status":"N/A"}
{"Availability":"N/A","Driver":"local","Group":"N/A","Labels":"MYTEST=1","Links":"N/A","Mountpoint":"/var/lib/docker/volumes/myvoltest2/_data","Name":"myvoltest2","Scope":"local","Size":"N/A","Status":"N/A"}
{"Availability":"N/A","Driver":"local","Group":"N/A","Labels":"","Links":"N/A","Mountpoint":"/var/lib/docker/volumes/myvoltest3/_data","Name":"myvoltest3","Scope":"local","Size":"N/A","Status":"N/A"}
{"Availability":"N/A","Driver":"local","Group":"N/A","Labels":"","Links":"N/A","Mountpoint":"/var/lib/docker/volumes/myvoltest4/_data","Name":"myvoltest4","Scope":"local","Size":"N/A","Status":"N/A"}
root@yudukai:~# docker volume ls --format table
DRIVER    VOLUME NAME
local     1b40b6c51f943d3096fca2a774c655be707e5f5228d6e0b66ab31ac2c11580f5
local     42ec01ee8a2955c46c92da283c5144a3be2e274c9e3c3989ae70c7779c8adcdf
local     ff090565aa2ce5a2ed03d4789ff006c79d5e06685ab0f3c32cab8905d7c1ea44
local     myvoltest1
local     myvoltest2
local     myvoltest3
local     myvoltest4
root@yudukai:~# docker volume ls -f label=MYTEST
DRIVER    VOLUME NAME
local     myvoltest2
root@yudukai:~# docker volume ls -q
1b40b6c51f943d3096fca2a774c655be707e5f5228d6e0b66ab31ac2c11580f5
42ec01ee8a2955c46c92da283c5144a3be2e274c9e3c3989ae70c7779c8adcdf
ff090565aa2ce5a2ed03d4789ff006c79d5e06685ab0f3c32cab8905d7c1ea44
myvoltest1
myvoltest2
myvoltest3
myvoltest4
root@yudukai:~# 

2.1.1.4 docker volume rm

功能:删除卷,需要容器不使用。

语法:

shell 复制代码
docker volume rm [OPTIONS] VOLUME [VOLUME...]

关键参数:

  • -f,--force:强制删除

例子:

shell 复制代码
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     1b40b6c51f943d3096fca2a774c655be707e5f5228d6e0b66ab31ac2c11580f5
local     42ec01ee8a2955c46c92da283c5144a3be2e274c9e3c3989ae70c7779c8adcdf
local     ff090565aa2ce5a2ed03d4789ff006c79d5e06685ab0f3c32cab8905d7c1ea44
local     myvoltest1
local     myvoltest2
local     myvoltest3
local     myvoltest4
root@yudukai:~# docker inspect myvoltest3
[
    {
        "CreatedAt": "2026-10-09T10:47:25+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/myvoltest3/_data",
        "Name": "myvoltest3",
        "Options": null,
        "Scope": "local"
    }
]
root@yudukai:~# ls -l /var/lib/docker/volumes/myvoltest3/_data
total 0
root@yudukai:~# echo "123" > /var/lib/docker/volumes/myvoltest3/_data/1.txt
root@yudukai:~# ls -l /var/lib/docker/volumes/myvoltest3/_data
total 4
-rw-r--r-- 1 root root 4 Oct  9 11:02 1.txt
root@yudukai:~# docker volume rm myvoltest3 myvoltest4
myvoltest3
myvoltest4
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     1b40b6c51f943d3096fca2a774c655be707e5f5228d6e0b66ab31ac2c11580f5
local     42ec01ee8a2955c46c92da283c5144a3be2e274c9e3c3989ae70c7779c8adcdf
local     ff090565aa2ce5a2ed03d4789ff006c79d5e06685ab0f3c32cab8905d7c1ea44
local     myvoltest1
local     myvoltest2
root@yudukai:~# ls -l /var/lib/docker/volumes/myvoltest3/_data
ls: cannot access '/var/lib/docker/volumes/myvoltest3/_data': No such file or directory
root@yudukai:~# 

2.1.1.5 docker volume prune

功能:删除不使用的本地卷

语法:

shell 复制代码
docker volume prune [OPTIONS]

关键参数:

  • --filter:过滤
  • -f, --force:不提示是否删除,直接强制删除

例子:

shell 复制代码
root@yudukai:~# docker volume create
20e23df818a91751ba2db2762dd05548980570a56080841f3a00e60bfa8d1e6c
root@yudukai:~# docker volume create myvolumes6
myvolumes6
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     1b40b6c51f943d3096fca2a774c655be707e5f5228d6e0b66ab31ac2c11580f5
local     20e23df818a91751ba2db2762dd05548980570a56080841f3a00e60bfa8d1e6c
local     42ec01ee8a2955c46c92da283c5144a3be2e274c9e3c3989ae70c7779c8adcdf
local     ff090565aa2ce5a2ed03d4789ff006c79d5e06685ab0f3c32cab8905d7c1ea44
local     myvoltest1
local     myvoltest2
local     myvolumes6
root@yudukai:~# docker volume prune
WARNING! This will remove anonymous local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
ff090565aa2ce5a2ed03d4789ff006c79d5e06685ab0f3c32cab8905d7c1ea44
1b40b6c51f943d3096fca2a774c655be707e5f5228d6e0b66ab31ac2c11580f5
42ec01ee8a2955c46c92da283c5144a3be2e274c9e3c3989ae70c7779c8adcdf
20e23df818a91751ba2db2762dd05548980570a56080841f3a00e60bfa8d1e6c

Total reclaimed space: 206.9MB
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     myvoltest1
local     myvoltest2
local     myvolumes6
root@yudukai:~# 

2.1.2 -v 或者--mount 指定

-v 和-mount 都可以完成管理卷的创建


2.1.2.1 -v参数

功能:完成目录映射

语法:

shell 复制代码
docker run -v name:directory[:options] .........

关键参数:

第一个参数:卷名称

第二个参数:卷映射到容器的目录

第三个参数:选项,如 ro 表示 readonly,无法修改删除

例子:

shell 复制代码
root@yudukai:~# docker run -d --name myvolumenginx1 -v volnginx1:/usr/share/nginx/html/ nginx:1.24.0
Unable to find image 'nginx:1.24.0' locally
1.24.0: Pulling from library/nginx
5ac1ebd8aebe: Pull complete 
6989106bacf0: Pull complete 
c00d1142b331: Pull complete 
04e7578caeaa: Pull complete 
cb49393af980: Pull complete 
57a1056ea484: Pull complete 
54247e67c145: Download complete 
2f39813903ff: Download complete 
Digest: sha256:f6daac2445b0ce70e64d77442ccf62839f3f1b4c24bf6746a857eff014e798c8
Status: Downloaded newer image for nginx:1.24.0
58c31e26b70d7dd738d22dd340bec3bae1965e2d006ce440e3e549f9abaf6e6c
root@yudukai:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS                                     NAMES
58c31e26b70d   nginx:1.24.0   "/docker-entrypoint...."   About a minute ago   Up About a minute   80/tcp                                    myvolumenginx1
58109926ba0a   nginx:1.22.0   "/docker-entrypoint...."   2 weeks ago          Up 2 weeks          80/tcp                                    mynginx004
c9e86c4f9bf3   nginx:1.22.0   "/docker-entrypoint...."   2 weeks ago          Up 2 weeks          80/tcp                                    mynginx003
c42b26328912   nginx:1.22.0   "/docker-entrypoint...."   2 weeks ago          Up 2 weeks          0.0.0.0:8180->80/tcp, [::]:8180->80/tcp   mynginx001
8c523baaa860   nginx          "/docker-entrypoint...."   2 weeks ago          Up 2 weeks          80/tcp                                    boring_torvalds
ea63b99ba74d   nginx:1.21.1   "/docker-entrypoint...."   5 weeks ago          Up 2 weeks          0.0.0.0:81->80/tcp, [::]:81->80/tcp       mywebsite2
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     myvoltest1
local     myvoltest2
local     myvolumes6
local     volnginx1
root@yudukai:~# docker inspect volnginx1
[
    {
        "CreatedAt": "2026-10-09T11:13:14+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/volnginx1/_data",
        "Name": "volnginx1",
        "Options": null,
        "Scope": "local"
    }
]
# 可以看到我们容器里的东西挂载到了我们的宿主机上
root@yudukai:~# ls -l /var/lib/docker/volumes/volnginx1/_data
total 8
-rw-r--r-- 1 root root 497 Apr 11  2023 50x.html
-rw-r--r-- 1 root root 615 Apr 11  2023 index.html
# 然后我们尝试删除容器中的文件
root@yudukai:~# docker exec -it myvolumenginx1 bash
root@58c31e26b70d:/# cd /usr/share/nginx/html/
root@58c31e26b70d:/usr/share/nginx/html# ls -l
total 8
-rw-r--r-- 1 root root 497 Apr 11  2023 50x.html
-rw-r--r-- 1 root root 615 Apr 11  2023 index.html
root@58c31e26b70d:/usr/share/nginx/html# rm index.html 
root@58c31e26b70d:/usr/share/nginx/html# ls -l
total 4
-rw-r--r-- 1 root root 497 Apr 11  2023 50x.html
root@58c31e26b70d:/usr/share/nginx/html# exit
exit
# 可以看到我们宿主机的文件也被同步删除了
root@yudukai:~# ls -l /var/lib/docker/volumes/volnginx1/_data
total 4
-rw-r--r-- 1 root root 497 Apr 11  2023 50x.html
root@yudukai:~# 

增加ro参数

shell 复制代码
root@yudukai:~# docker run -d --name myvolumenginx2 -v volnginx2:/usr/share/nginx/html/:ro nginx:1.24.0
a519da96fc9a436b5d62fa867064e49db939c54361aeccc1b64b77c93254447a
root@yudukai:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                     NAMES
a519da96fc9a   nginx:1.24.0   "/docker-entrypoint...."   6 seconds ago   Up 5 seconds   80/tcp                                    myvolumenginx2
58c31e26b70d   nginx:1.24.0   "/docker-entrypoint...."   6 minutes ago   Up 6 minutes   80/tcp                                    myvolumenginx1
58109926ba0a   nginx:1.22.0   "/docker-entrypoint...."   2 weeks ago     Up 2 weeks     80/tcp                                    mynginx004
c9e86c4f9bf3   nginx:1.22.0   "/docker-entrypoint...."   2 weeks ago     Up 2 weeks     80/tcp                                    mynginx003
c42b26328912   nginx:1.22.0   "/docker-entrypoint...."   2 weeks ago     Up 2 weeks     0.0.0.0:8180->80/tcp, [::]:8180->80/tcp   mynginx001
8c523baaa860   nginx          "/docker-entrypoint...."   2 weeks ago     Up 2 weeks     80/tcp                                    boring_torvalds
ea63b99ba74d   nginx:1.21.1   "/docker-entrypoint...."   5 weeks ago     Up 2 weeks     0.0.0.0:81->80/tcp, [::]:81->80/tcp       mywebsite2
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     myvoltest1
local     myvoltest2
local     myvolumes6
local     volnginx1
local     volnginx2
root@yudukai:~# docker inspect volnginx2
[
    {
        "CreatedAt": "2026-10-09T11:19:12+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/volnginx2/_data",
        "Name": "volnginx2",
        "Options": null,
        "Scope": "local"
    }
]
root@yudukai:~# ls -l /var/lib/docker/volumes/volnginx2/_data
total 8
-rw-r--r-- 1 root root 497 Apr 11  2023 50x.html
-rw-r--r-- 1 root root 615 Apr 11  2023 index.html
# 然后我们尝试删除容器中的文件
root@yudukai:~# docker exec -it myvolumenginx2 bash
root@a519da96fc9a:/# cd /usr/share/nginx/html/
root@a519da96fc9a:/usr/share/nginx/html# ls -l
total 8
-rw-r--r-- 1 root root 497 Apr 11  2023 50x.html
-rw-r--r-- 1 root root 615 Apr 11  2023 index.html
# 发现无法删除容器内文件
root@a519da96fc9a:/usr/share/nginx/html# rm index.html 
rm: cannot remove 'index.html': Read-only file system
# 无法新增容器内
root@a519da96fc9a:/usr/share/nginx/html# mkdir a
mkdir: cannot create directory 'a': Read-only file system
root@a519da96fc9a:/usr/share/nginx/html# 
root@a519da96fc9a:/usr/share/nginx/html# exit
exit
# 但是退出后可以看到我们可以在宿主机新增文件
root@yudukai:~# cd /var/lib/docker/volumes/volnginx2/_data
root@yudukai:/var/lib/docker/volumes/volnginx2/_data# ls
50x.html  index.html
root@yudukai:/var/lib/docker/volumes/volnginx2/_data# rm index.html
root@yudukai:/var/lib/docker/volumes/volnginx2/_data# ls -l
total 4
-rw-r--r-- 1 root root 497 Apr 11  2023 50x.html
root@yudukai:/var/lib/docker/volumes/volnginx2/_data# 
root@yudukai:/var/lib/docker/volumes/volnginx2/_data# docker exec -it myvolumenginx2 bash
root@a519da96fc9a:/# cd /usr/share/nginx/html/
root@a519da96fc9a:/usr/share/nginx/html# ls -l
total 4
-rw-r--r-- 1 root root 497 Apr 11  2023 50x.html
root@a519da96fc9a:/usr/share/nginx/html# 

2.1.2.2 --mount 参数

功能:完成目录映射(绑定卷,存储卷,临时卷)

语法:

shell 复制代码
--mount '<key>=<value>,<key>=<value>'

关键参数:

  • type:类型表示 bind, volume, or tmpfs
  • source ,src:对于命名卷,这是卷的名称。对于匿名卷,省略此字段。
  • destination,dst,target:文件或目录挂载在容器中的路径
  • ro,readonly:只读方式挂载完成目录映射

例子:

2.1.2.2.1 命名卷

采用 mount 创建 volume

shell 复制代码
root@yudukai:~# docker images nginx
                                                                                                                                                                                             i Info →   U  In Use
IMAGE                                                                           ID             DISK USAGE   CONTENT SIZE   EXTRA
nginx:1.21.1                                                                    a05b0cdd4fc1        200MB         53.8MB    U   
nginx:1.22.0                                                                    f0d28f204785        213MB         56.8MB    U   
nginx:1.22.1                                                                    fc5f5fb75747        214MB           57MB        
nginx:1.24.0                                                                    f6daac2445b0        218MB         60.1MB    U   
nginx:1.31.4                                                                    25ee11a13a12        241MB         66.2MB        
nginx:latest                                                                    cb29e33d254e        253MB         69.2MB    U   
nginx:trixie-perl                                                               a07ae7717013        311MB         79.6MB        
nginx@sha256:f1aec5de9d214ab7dad6b67c6665ee9eaa55ac890c710700216804d8b4829802   f1aec5de9d21        151MB         38.4MB        
root@yudukai:~# docker run -d --name mynginxvol3 --mount 'src=nginxvol3,dst=/usr/share/nginx/html' nginx:1.24.0
7c2ec835f1270099c85291ea9bebe932f251f58fe4fd8ed18f345965f574871d
root@yudukai:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                     NAMES
7c2ec835f127   nginx:1.24.0   "/docker-entrypoint...."   6 seconds ago   Up 6 seconds   80/tcp                                    mynginxvol3
a519da96fc9a   nginx:1.24.0   "/docker-entrypoint...."   13 days ago     Up 13 days     80/tcp                                    myvolumenginx2
58c31e26b70d   nginx:1.24.0   "/docker-entrypoint...."   13 days ago     Up 13 days     80/tcp                                    myvolumenginx1
58109926ba0a   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago     Up 4 weeks     80/tcp                                    mynginx004
c9e86c4f9bf3   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago     Up 4 weeks     80/tcp                                    mynginx003
c42b26328912   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago     Up 4 weeks     0.0.0.0:8180->80/tcp, [::]:8180->80/tcp   mynginx001
8c523baaa860   nginx          "/docker-entrypoint...."   4 weeks ago     Up 4 weeks     80/tcp                                    boring_torvalds
ea63b99ba74d   nginx:1.21.1   "/docker-entrypoint...."   7 weeks ago     Up 4 weeks     0.0.0.0:81->80/tcp, [::]:81->80/tcp       mywebsite2

通过 docker inspect 可以看到

shell 复制代码
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     myvoltest1
local     myvoltest2
local     myvolumes6
local     nginxvol3
local     volnginx1
local     volnginx2
root@yudukai:~# docker volume inspect nginxvol3 
[
    {
        "CreatedAt": "2026-10-22T16:12:53+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/nginxvol3/_data",
        "Name": "nginxvol3",
        "Options": null,
        "Scope": "local"
    }
]
# 可以看到宿主机也有这个
root@yudukai:~# ls -l /var/lib/docker/volumes/nginxvol3/_data
total 8
-rw-r--r-- 1 root root 497 Apr 11  2023 50x.html
-rw-r--r-- 1 root root 615 Apr 11  2023 index.html
root@yudukai:~# 

2.1.2.2.2 匿名卷
shell 复制代码
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     myvoltest1
local     myvoltest2
local     myvolumes6
local     nginxvol3
local     volnginx1
local     volnginx2
root@yudukai:~# docker run -d --name mynginxvol4 --mount 'dst=/usr/share/nginx/html' nginx:1.24.0
f6c8f30986c15d2b3bef7cd151b03a75bcae6c248d85851df8c41c02bb0832a9
root@yudukai:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                     NAMES
f6c8f30986c1   nginx:1.24.0   "/docker-entrypoint...."   3 seconds ago   Up 2 seconds   80/tcp                                    mynginxvol4
7c2ec835f127   nginx:1.24.0   "/docker-entrypoint...."   3 minutes ago   Up 3 minutes   80/tcp                                    mynginxvol3
a519da96fc9a   nginx:1.24.0   "/docker-entrypoint...."   13 days ago     Up 13 days     80/tcp                                    myvolumenginx2
58c31e26b70d   nginx:1.24.0   "/docker-entrypoint...."   13 days ago     Up 13 days     80/tcp                                    myvolumenginx1
58109926ba0a   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago     Up 4 weeks     80/tcp                                    mynginx004
c9e86c4f9bf3   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago     Up 4 weeks     80/tcp                                    mynginx003
c42b26328912   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago     Up 4 weeks     0.0.0.0:8180->80/tcp, [::]:8180->80/tcp   mynginx001
8c523baaa860   nginx          "/docker-entrypoint...."   4 weeks ago     Up 4 weeks     80/tcp                                    boring_torvalds
ea63b99ba74d   nginx:1.21.1   "/docker-entrypoint...."   7 weeks ago     Up 4 weeks     0.0.0.0:81->80/tcp, [::]:81->80/tcp       mywebsite2
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     6ffa9466a74465340029138e0147565af2d44833c8ffee1e45ced4aa384e8c09
local     myvoltest1
local     myvoltest2
local     myvolumes6
local     nginxvol3
local     volnginx1
local     volnginx2
root@yudukai:~#

可以看到多了一个匿名卷,但是我怎么知道这个匿名卷是这个容器创建的呢?

我们可以查看一下,发现这个容器Mount字段里面的路径是这个匿名卷的名称。之前的命名卷里面也有对应的卷名。


2.1.3 Dockerfile 匿名卷

通过 Dockerfile 的 VOLUME 可以创建 docker 管理卷。这个我们后续在 Dockerfile中详细讲解。

我们也可以通过 dockerfile 的 VOLUME 指令在镜像中创建 Data Volume,这样只要通过该镜像创建的容器都会存在挂载点,但值得注意的是通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,而是由 docker 随机生成的。


2.2 操作案例

2.2.1 Docker 命令创建管理卷

我们来看一下,在容器中创建管理卷后,在宿主机上更改或者删除,容器中对应的内容会不会动态的发生变化。

  1. 命令创建管理卷
shell 复制代码
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     6ffa9466a74465340029138e0147565af2d44833c8ffee1e45ced4aa384e8c09
local     myvoltest1
local     myvoltest2
local     myvolumes6
local     nginxvol3
local     volnginx1
local     volnginx2
root@yudukai:~# docker volume create test1
test1
# 可以看到新增了新的test1这个卷
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     6ffa9466a74465340029138e0147565af2d44833c8ffee1e45ced4aa384e8c09
local     myvoltest1
local     myvoltest2
local     myvolumes6
local     nginxvol3
local     test1
local     volnginx1
local     volnginx2
root@yudukai:~# docker volume inspect test1 
[
    {
        "CreatedAt": "2026-10-22T16:30:13+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/test1/_data",
        "Name": "test1",
        "Options": null,
        "Scope": "local"
    }
]
# 可以看到里面是空的
root@yudukai:~# ls -l /var/lib/docker/volumes/test1/_data
total 0
root@yudukai:~# 
  1. 创建容器
shell 复制代码
root@yudukai:~# docker images nginx
                                                                                                                                                                                             i Info →   U  In Use
IMAGE                                                                           ID             DISK USAGE   CONTENT SIZE   EXTRA
nginx:1.21.1                                                                    a05b0cdd4fc1        200MB         53.8MB    U   
nginx:1.22.0                                                                    f0d28f204785        213MB         56.8MB    U   
nginx:1.22.1                                                                    fc5f5fb75747        214MB           57MB        
nginx:1.24.0                                                                    f6daac2445b0        218MB         60.1MB    U   
nginx:1.31.4                                                                    25ee11a13a12        241MB         66.2MB        
nginx:latest                                                                    cb29e33d254e        253MB         69.2MB    U   
nginx:trixie-perl                                                               a07ae7717013        311MB         79.6MB        
nginx@sha256:f1aec5de9d214ab7dad6b67c6665ee9eaa55ac890c710700216804d8b4829802   f1aec5de9d21        151MB         38.4MB        
root@yudukai:~# docker run -d --name mynginx1 -p 8052:80 -v test1:/usr/share/nginx/html nginx:1.24.0
863b01ad92dd17bad6ee022a865fc23e4f4f93b14cec91b63685084b82f1c0c9
root@yudukai:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                     NAMES
863b01ad92dd   nginx:1.24.0   "/docker-entrypoint...."   7 seconds ago    Up 7 seconds    0.0.0.0:8052->80/tcp, [::]:8052->80/tcp   mynginx1
f6c8f30986c1   nginx:1.24.0   "/docker-entrypoint...."   18 minutes ago   Up 18 minutes   80/tcp                                    mynginxvol4
7c2ec835f127   nginx:1.24.0   "/docker-entrypoint...."   21 minutes ago   Up 21 minutes   80/tcp                                    mynginxvol3
a519da96fc9a   nginx:1.24.0   "/docker-entrypoint...."   13 days ago      Up 13 days      80/tcp                                    myvolumenginx2
58c31e26b70d   nginx:1.24.0   "/docker-entrypoint...."   13 days ago      Up 13 days      80/tcp                                    myvolumenginx1
58109926ba0a   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago      Up 4 weeks      80/tcp                                    mynginx004
c9e86c4f9bf3   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago      Up 4 weeks      80/tcp                                    mynginx003
c42b26328912   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago      Up 4 weeks      0.0.0.0:8180->80/tcp, [::]:8180->80/tcp   mynginx001
8c523baaa860   nginx          "/docker-entrypoint...."   4 weeks ago      Up 4 weeks      80/tcp                                    boring_torvalds
ea63b99ba74d   nginx:1.21.1   "/docker-entrypoint...."   7 weeks ago      Up 4 weeks      0.0.0.0:81->80/tcp, [::]:81->80/tcp       mywebsite2
root@yudukai:~# ls -l /var/lib/docker/volumes/test1/_data
total 8
-rw-r--r-- 1 root root 497 Apr 11  2023 50x.html
-rw-r--r-- 1 root root 615 Apr 11  2023 index.html
root@yudukai:~# 
  1. 我们尝试修改一下宿主机的文件,看看会不会发生对应的变化

先看一下浏览器

shell 复制代码
root@yudukai:~# cd /var/lib/docker/volumes/test1/_data
root@yudukai:/var/lib/docker/volumes/test1/_data# vim index.html 
root@yudukai:/var/lib/docker/volumes/test1/_data# 

可以发现,确实改变了

  1. 我们进入容器,看看里面有没有动态变化
shell 复制代码
root@yudukai:/var/lib/docker/volumes/test1/_data# docker exec -it mynginx1 bash
root@863b01ad92dd:/# cd /usr/s
sbin/  share/ src/   
root@863b01ad92dd:/# cd /usr/share/nginx/html/
root@863b01ad92dd:/usr/share/nginx/html# ll
bash: ll: command not found
root@863b01ad92dd:/usr/share/nginx/html# dir
50x.html  index.html
root@863b01ad92dd:/usr/share/nginx/html# cat index.html 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to docker volume create cmd nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@863b01ad92dd:/usr/share/nginx/html# 

可以看到确实是发生了变化的

  1. 停止容器释放空间
shell 复制代码
docker stop nginx1
docker rm nginx1

结论:宿主机和容器之间数据是同步的。


2.2.2 Docker -v 创建管理卷

  1. -v 创建管理卷,并且启动容器
shell 复制代码
root@yudukai:/var/lib/docker/volumes/test1/_data# docker volume ls
DRIVER    VOLUME NAME
local     6ffa9466a74465340029138e0147565af2d44833c8ffee1e45ced4aa384e8c09
local     myvoltest1
local     myvoltest2
local     myvolumes6
local     nginxvol3
local     test1
local     volnginx1
local     volnginx2
root@yudukai:/var/lib/docker/volumes/test1/_data# docker run -d --name mynginx2 -v test2:/usr/share/nginx/html/:ro -p 8052:80 nginx:1.24.0
954c670bbbeaef52e1782e27c494878330d24ecef281aec2e589a02116f43ca9
root@yudukai:/var/lib/docker/volumes/test1/_data# docker volume ls
DRIVER    VOLUME NAME
local     6ffa9466a74465340029138e0147565af2d44833c8ffee1e45ced4aa384e8c09
local     myvoltest1
local     myvoltest2
local     myvolumes6
local     nginxvol3
local     test1
local     test2
local     volnginx1
local     volnginx2
root@yudukai:/var/lib/docker/volumes/test1/_data# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                     NAMES
954c670bbbea   nginx:1.24.0   "/docker-entrypoint...."   11 seconds ago   Up 11 seconds   0.0.0.0:8052->80/tcp, [::]:8052->80/tcp   mynginx2
f6c8f30986c1   nginx:1.24.0   "/docker-entrypoint...."   2 hours ago      Up 2 hours      80/tcp                                    mynginxvol4
7c2ec835f127   nginx:1.24.0   "/docker-entrypoint...."   2 hours ago      Up 2 hours      80/tcp                                    mynginxvol3
a519da96fc9a   nginx:1.24.0   "/docker-entrypoint...."   13 days ago      Up 13 days      80/tcp                                    myvolumenginx2
58c31e26b70d   nginx:1.24.0   "/docker-entrypoint...."   13 days ago      Up 13 days      80/tcp                                    myvolumenginx1
58109926ba0a   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago      Up 4 weeks      80/tcp                                    mynginx004
c9e86c4f9bf3   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago      Up 4 weeks      80/tcp                                    mynginx003
c42b26328912   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago      Up 4 weeks      0.0.0.0:8180->80/tcp, [::]:8180->80/tcp   mynginx001
8c523baaa860   nginx          "/docker-entrypoint...."   4 weeks ago      Up 4 weeks      80/tcp                                    boring_torvalds
ea63b99ba74d   nginx:1.21.1   "/docker-entrypoint...."   7 weeks ago      Up 4 weeks      0.0.0.0:81->80/tcp, [::]:81->80/tcp       mywebsite2
  1. 进入卷目录
shell 复制代码
root@yudukai:/var/lib/docker/volumes/test1/_data# docker inspect test2
[
    {
        "CreatedAt": "2026-10-22T17:54:52+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/test2/_data",
        "Name": "test2",
        "Options": null,
        "Scope": "local"
    }
]
root@yudukai:/var/lib/docker/volumes/test1/_data# ls -l /var/lib/docker/volumes/test2/_data
total 8
-rw-r--r-- 1 root root 497 Apr 11  2023 50x.html
-rw-r--r-- 1 root root 615 Apr 11  2023 index.html
root@yudukai:/var/lib/docker/volumes/test1/_data# 
  1. 修改 index.html,容器中修改提示无法修改
shell 复制代码
root@yudukai:/var/lib/docker/volumes/test1/_data# docker exec -it mynginx2 bash
root@954c670bbbea:/# cd /usr/share/nginx/html
root@954c670bbbea:/usr/share/nginx/html# dir
50x.html  index.html
root@954c670bbbea:/usr/share/nginx/html# echo "Hello ydk from test2" > index.html 
bash: index.html: Read-only file system
root@954c670bbbea:/usr/share/nginx/html# rm index.html 
rm: cannot remove 'index.html': Read-only file system
root@954c670bbbea:/usr/share/nginx/html# 
  1. 宿主机修改,并浏览器查看
shell 复制代码
root@yudukai:/var/lib/docker/volumes/test1/_data# cd /var/lib/docker/volumes/test2/_data
root@yudukai:/var/lib/docker/volumes/test2/_data# ll
total 16
drwxr-xr-x 2 root root 4096 Oct 22 17:54 ./
drwx-----x 3 root root 4096 Oct 22 17:54 ../
-rw-r--r-- 1 root root  497 Apr 11  2023 50x.html
-rw-r--r-- 1 root root  615 Apr 11  2023 index.html
root@yudukai:/var/lib/docker/volumes/test2/_data# echo "Hello ydk from test2" > index.html 
root@yudukai:/var/lib/docker/volumes/test2/_data# cat index.html 
Hello ydk from test2
root@yudukai:/var/lib/docker/volumes/test2/_data# 

我们顺便去容器中看看容器内的变化

shell 复制代码
root@yudukai:/var/lib/docker/volumes/test2/_data# docker exec -it mynginx2 bash
root@954c670bbbea:/# cd /usr/share/nginx/html
root@954c670bbbea:/usr/share/nginx/html# cat index.html 
Hello ydk from test2
root@954c670bbbea:/usr/share/nginx/html# 

可以看到容器内也同步变化了。

  1. 清理释放空间
shell 复制代码
docker stop mynginx2 
docker rm mynginx2 

结论:指定 ro 的话宿主机可以修改,但是容器里面无法修改


2.2.3 Docker mount 创建管理卷

  1. mount 创建管理卷,并且启动容器
shell 复制代码
root@yudukai:/var/lib/docker/volumes/test2/_data# docker volume ls
DRIVER    VOLUME NAME
local     6ffa9466a74465340029138e0147565af2d44833c8ffee1e45ced4aa384e8c09
local     myvoltest1
local     myvoltest2
local     myvolumes6
local     nginxvol3
local     test1
local     test2
local     volnginx1
local     volnginx2
root@yudukai:/var/lib/docker/volumes/test2/_data# docker run -d --name mynginx3 -p 8052:80 --mount src=test3,dst=/usr/share/nginx/html/ nginx:1.24.0
76360ef579639f37af45a74b5a5101a0f3b39835923c03353fb49b8e7e2001d5
  1. 查看卷创建成功
shell 复制代码
# 多了test3这个卷
root@yudukai:/var/lib/docker/volumes/test2/_data# docker volume ls
DRIVER    VOLUME NAME
local     6ffa9466a74465340029138e0147565af2d44833c8ffee1e45ced4aa384e8c09
local     myvoltest1
local     myvoltest2
local     myvolumes6
local     nginxvol3
local     test1
local     test2
local     test3
local     volnginx1
local     volnginx2
root@yudukai:/var/lib/docker/volumes/test2/_data# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                     NAMES
76360ef57963   nginx:1.24.0   "/docker-entrypoint...."   22 seconds ago   Up 21 seconds   0.0.0.0:8052->80/tcp, [::]:8052->80/tcp   mynginx3
f6c8f30986c1   nginx:1.24.0   "/docker-entrypoint...."   2 hours ago      Up 2 hours      80/tcp                                    mynginxvol4
7c2ec835f127   nginx:1.24.0   "/docker-entrypoint...."   2 hours ago      Up 2 hours      80/tcp                                    mynginxvol3
a519da96fc9a   nginx:1.24.0   "/docker-entrypoint...."   13 days ago      Up 13 days      80/tcp                                    myvolumenginx2
58c31e26b70d   nginx:1.24.0   "/docker-entrypoint...."   13 days ago      Up 13 days      80/tcp                                    myvolumenginx1
58109926ba0a   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago      Up 4 weeks      80/tcp                                    mynginx004
c9e86c4f9bf3   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago      Up 4 weeks      80/tcp                                    mynginx003
c42b26328912   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago      Up 4 weeks      0.0.0.0:8180->80/tcp, [::]:8180->80/tcp   mynginx001
8c523baaa860   nginx          "/docker-entrypoint...."   4 weeks ago      Up 4 weeks      80/tcp                                    boring_torvalds
ea63b99ba74d   nginx:1.21.1   "/docker-entrypoint...."   7 weeks ago      Up 4 weeks      0.0.0.0:81->80/tcp, [::]:81->80/tcp       mywebsite2
root@yudukai:/var/lib/docker/volumes/test2/_data# 
  1. 查看卷挂载点。
shell 复制代码
root@yudukai:/var/lib/docker/volumes/test2/_data# docker volume inspect test3
[
    {
        "CreatedAt": "2026-10-22T18:23:12+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/test3/_data",
        "Name": "test3",
        "Options": null,
        "Scope": "local"
    }
]
root@yudukai:/var/lib/docker/volumes/test2/_data# 
  1. 浏览器查看
  1. 宿主机上修改文件内容
shell 复制代码
root@yudukai:/var/lib/docker/volumes/test3/_data# vim index.html 
root@yudukai:/var/lib/docker/volumes/test3/_data# cat index.html 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to volum create by mount nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@yudukai:/var/lib/docker/volumes/test3/_data# 
  1. 查看页面
  1. 清理释放空间
shell 复制代码
docker stop mynginx3 
docker rm mynginx3

结论:mount 创建的卷数据也会完成同步。


2.3.4 Docker 卷生命周期

  1. 先创建一个容器,然后把他的浏览器首页绑定到nginx上
  2. 然后把容器删掉,看看宿主机上对应的文件有没有消失。
  3. 如果容器还存在就docker rm来删除一下
  1. -v 创建管理卷,并且启动容器
shell 复制代码
root@yudukai:/var/lib/docker/volumes/test3/_data# docker volume ls
DRIVER    VOLUME NAME
local     6ffa9466a74465340029138e0147565af2d44833c8ffee1e45ced4aa384e8c09
local     myvoltest1
local     myvoltest2
local     myvolumes6
local     nginxvol3
local     test1
local     test2
local     test3
local     volnginx1
local     volnginx2
root@yudukai:/var/lib/docker/volumes/test3/_data# docker run -d -v test4:/usr/share/nginx/html --name mynginx4 -p 8052:80 nginx:1.24.0
1a0ebc5cc6b8db8145e331ca58fd5bca1a1d9e71addfb89e98c9f1c39b23ba25
root@yudukai:/var/lib/docker/volumes/test3/_data# docker volume ls
DRIVER    VOLUME NAME
local     6ffa9466a74465340029138e0147565af2d44833c8ffee1e45ced4aa384e8c09
local     myvoltest1
local     myvoltest2
local     myvolumes6
local     nginxvol3
local     test1
local     test2
local     test3
local     test4
local     volnginx1
local     volnginx2
root@yudukai:/var/lib/docker/volumes/test3/_data# docker inspect mynginx4
......
        "Mounts": [
            {
                "Type": "volume",
                "Name": "test4",
                "Source": "/var/lib/docker/volumes/test4/_data",
                "Destination": "/usr/share/nginx/html",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
......
  1. 进入卷目录,注意此时可以看到容器里面的内容自动的放到了宿主机里面。
shell 复制代码
root@yudukai:~# cd /var/lib/docker/volumes/test4/_data
root@yudukai:/var/lib/docker/volumes/test4/_data# ll
total 16
drwxr-xr-x 2 root root 4096 Oct 22 18:40 ./
drwx-----x 3 root root 4096 Oct 22 18:40 ../
-rw-r--r-- 1 root root  497 Apr 11  2023 50x.html
-rw-r--r-- 1 root root  615 Apr 11  2023 index.html
root@yudukai:/var/lib/docker/volumes/test4/_data# 
  1. 删除容器
shell 复制代码
root@yudukai:/var/lib/docker/volumes/test4/_data# docker stop mynginx4
mynginx4
root@yudukai:/var/lib/docker/volumes/test4/_data# docker rm mynginx4
mynginx4
root@yudukai:/var/lib/docker/volumes/test4/_data# docker ps -a |grep mynginx4
root@yudukai:/var/lib/docker/volumes/test4/_data# 
  1. 浏览器查看
  1. 再次查看卷里面的内容,进入卷目录查看可以看到文件并没有被删除
shell 复制代码
root@yudukai:/var/lib/docker/volumes/test4/_data# ll
total 16
drwxr-xr-x 2 root root 4096 Oct 22 18:40 ./
drwx-----x 3 root root 4096 Oct 22 18:40 ../
-rw-r--r-- 1 root root  497 Apr 11  2023 50x.html
-rw-r--r-- 1 root root  615 Apr 11  2023 index.html
root@yudukai:/var/lib/docker/volumes/test4/_data# 
  1. 删除卷,可以看到我们的卷被删除掉了。
shell 复制代码
root@yudukai:/var/lib/docker/volumes/test4/_data# docker volume rm test4
test4
root@yudukai:/var/lib/docker/volumes/test4/_data# ll
total 0
root@yudukai:/var/lib/docker/volumes/test4/_data# 

总结:不删除卷只删除主机就不会删除宿主机的内容,把卷也删掉,那么宿主机对应的内容也会消失。


2.3.5 Docker 卷共享

实际上绑定就是指向一个位置,宿主机一改变文件,那么多个共享的容器对应的内容都会改变。

  1. -v 创建管理卷,并且启动 3 容器,指定同一个卷
shell 复制代码
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     6ffa9466a74465340029138e0147565af2d44833c8ffee1e45ced4aa384e8c09
local     myvoltest1
local     myvoltest2
local     myvolumes6
local     nginxvol3
local     test1
local     test2
local     test3
local     volnginx1
local     volnginx2
root@yudukai:~docker run -d --name mynginx51 -p 8052:80 -v test4:/usr/share/nginx/html/ nginx:1.24.0
233fff94734b6e512c054d6222a5ca04cabe464785152959936caefb5bc2fadd
root@yudukai:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                     NAMES
233fff94734b   nginx:1.24.0   "/docker-entrypoint...."   8 seconds ago   Up 7 seconds   0.0.0.0:8052->80/tcp, [::]:8052->80/tcp   mynginx51
f6c8f30986c1   nginx:1.24.0   "/docker-entrypoint...."   3 hours ago     Up 3 hours     80/tcp                                    mynginxvol4
7c2ec835f127   nginx:1.24.0   "/docker-entrypoint...."   3 hours ago     Up 3 hours     80/tcp                                    mynginxvol3
a519da96fc9a   nginx:1.24.0   "/docker-entrypoint...."   13 days ago     Up 13 days     80/tcp                                    myvolumenginx2
58c31e26b70d   nginx:1.24.0   "/docker-entrypoint...."   13 days ago     Up 13 days     80/tcp                                    myvolumenginx1
58109926ba0a   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago     Up 4 weeks     80/tcp                                    mynginx004
c9e86c4f9bf3   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago     Up 4 weeks     80/tcp                                    mynginx003
c42b26328912   nginx:1.22.0   "/docker-entrypoint...."   4 weeks ago     Up 4 weeks     0.0.0.0:8180->80/tcp, [::]:8180->80/tcp   mynginx001
8c523baaa860   nginx          "/docker-entrypoint...."   4 weeks ago     Up 4 weeks     80/tcp                                    boring_torvalds
ea63b99ba74d   nginx:1.21.1   "/docker-entrypoint...."   7 weeks ago     Up 4 weeks     0.0.0.0:81->80/tcp, [::]:81->80/tcp       mywebsite2
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     6ffa9466a74465340029138e0147565af2d44833c8ffee1e45ced4aa384e8c09
local     myvoltest1
local     myvoltest2
local     myvolumes6
local     nginxvol3
local     test1
local     test2
local     test3
local     test4
local     volnginx1
local     volnginx2
root@yudukai:~# docker run -d --name mynginx52 -p 8080:80 -v test4:/usr/share/nginx/html/ nginx:1.24.0
cf5846d8e1f77319b6bfaf0407155d2d43d58f9a4e4ea0fd1bac92670c3544e3
root@yudukai:~# docker run -d --name mynginx53 -p 8051:80 -v test4:/usr/share/nginx/html/ nginx:1.24.0
8f64ea40a180a474354cd7d7836bf5bf1173dd5ad85a8d8f789627ba556fd9a5
root@yudukai:~# docker volume ls
DRIVER    VOLUME NAME
local     6ffa9466a74465340029138e0147565af2d44833c8ffee1e45ced4aa384e8c09
local     myvoltest1
local     myvoltest2
local     myvolumes6
local     nginxvol3
local     test1
local     test2
local     test3
local     test4
local     volnginx1
local     volnginx2
root@yudukai:~# 
  1. 进入卷目录
shell 复制代码
root@yudukai:~# docker inspect test4
[
    {
        "CreatedAt": "2026-10-22T19:31:25+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/test4/_data",
        "Name": "test4",
        "Options": null,
        "Scope": "local"
    }
]
root@yudukai:~# cd /var/lib/docker/volumes/test4/_data
root@yudukai:/var/lib/docker/volumes/test4/_data# ll
total 16
drwxr-xr-x 2 root root 4096 Oct 22 19:31 ./
drwx-----x 3 root root 4096 Oct 22 19:31 ../
-rw-r--r-- 1 root root  497 Apr 11  2023 50x.html
-rw-r--r-- 1 root root  615 Apr 11  2023 index.html
root@yudukai:/var/lib/docker/volumes/test4/_data# 
  1. 修改 index.html
shell 复制代码
root@yudukai:/var/lib/docker/volumes/test4/_data# echo "Hello ydk from share volume" > index.html 
root@yudukai:/var/lib/docker/volumes/test4/_data# cat index.html 
Hello ydk from share volume
root@yudukai:/var/lib/docker/volumes/test4/_data# 
  1. 浏览器查看,可以看到三个都是一样的首页

下面这个8080的图标变了是因为我直接用了之前springboot的端口,不用在意。

  1. 进入容器查看
shell 复制代码
root@yudukai:~# docker exec -it mynginx51 bash
root@233fff94734b:/# cd /usr/share/nginx/html
root@233fff94734b:/usr/share/nginx/html# cat index.html 
Hello ydk from share volume
root@233fff94734b:/usr/share/nginx/html# 
  1. 清理释放空间
shell 复制代码
docker stop mynginx51 mynginx52 mynginx53
docker rm mynginx51 mynginx52 mynginx53
相关推荐
迪康Defender1 小时前
端点安全选型观察:一体化平台与传统 EDR 的场景差异
运维·经验分享·安全·自动化·学习方法·远程工作·安全架构
amcomputer1 小时前
Docker 常用命令总结:从安装到日常使用
运维·docker·容器
ZKNOW甄知科技1 小时前
燕千云迭代版本发布:智能Agent深入业务现场
运维·人工智能·低代码·机器学习·自然语言处理·自动化·aigc
fb_123451 小时前
K8s部署带SSL的WordPress博客
容器·kubernetes·ssl
FY@-@1 小时前
云计算基础(下):虚拟化原理与 DAS/NAS/SAN 存储
运维·服务器·云计算
硅基手札1 小时前
SPI技术系列 13 · SPI 调试与排查
linux·运维·stm32·单片机·嵌入式硬件·bug
溜达的大象2 小时前
飞牛NAS部署ONLYOFFICE Docs:把文档、表格和PPT的在线编辑能力放到自己的服务器上
运维·服务器·powerpoint
Sayai2 小时前
Kafka 磁盘空间治理实战:retention 保留策略、log.dirs 在线扩容、分区跨盘迁移与不停机整体换盘
大数据·运维·分布式·kafka·消息队列
erzong2312 小时前
Linux操作系统:基于环形队列&信号量实现多生产者多消费者的简易模型
linux·运维·服务器