Docker-数据卷命令解析

文章目录

  • 前言
  • 管理卷
    • [一 、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:

小提示:

  1. 对于空卷,它会默认把第一次绑定的容器对应路径的数据拷贝到宿主机中;
  2. 若数据卷已有内容,则数据卷的数据会同步到对应的容器中
  3. 数据卷绑定后,宿主机和容器都可以修改绑定的文件(本质上用的同一份文件),除非容器设置了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
  • soucesrc: 指定数据卷的名称
  • destinationtarget: 文件或目录挂载在容器中的路径
  • 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

小提示:

  1. 绑定卷创建后,即使容器停止运行且被删除,对应宿主机的路径也不会删除
  2. 绑定卷文件权限全部继承于宿主机,这种机制可能导致一些权限问题;例如容器可能因为宿主机文件权限过高,无法访问;
  3. 相比于管理卷(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命令我们可以查询到,已经绑定了临时卷:

小提示:

  1. 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:用于指定容器内绑定的文件权限

小提示:

  1. 对于临时卷,不要设置ro,否则就废了(绑定的路径无法使用内存)
  2. 由于不需要映射宿主机文件地址,因此我们可以通过tmpfs-mode这个选项来控制文件的权限

2. 使用案例

2.1 案例说明
  1. 启动一个容器,挂载临时卷,设置临时卷权限为1777(只允许文件所有人删除文件)
  2. 进入容器,以root用户创建root_file文件
  3. 创建testuser用户,切换为testuser用户,然后创建test_file
  4. 尝试以testuser用户,删除root_file文件
  5. 尝试以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 = 7
  • r-x = 4+0+1 = 5
  • rw- = 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 无特殊权限 默认状态,无上述特殊功能。 普通文件夹

🐎

相关推荐
晓晓_za8986681 小时前
开源 GEO 优化源码二次开发:贴牌改造与业务模块扩展实践
java·运维·服务器·开发语言·性能优化·开源
别慌,让我先缓缓1 小时前
Java入门:从编写到运行第一步
java
liangshanbo12151 小时前
Nginx 进程管理命令深度面试题解析
java·nginx·面试
Mr. zhihao1 小时前
死锁排查实战:JVM 唯一会“自动报案“的问题(场景 B5)
java·jvm·gc
LINgZone22 小时前
后端Java编码规范
java·开发语言
zhangfeng11332 小时前
AMD Instinct MI50(gfx906)上为 Qwen 系列模型优化并可用的 vLLM 相关仓库、Docker 镜像与实践指南。
人工智能·docker·ai编程·qwen·算子开发·vllm·mi50
weixin_399380693 小时前
TongWeb7.0.4.9M11一键安装脚本(by sy)
java·spring
CallFay云起未来3 小时前
AI客服能不能减少人工回复?从重复咨询到人机协同的落地分析
java·大数据·人工智能·文心一言
我命由我123453 小时前
Android 开发 - 获取当前设备屏幕的旋转角度
android·java·java-ee·android studio·android jetpack·android-studio·android runtime