Docker 数据卷详解

书读的越多而不加思考,你就会觉得你知道得很多;而当你读书而思考得越多的时候,你就会越清楚地看到,你知道得很少。

导读:本篇文章讲解 Docker 数据卷详解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文


在这里插入图片描述

一、数据卷简介

1、引言

docker的镜像是由多个只读的文件系统叠加在一起形成的。当我们在我启动一个容器的时候,docker会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层。这时如果修改正在运行的容器中已有的文件,那么这个文件将会从只读层复制到读写层。该文件的只读版本还在,只是被上面读写层的该文件的副本隐藏。当删除docker,或者重新启动时,之前的更改将会消失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。

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

2、什么是数据卷

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性: – 数据卷可以在容器之间共享和重用 – 对数据卷的修改会立马生效 – 对数据卷的更新,不会影响镜像 – 数据卷默认会一直存在,即使容器被删除 Docker中提供了两种挂载方式,-v和-mount

3、为什么使用数据卷?

Docker的镜像是由一系列的只读层组合而来,当启动一个容器的时候,Docker加载镜像的所有只读层,并在最上层加入一个读写层。这个设计使得Docker可以提高镜像构建、存储和分发的效率,节省了时间和存储空间,然而也存在如下问题。

  • 容器中的文件在宿主机上存在形式复杂,不能在宿主机上很方便的对容器中的文件进行访问
  • 多个容器之间的数据无法共享
  • 当删除容器时,容器产生的数据将丢失

为了解决这些问题,Docker引入了数据卷(volume)机制。volume是存在一个或多个容器中的特定文件或文件夹,这个目录能够独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久提供一下便利。

  • volume在容器创建时就初始化,在容器运行时就可以使用其中的文件
  • volume能在不同的容器之间共享和重用
  • 对volume中的数据的操作会马上生效
  • 对volume中数据操作不会影响到镜像本身
  • volume的生存周期独立于容器的生存周期,即使删除容器,volume仍然会存在,没有任何容器使用的volume也不会被Docker删除

二、数据卷的基本使用

1、创建数据卷
docker volume create mydata

在这里插入图片描述

2、查看所有数据卷
docker volume ls

在这里插入图片描述

3、查看数据卷信息
docker volume inspect mydata

在这里插入图片描述

MountPoint为数据在本机存放的位置

三、Docker安装nginx并使用数据卷配置同步映射

这里可以参考我的另一篇博客
Docker安装nginx并使用数据卷配置同步映射.

四、Docker 安装MySQL并使用数据卷实现数据持久化

这里可以参考我的另一篇博客
Docker 安装MySQL并使用数据卷实现数据持久化.

五、具名和匿名挂载

1、匿名挂载

-v 容器内路径

docker run -d -P --name nginx02 -v /ect/nginx nginx

在这里插入图片描述

  • 查看所有volume的情况
    在这里插入图片描述

这种就是匿名挂载,-v 只写了容器内的路径,没有写容器外的路径

2、具名挂载

通过 -v 卷名:容器内路径

 docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
  • 查看所有volume的情况
    在这里插入图片描述
  • 查看一下这个卷
    在这里插入图片描述

所有的docker容器内的卷,没有指定目录的情况下 都在 /var/lib/docker/volumes/xxx/_data

在这里插入图片描述

通过具名挂载可以方便找到我们的一个卷,因此大多数情况下使用具名挂载

3、具名挂载、匿名挂载和指定路径挂载如何区分
  • 匿名挂载

-v 容器内路径

  • 具名挂载

-v 卷名:容器内路径

  • 指定路径挂载

-v /宿主机路径:容器内路径

4、拓展
  • 通过 -v 容器内路径: ro rw 改变读写权限

只读:ro readonly
可读可写 : rw readwite

  • 一旦设置了容器权限,容器挂载出来的内容就有限定了
 docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:ro nginx
  docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx

ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部无法操作!

六、数据卷之DockerFile

1、创建dockerfile文件
  • 新建文件夹 docker-test-volume
    在这里插入图片描述
  • 创建一个dockerfile文件

输入 i 进入编辑模式
文件中的内容 指令(大写)
按Esc返回,输入 :wq 退出并保存

vim dockerfile1

在这里插入图片描述

文件中的每个命令,就是镜像的一层!

在这里插入图片描述

2、生成镜像
docker build -f dockerfile1 -t lyp/centos .

在这里插入图片描述

3、运行自己创建的镜像

在这里插入图片描述

这个卷和外部一定有一个同步的目录

在这里插入图片描述

4、查看容器信息

在这里插入图片描述

5、查看一下卷挂载的路径

在这里插入图片描述

6、测试一下刚才的文件是否同步出去

在这里插入图片描述

这种方式使用十分多,因为通常要自己构建镜像!
假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!

七、数据卷容器

在这里插入图片描述

1、运行镜像,容器命名为docker01
docker run -it --name docker01 [镜像ID]

在这里插入图片描述

2、运行镜像,容器命名为docker02,并使用数据卷实现容器间数据共享
docker run -it --name docker02 --volumes-from docker01 lyp/centos

在这里插入图片描述

3、在容器docker01中新建文件

在这里插入图片描述

  • 在容器docker02中查看
    在这里插入图片描述
4、运行容器docker03,继续测试
  • 此时docker01与docker02容器都在运行中

在这里插入图片描述

  • 在容器docker03中新建文件

在这里插入图片描述

  • 进入docker01和docker02中进行查看

在这里插入图片描述

显然这三个容器通过 –volume-from 实现了数据同步

在这里插入图片描述

5、退出docker01,并删除,测试数据是否还同步
exit
docker ps
docker ps -a
docker rm -f [容器ID]

在这里插入图片描述

  • 查看docker01与docker02的数据是否还存在

测试依旧可以访问

在这里插入图片描述

结论:

  • 容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
  • 如果持久化到了本地,这个时候,本地的数据是不会删除的!
6、多个MySQL实现数据共享
docker run -d -p 3310:3306 -v /etc/mysql/conf.d  -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:8.0
docker run -d -p 3310:3306 -v /etc/mysql/conf.d  -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql02 --volumes-from mysql01 mysql:8.0

这个时候,可以实现两个MySQL容器数据同步!
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/122969.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!