操作 Docker 存储卷的常用指令汇总

1. 什么是存储卷?

存储卷就是将宿主机的本地文件系统中存在的某个目录 直接与容器内部的文件系统上的某一目录 建立绑定关系 。使得可以在宿主机和容器内共享数据库内容,让容器直接访问宿主机中的内容,也可以宿主机向容器写入内容,容器和宿主机的数据读写是同步的

存储卷可以分为三类:

  1. 管理卷 :默认映射到宿主机的/var/lib/docker/volumes 目录下, 只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是由容器引擎 daemon 自行创建一个空的目录。
  2. 绑定数据卷:映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个特定的路径。
  3. 临时数据卷 :映射到于宿主机内存中,一旦容器停止运行,tmpfs、mounts 会被移除,数据就会丢失,用于高性能的临时数据存储。

2. 管理卷

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

2.1 Volume 命令操作

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

2.1.1 docker volume create

  • 功能:创建存储卷
shell 复制代码
docker volume create [OPTIONS] [VOLUME]
  • 参数:
    • -d:指定驱动,默认是 local
    • --label:指定元数据(标签,给卷添一些备注信息)

通过这种方式创建出来的卷的默认的目录是/data/var/lib/docker/volumes/

--label 是设置卷的备注信息。

2.1.2 docker volume inspect

  • 功能:查看卷详细信息(上面的演示)
shell 复制代码
docker volume inspect VOLUME

2.1.3 docker volume ls

  • 功能:列出所有的卷
shell 复制代码
docker volume ls [OPTIONS]
  • 参数:
    • --format:指定相应个格式,如 json,table
    • -f:过滤
    • -q:仅显示名称

2.1.4 docker volume rm

  • 功能:删除卷,需要容器不使用。
shell 复制代码
docker volume rm [OPTIONS] VOLUME [VOLUME...]
  • 参数:-f:强制删除

2.1.5 docker volume prune

  • 功能:删除不使用的本地卷
shell 复制代码
docker volume prune [OPTIONS]
  • 参数:
    • --filter:过滤
    • -f:不提示是否删除

2.2 -v 或者--mount 指定

2.2.1 -V 参数

shell 复制代码
docker run -v name:directory[:options]
  • 参数
    • 第一个参数:卷名称
    • 第二个参数:卷映射到容器的目录
    • 第三个参数:选项,如 ro 表示 readonly(表示只读,不允许删除容器中的文件)
shell 复制代码
# 运行一个容器
docker run -d --name mynginx2 -v volnginx2:/user/share/nginx/html/ nginx:1.24.0

运行一个容器,将容器/user/share/nginx/html/目录下的文件自动拷贝volnginx1卷上(自己创建这个卷)。

  • 如果删除容器中的文件,宿主机将会跟着删除。

为了避免上面的这种情况,就要加上 :ro 就可避免容器中的文件被删除。ro它表示只读,可以修改宿主机的文件,但是容器里的文件修改不了。

shell 复制代码
docker run -d --name mynginx2 -v volnginx2:/user/share/nginx/html/:ro nginx:1.24.0

2.2.2 --mount 参数

  • 功能:完成目录映射
shell 复制代码
--mount '<key>=<value>,<key>=<value>'
  • 参数:
    • type:类型表示 bind, volume, tmpfs
    • src:对于命名卷,这是卷的名称。对于匿名卷(名称为一串字符串),省略此字段。
    • dst,target:文件或目录挂载在容器中的路径。
    • ro,readonly:只读方式挂载。
shell 复制代码
docker run -d --name mynginx4 --mount 'src=nginxvol4,dst=/usr/share/nginx/html,ro' nginx:1.24.0

将容器中/usr/share/nginx/html目录下的文件与nginxvol4卷相映射。

  1. 如果删除容器,卷是不会删除的,也就说宿主机中的文件会保留(这也是卷的作用)。
  2. 如果修改宿主机中的文件,容器里的文件会自动更新(前提是容器不是只读模式)。

3 绑定卷

绑定卷跟管理卷中的 -v、----mount是一样的。

3.1 -v 参数创建卷

  • 功能:完成卷映射
shell 复制代码
docker run -v name:directory[:options]
  • 参数:
    • 第一个参数:宿主机目录,这个和管理卷是不一样的。(随着写法变动)
    • 第二个参数:卷映射到容器的目录。
    • 第三个参数:选项,如 ro 表示 readonly
shell 复制代码
# 运行并绑定
docker run -d --name mynginx6 -v /root/data:/usr/share/nginx/html nginx:1.24.0

这时候就是将宿主机中的/root/data目录与容器中的/usr/share/nginx/html目录相绑定。这时候容器和宿主机中的初始文件都消失了(index.html)。

/root/data目录下没有html文件,没有拷贝过来。

shell 复制代码
# 查看详细信息
docker inspect mynginx6

3.2 --mount 参数

这跟 -v 是很相似的,就是将卷的名称替换为宿主机的目录,区别是一定要加上type参数,bind 表示绑定卷。

shell 复制代码
docker run -d --name myngixn7  --mount type=bind,src=/root/data,dst=/usr/share/nginx/html nginx:1.24.0

-v 与 --mount 的区别: -v 创建卷的时候,宿主机的目录可以不用存在;而 --mount 必须先创建目录再绑定,不然会报错。

4.临时卷

临时卷数据位于内存中,在容器与宿主机之外。

4.1 指定 --tmpfs 创建

在创建一个临时目录/test1

shell 复制代码
docker run --name mynginx8 -d --tmpfs /test1 nginx:1.24.0

可以通过 docker inspect mynginx8 来查看。

/test1 在容器的目录中,但是数据是存储在内存中的。如果容器重启,那么该目录下的。

4.2 --mount 参数

shell 复制代码
--mount '<key>=<value>,<key>=<value>'
  • 参数:
    • type:类型表示 bind, volume,tmpfs。
    • src:宿主机目录,这个和管理卷是不一样的。
    • dst,target:文件或目录挂载在容器中的路径。
    • ro,readonly:只读方式挂载。

只需要 type 类型为 tmpfs 就行了。

shell 复制代码
docker run -d -p 80:80 --name bind1 --mount type=tmpfs,source=/root/data,target=/usr/share/nginx/html nginx:1.24.0
相关推荐
lwprain5 分钟前
常用docker应用部署,wordpress、mysql、tomcat、nginx、redis
mysql·docker·tomcat
Code_Artist2 小时前
使用Portainer来管理并编排Docker容器
docker·云原生·容器
mengao12342 小时前
centos 服务器 docker 使用代理
服务器·docker·centos
Eternal-Student2 小时前
【docker 保存】将Docker镜像保存为一个离线的tar归档文件
运维·docker·容器
不是二师兄的八戒2 小时前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
码农小丘2 小时前
一篇保姆式centos/ubuntu安装docker
运维·docker·容器
Eternal-Student2 小时前
【1.2 Getting Started--->Installation Guide】
docker
灼烧的疯狂4 小时前
K8S + Jenkins 做CICD
容器·kubernetes·jenkins
wenyue11214 小时前
Revolutionize Your Kubernetes Experience with Easegress: Kubernetes Gateway API
容器·kubernetes·gateway
yunfanleo5 小时前
docker run m3e 配置网络,自动重启,GPU等 配置渠道要点
linux·运维·docker