文章目录
- 前言
- 管理卷
-
- [一 、docker volume create 创建管理卷](#一 、docker volume create 创建管理卷)
-
- [1.1 语法格式](#1.1 语法格式)
- [1.2 参数](#1.2 参数)
- [1.3 操作案例](#1.3 操作案例)
-
- [1.3.1 案例介绍](#1.3.1 案例介绍)
- [1.3.2 案例演示](#1.3.2 案例演示)
- [二 、 -v 容器绑定管理卷](#二 、 -v 容器绑定管理卷)
-
- [2.1 语法格式](#2.1 语法格式)
- [2.2 操作案例](#2.2 操作案例)
-
- [2.2.1 案例介绍](#2.2.1 案例介绍)
- [2.2.2 案例演示](#2.2.2 案例演示)
- [三、--mount 容器绑定管理卷](#三、--mount 容器绑定管理卷)
-
- [3.1 语法格式](#3.1 语法格式)
- [3.2 参数(key)](#3.2 参数(key))
- [四、docker volume的其他常用操作](#四、docker volume的其他常用操作)
-
- [4. 1 查看数据卷信息](#4. 1 查看数据卷信息)
-
- [4.1.1 语法格式](#4.1.1 语法格式)
- [4.1.2 案例演示](#4.1.2 案例演示)
- [4.2 查看所有数据卷](#4.2 查看所有数据卷)
-
- [4.2.1 语法格式](#4.2.1 语法格式)
- [4.2.2 案例演示](#4.2.2 案例演示)
- [4.3 删除指定数据卷](#4.3 删除指定数据卷)
-
- [4.3.1 语法格式](#4.3.1 语法格式)
- [4.3.2 案例演示](#4.3.2 案例演示)
- [4.4 批量删除数据卷](#4.4 批量删除数据卷)
-
- [4.4.1 语法格式](#4.4.1 语法格式)
- [4.4.2 案例演示](#4.4.2 案例演示)
- 绑定卷
-
- [一、-v 创建绑定卷](#一、-v 创建绑定卷)
-
- [1. 语法格式](#1. 语法格式)
- [2. 操作演示](#2. 操作演示)
- 二、--mount创建绑定卷
-
- [1. 语法格式](#1. 语法格式)
- [2. 操作演示](#2. 操作演示)
- 临时卷
-
- 一、--tmpfs创建临时卷
-
- [1. 语法格式](#1. 语法格式)
- [2. 案例演示](#2. 案例演示)
- 二、--mount创建临时卷
-
- [1. 语法格式](#1. 语法格式)
- [2. 使用案例](#2. 使用案例)
-
- [2.1 案例说明](#2.1 案例说明)
- [2.1 案例演示](#2.1 案例演示)
- [3. linux权限相关机制补充](#3. linux权限相关机制补充)
-
- [1. 基础位权限(后三位:U / G / O)](#1. 基础位权限(后三位:U / G / O))
- [2. 特殊权限位(第一位:Special Bit)](#2. 特殊权限位(第一位:Special Bit))
前言
docker的数据卷分为三类:
- 管理卷:默认存储在
/var/lib/docker/volumes下,由docker deamon统一管理,可移植性强; - 绑定卷:必须指定宿主机地址和容器内部地址,这种方式创建更灵活,但容器多了之后不易管理,且可能出现权限问题;
- 临时卷:临时卷只需要指定容器内部地址即可,实际存储在宿主机内存中;目的是提升容器运行速度,同时保护敏感数据(内存是不可见的)
接下来会分类别,讲解它们的相关命令以及机制~~
管理卷
一 、docker volume create 创建管理卷
1.1 语法格式
bash
docker volume create [options] [volume_name]
1.2 参数
- --driver :用于指定管理卷实际存储在那里,默认是
local也是就宿主机的路径/var/lib/docker/volumes;其他存储方式需要安装插件,例如可以存储到分布式系统中,或者其他云盘当中 - --label :给这个数据卷打上标签,仅便于开发人员查看其信息,无别的实际作用 ;可通过
--filter label=key=val快速查看对应的数据卷
1.3 操作案例
1.3.1 案例介绍
步骤1:创建一个数据卷nginx_volume,设置标签;
步骤2:运行nginx容器和nginx_volume绑定;
步骤3:查看默认路径(/var/lib/docker/volumes)是否更新;
步骤4:修改宿主机挂载的index.html文件,查看容器是否同步更新;
1.3.2 案例演示
bash
docker volume create --label name=hyy \
> --label to=nginx \
> nginx_volume
nginx_volume
docker run -d \
> --name stu_volume \
> -p 8080:80 \
> -v nginx_volume:/usr/share/nginx/html \
> nginx:latest
4900034db7433379440fa60bbe0456c467120cffbbc55e9e56d3b19689a8b652
cd /var/lib/docker/volumes/nginx_volume/_data/
root@iZ2ze8ve39i30yl0dhbqneZ:/var/lib/docker/volumes/nginx_volume/_data# ls -lh
total 8.0K
-rw-r--r-- 1 root root 497 Oct 28 20:05 50x.html
-rw-r--r-- 1 root root 615 Oct 28 20:05 index.html
查看当前nginx界面:

修改宿主机index.html:
bash
vim index.html
root@iZ2ze8ve39i30yl0dhbqneZ:/var/lib/docker/volumes/nginx_volume/_data# cat index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Docker !</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 hyy_bolg!</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>
重新请求url:

小提示:
- 对于空卷,它会默认把第一次绑定的容器对应路径的数据拷贝到宿主机中;
- 若数据卷已有内容,则数据卷的数据会同步到对应的容器中
- 数据卷绑定后,宿主机和容器都可以修改绑定的文件(本质上用的同一份文件),除非容器设置了read-only(只读权限)
二 、 -v 容器绑定管理卷
2.1 语法格式
bash
docker run -v volume_name:container_path[:options]
- 第一个参数:数据卷名称
- 第二个参数:容器内部绑定的路径
- 第三个参数:选项例如
ro(也可用readonly)表示容器只能读不可修改
2.2 操作案例
2.2.1 案例介绍
步骤1:创建一个容器,绑定数据卷并且指定容器只能读取绑定数据;
步骤2:尝试在容器中删除绑定的文件,查看是否成功;
2.2.2 案例演示
bash
docker run --name ro_nginx \
> -v nginx_volume:/usr/share/nginx/html:ro -d nginx:latest
014bd18395c13f3f8483f40f9358f810c18a065879b0ed0f95d9ddf520d55d69
docker exec -it ro_nginx /bin/bash
root@014bd18395c1:/# cd /usr/share/nginx/html
root@014bd18395c1:/usr/share/nginx/html# rm -r index.html
rm: cannot remove 'index.html': Read-only file system
三、--mount 容器绑定管理卷
3.1 语法格式
bash
docker run --mount 'key=val,key=val,...'
3.2 参数(key)
- type : 指定类型(val三种数据卷类型:
bind,volume,tmpfs) - souce 或 src: 指定数据卷的名称
- destination 或 target: 文件或目录挂载在容器中的路径
- ro ,readonly: 只读权限设置
小提示:
--mount和-v之间没有太大区别,前者配置更清晰,后者写起来更简洁
四、docker volume的其他常用操作
4. 1 查看数据卷信息
4.1.1 语法格式
bash
docker volume inspect [options] volume_name
- -f :指定格式输出,例如
json
4.1.2 案例演示
bash
ocker volume inspect -f json nginx_volume
[{"CreatedAt":"2026-02-12T16:03:49+08:00","Driver":"local","Labels":{"name":"hyy","to":"nginx"},"Mountpoint":"/var/lib/docker/volumes/nginx_volume/_data","Name":"nginx_volume","Options":null,"Scope":"local"}]
4.2 查看所有数据卷
4.2.1 语法格式
bash
docker volume ls [options]
- -- format:指定输出格式,如json、table
- -q:只输出数据卷名称
- -f或-filter:过滤输出
4.2.2 案例演示
bash
docker volume ls
DRIVER VOLUME NAME
local haha
local nginx_volume
local t1
docker volume ls --filter label=name=hyy -q
haha
nginx_volume
4.3 删除指定数据卷
4.3.1 语法格式
bash
docker volume rm [options] volume_name
- f ,--force:强制删除
4.3.2 案例演示
bash
docker volume rm -f haha
haha
4.4 批量删除数据卷
4.4.1 语法格式
bash
docker volume prune [options]
- -f ,-force:静默删除,不提示是否删除
- --filter:根据条件删除
4.4.2 案例演示
bash
docker volume prune --filter label=name=hyy
WARNING! This will remove anonymous local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
小提示:
不论是rm还是prune都不会删除正在使用的数据卷,即使使用-f
绑定卷
绑定卷是直接将宿主机目录挂载到容器,双向同步、数据不随容器删除,但依赖宿主机路径,权限可控性差,多用于开发环境。
一、-v 创建绑定卷
1. 语法格式
bash
docker run -v host_machine_path:container_path[:options] ....
- 第一个参数:指定宿主机目录 ,这个和管理卷是不一样的(只能填写
绝对路径) - 第二个参数:卷映射到容器的目录
- 第三个参数:选项,如 ro 表示 readonly
2. 操作演示
我们启动一个nginx容器,挂载一个绑定卷demo:
bash
docker run -d \
> --name bind_stu \
> -v $(pwd)/demo:/demo \
> nginx:latest
7f170e8f49e138424756d71539f3dc234aee988c6dbd75be09b76150cbfc9184
docker ps --filter name=bind_stu
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f170e8f49e1 nginx:latest "/docker-entrypoint...." 48 seconds ago Up 47 seconds 80/tcp bind_stu
docker exec -it bind_stu /bin/bash
root@7f170e8f49e1:/# ls -lh | grep demo
drwxr-xr-x 2 root root 4.0K Feb 13 06:52 demo #容器内创建了一个路径
二、--mount创建绑定卷
1. 语法格式
bash
docker run --mount 'key1=val1,key2=val2...'
- type:数据卷的类型:bind(绑定卷)、volume(管理卷)、tmpfs(临时卷)
- source,src:宿主机地址
- destination,target:所在容器内部地址
- ro,readonly:容器只能读取文件,不可修改
2. 操作演示
我们启动一个nginx容器,挂载一个绑定卷demo,并且设置只读权限:
bash
docker run -d --name bind_stu --mount type=bind,src=$(pwd)/demo,target=/demo,ro nginx:latest
9becd52676b17c37f74b1a4f77511da0b33ee13cafee4461f4474a9a01ba8aef
docker exec -it bind_stu /bin/bash
root@9becd52676b1:/# ls -lh | grep demo
drwxr-xr-x 2 root root 4.0K Feb 13 06:52 demo
root@9becd52676b1:/# rm -rf demo
rm: cannot remove 'demo': Device or resource busy
小提示:
- 绑定卷创建后,即使容器停止运行且被删除,对应宿主机的路径也不会删除;
- 绑定卷文件权限全部继承于宿主机,这种机制可能导致一些权限问题;例如容器可能因为宿主机文件权限过高,无法访问;
- 相比于管理卷(docker统一管理)由于绑定卷路径配置的是当前宿主机地址,可移植性比管理卷差;
临时卷
临时卷数据存储在宿主机内存中,访问速度快,但不可见(安全)、容量小,文件权限默认是 1777;若容器中路径不存在,会自动创建路径,但是容器停止运行后会遗失(删除)。
一、--tmpfs创建临时卷
1. 语法格式
bash
docker run --tmpfs container_path
2. 案例演示
bash
docker run --name docker_stu -d --tmpfs /app_data nginx:latest
7d642d250da2407107d3fdb8c056e506e3b1e919aca34feb70c5bc65893385e0
root@iZ2ze8ve39i30yl0dhbqneZ:~/docker_stu# docker inspect docker_stu | less -N
通过inspect和less命令我们可以查询到,已经绑定了临时卷:

小提示:
- tmpfs存储在
HostConfig中,Mounts只存储管理卷、绑定卷信息:
二、--mount创建临时卷
1. 语法格式
bash
docker run --mount 'key1=val1,key2=val2...'
- type:数据卷的类型:bind(绑定卷)、volume(管理卷)、tmpfs(临时卷)
- source,src:宿主机地址
- destination,target:所在容器内部地址
- ro,readonly:容器只能读取文件,不可修改
- tmpfs-mode:用于指定容器内绑定的文件权限
小提示:
- 对于临时卷,不要设置ro,否则就废了(绑定的路径无法使用内存)
- 由于不需要映射宿主机文件地址,因此我们可以通过tmpfs-mode这个选项来控制文件的权限
2. 使用案例
2.1 案例说明
- 启动一个容器,挂载临时卷,设置临时卷权限为
1777(只允许文件所有人删除文件) - 进入容器,以root用户创建root_file文件
- 创建testuser用户,切换为testuser用户,然后创建test_file
- 尝试以testuser用户,删除root_file文件
- 尝试以testuser用户,删除test_file文件
2.1 案例演示
bash
docker run -d \
> --name docker_stu \
> --mount type=tmpfs,tmpfs-mode=1777,target=/demo \
> nginx:latest
acb71e0016773c7d98634e900525bc0280838973d8c9f070312168d0878ebe5c
root@iZ2ze8ve39i30yl0dhbqneZ:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
acb71e001677 nginx:latest "/docker-entrypoint...." 3 seconds ago Up 2 seconds 80/tcp docker_stu
root@iZ2ze8ve39i30yl0dhbqneZ:~# docker exec -it docker_stu /bin/bash
root@acb71e001677:/# cd /demo
root@acb71e001677:/demo# ls -lh
total 0
root@acb71e001677:/demo# id
uid=0(root) gid=0(root) groups=0(root)
root@acb71e001677:/demo# cat > root_file.txt << EOF
> root_test
> EOF
root@acb71e001677:/demo# cat root_file.txt
root_test
root@acb71e001677:/demo# useradd -m -s /bin/bash user1
root@acb71e001677:/demo# su user1
user1@acb71e001677:/demo$ ls -lh
total 4.0K
-rw-r--r-- 1 root root 11 Feb 14 05:18 root_file.txt
user1@acb71e001677:/demo$ rm -rf root_file.txt
rm: cannot remove 'root_file.txt': Operation not permitted
user1@acb71e001677:/demo$ cat > user1_file.txt << EOF
> user1_test
> EOF
user1@acb71e001677:/demo$ cat user1_file.txt
user1_test
user1@acb71e001677:/demo$ rm -rf user1_file.txt
user1@acb71e001677:/demo$ ls -lh
total 4.0K
-rw-r--r-- 1 root root 11 Feb 14 05:18 root_file.txt
3. linux权限相关机制补充
Linux 权限由 4 位八进制数字 组成,顺序为:特殊位 用户位 组位 其他位。
1. 基础位权限(后三位:U / G / O)
这是最常用的权限,数字计算遵循 r=4, w=2, x=1:
- 4 (Read):可读
- 2 (Write):可写
- 1 (Execute):可执行
- 0:无权限
计算示例:
rwx= 4+2+1 = 7r-x= 4+0+1 = 5rw-= 4+2+0 = 6
2. 特殊权限位(第一位:Special Bit)
特殊位用于处理一些复杂的系统安全和共享场景:
| 数值 | 名称 | 实际作用 | 常见案例 |
|---|---|---|---|
| 4 | SUID (Set User ID) | 让普通用户在运行该可执行文件时,临时拥有该文件所有(通常是 root)的权限。 | /usr/bin/passwd (改密码) |
| 2 | SGID (Set Group ID) | 1. 执行文件时,运行者拥有该组权限。 2. 目录下创建的新文件,自动继承该目录的所属组。 | 团队共享目录,防止权限混乱 |
| 1 | Sticky Bit (粘滞位) | 防删除位 。在公共目录(如 /tmp)下,所有人都能写,但只有文件所有者才能删除自己的文件。 |
tmpfs 挂载、/tmp 目录 |
| 0 | 无特殊权限 | 默认状态,无上述特殊功能。 | 普通文件夹 |
🐎
