Docker-数据卷的挂载

数据卷概念

为了很好的实现数据保存数据共享,Docker提出了Volume这个概念,简单的说就是绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷

数据卷实现机制

创建容器时,将宿主机的目录与容器内的目录进行映射,可以通过修改宿主机的某个目录从而去影响容器,而且这个操作是双向绑定,容器内的操作也会影响到宿主机,实现备份功能。但是容器被删除的时候,宿主机的内容并不会被删除,因为底层是通过拷贝实现的。如果多个容器挂载的是同一个目录,其中一个容器被删除,其他容器内的数据不会受到影响,同理,底层也是拷贝实现的

数据卷特性

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

容器和宿主机之间的数据卷属于引用关系,数据卷是从外界挂载到容器内部的,所以可以脱离容器的生命周期而独立存在,正式由于数据卷的生命周期并不等同于容器的生命周期,在容器退出或者删除以后,数据卷依然不会受到影响,数据卷的生命周期一直持续到没有容器使用它为止

数据卷操作

数据卷挂载通用命令

创建容器时添加-v参数,格式为宿主机:容器目录,例如

sudo docker run -di -v /docker/mysql/data:/usr/local/data --name mysql01 -e MYSQL_ROOT_PASSWORD=root -d mysql

sudo docker run -di -v /docker/mysql/data:/usr/local/data --name mysql02 -e MYSQL_ROOT_PASSWORD=root -d mysql

宿主机在/docker/mysql/data下新增test.txt文件
在这里插入图片描述
登陆进入mysql01容器内在/usr/local/data下发现test.txt文件
在这里插入图片描述
登陆进入mysql02容器内在/usr/local/data下发现test.txt文件
在这里插入图片描述
当我退出,停止,删除容器mysql02时,宿主机上test.txt文件依旧存在
在这里插入图片描述
重新启动容器mysql02,在容器mysql02上删除test.txt,宿主机和容器mysql01的test.txt文件也都不存在了

匿名挂载

匿名挂在只需要写容器目录即可,宿主机对应的目录会在/var/lib/docker/volumes中生成
格式为-v 容器目录,例如

docker run -di -v /usr/local/data --name mysql01 -e MYSQL_ROOT_PASSWORD=root -d mysql

启动容器后,通过docker inspect mysql01 知道当前容器数据卷的挂载情况
在这里插入图片描述
若你使用的是mac系统,它找不到卷目录,可以执行
docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
然后直接可以转入到var/lib/docker/volumes目录下操作文件即可

具名挂载

具名挂载就是给数据卷起了个名字,容器外对应的目录会在var/lib/docer/volumes中生成
格式为-v 卷名称:容器目录,例如:

docker run -di --privileged=true -v docker_mysql_data:/usr/local/data --name mysql03 -e MYSQL_ROOT_PASSWORD=root -d mysql

执行docker volume ls 查看volume数据卷信息,其中docker_mysql_data就是卷名称,其它卷名称都是默认生成的ID号
在这里插入图片描述
通过docker volume inspect 数据卷名称可以查看该数据卷对应宿主机的目录地址

docker volume inspect docker_mysql_data

在这里插入图片描述

数据卷继承

若多个容器使用的是相同的数据卷挂载地址,那后续的容器启动时可以选择继承容器的数据卷挂载。使用--volumes-from 数据卷容器数据卷容器可以是容器的名称,
优势:如果需要创建大量的相同目录映射关系,可以简化命令便于操作和记忆
例如:
先启动mysql01容器,使用-v指定数据卷的挂载

docker run -di -v /Users/apple/docker/mysql/data:/usr/local/data --name mysql02 -e MYSQL_ROOT_PASSWORD=root -d mysql

执行docker inspect mysql01查看数据卷挂载
在这里插入图片描述
容器mysql02和mysql03使用都是同一个数据卷挂载,可以在启动容器时使用--volumes-from 数据卷容器指定使用mysql01的数据卷容器,例如

docker run -di --volumes-from mysql01 --name mysql02 -e MYSQL_ROOT_PASSWORD=root -d mysql

指定docker inspect mysql02查看数据卷挂载
在这里插入图片描述

容器数据卷只读

只能通过修改宿主机内容实现对容器的数据管理,执行docker run -it -v /宿主机目录:/容器目录:ro 镜像名 。例如 :

docker run -di -v /Users/apple/docker/mysql/data:/usr/local/data:ro --name mysql01 -e MYSQL_ROOT_PASSWORD=root -d mysql

在这里插入图片描述

容器数据卷读写-默认

宿主机和容器双向操作数据,执行docker run -it -v /宿主机目录:/容器目录:rw 镜像名 或者docker run -it -v /宿主机目录:/容器目录 镜像名
例如 :

docker run -di -v /Users/apple/docker/mysql/data:/usr/local/data:rw --name mysql02 -e MYSQL_ROOT_PASSWORD=root -d mysql

总结

数据卷是Docker容器提出来概念,目的是用来持久化容器的数据,存在于宿主机上,独立于容器的生命周期,不会在容器删除后删除数据。Docker提供的数据卷挂载方式很多,可以通过具名挂载,匿名挂载或者数据卷继承方式等,同样可以指定容器目录的可读可写权限,若只可读即只能通过宿主机进行数据管理

相关推荐

  1. Docker挂载目录区别

    2024-05-26 06:18:37       32 阅读
  2. Docker基本使用【数据挂载及常用命令】

    2024-05-26 06:18:37       29 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-26 06:18:37       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-26 06:18:37       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-26 06:18:37       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-26 06:18:37       18 阅读

热门阅读

  1. dcache-android框架中的设计模式详解

    2024-05-26 06:18:37       11 阅读
  2. leetcode 207.课程表

    2024-05-26 06:18:37       8 阅读
  3. React Native 之 颜色(七)

    2024-05-26 06:18:37       12 阅读
  4. call、apply和bind

    2024-05-26 06:18:37       13 阅读
  5. 【代码随想录】day58

    2024-05-26 06:18:37       12 阅读
  6. C++|设计模式(三)|抽象工厂模式

    2024-05-26 06:18:37       11 阅读
  7. 【设计模式】抽象工厂模式

    2024-05-26 06:18:37       12 阅读
  8. Vue 图片和PDF预览组件

    2024-05-26 06:18:37       13 阅读
  9. 互联网十万个为什么之什么是分布式计算?

    2024-05-26 06:18:37       11 阅读
  10. 汇编:数据类型

    2024-05-26 06:18:37       11 阅读