Docker学习笔记(六)docker容器数据卷

容器数据卷

当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享。

通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。

也就是将说容器数据卷这种文件目录指向了外部硬盘,属于容器,相当于linux中的目录指向了外部硬盘一个道理。

什么是挂载

Linux 系统中“一切皆文件”,所有文件都放置在以根目录为树根的树形目录结构中。在 Linux 看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构)。

因此产生的问题是,当在 Linux 系统中使用这些硬件设备时,只有将Linux本身的文件目录与硬件设备的文件目录合二为一,硬件设备才能为我们所用。合二为一的过程称为“挂载”。

如果不挂载,通过Linux系统中的图形界面系统可以查看找到硬件设备,但命令行方式无法找到。

挂载,指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件。

纠正一个误区,并不是根目录下任何一个目录都可以作为挂载点,由于挂载操作会使得原有目录中文件被隐藏,因此根目录以及系统原有目录都不要作为挂载点,会造成系统异常甚至崩溃,挂载点最好是新建的空目录。

举个例子,我们想通过命令行访问某个 U 盘中的数据,图 1 所示为 U 盘文件目录结构和 Linux 系统中的文件目录结构。
在这里插入图片描述

图 1 中可以看到,目前 U 盘和 Linux 系统文件分属两个文件系统,还无法使用命令行找到 U 盘文件,需要将两个文件系统进行挂载。

接下来,我们在根目录下新建一个目录 /sdb-u,通过挂载命令将 U 盘文件系统挂载到此目录,挂载效果如图 2 所示。
在这里插入图片描述

可以看到,U 盘文件系统已经成为 Linux 文件系统目录的一部分,此时访问 /sdb-u/ 就等同于访问 U 盘。

根目录下的 /dev/ 目录文件负责所有的硬件设备文件,事实上,当 U 盘插入 Linux 后,系统也确实会给 U 盘分配一个目录文件(比如sdb1),就位于 /dev/ 目录下(/dev/sdb1),但无法通过 /dev/sdb1/ 直接访问 U 盘数据,访问此目录只会提供给你此设备的一些基本信息(比如容量)。

总之,Linux 系统使用任何硬件设备,都必须将设备文件与已有目录文件进行挂载。linux中使用mount命令挂载。

创建容器数据卷

命令添加

docker run -it -v /宿主机绝对路径目录:/容器内目录      镜像名

这个命令会自动创建相应目录

docker run -it -v ~/liutao/mount:/mount ubuntu

在宿主机上的的数据卷,也就是刚才创建的目录中写入创建文件,写入一些数字。

在容器内查看如下,相当于硬盘挂载到容器上
在这里插入图片描述

docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

这个命令和上面的命令区别就是:在容器内的相应位置,只有只读权限

使用DockerFile创建容器数据卷

DockerFile相当于构建镜像的脚本文件,文本内容包含了一条条构建镜像所需的指令和说明。

也就是说可以通过某些指令来构建一个在宿主机添加数据卷的镜像。

说明:

  1. 出于可移值和分享的考虑,用 -v 主机目录:容器目录 这种方法不能够直接在Dockerfile中实现。
  2. 由于宿主机目录是依赖于特定宿主机的,并不能保证在所有宿主机上都存在这样的特定目录。

File构建

vim dockerfile1 
FROM centos
VOLUME ["volume1","volume2"]
CMD echo "----end---"
CMD /bin/bash

构建dockerfile

上面的 Dockerfile 的内容 等价于

docker run -it -v volume1 -v volume2 centos /bin/bash		// 这是没有意义的,因为数据卷指向的外部硬盘是一个空的

注意:运行如下命令的时候最好在一个只有dockerfile的目录下运行和创建dockerdile,否则数据量会过大

docker build -f ./dockerfile1 -t lituao/centos:v1.0 .
docker run -it liutao/centos:v1.0 /bin/bash

进入volume1创建文件tes
在这里插入图片描述

docker inspect 容器ID

在这里插入图片描述

cd 数据卷路径

在这里插入图片描述

数据卷容器

如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。

总结:就是数据卷容器相当于linux创建空目录,等待别的硬盘挂载到这个空目录上,这里指的是别的容器再挂载到这个空目录

docker run -it -v /dbdata --name ubuntu1 ubuntu		// 先创建一个空的数据卷,

使用 --volumes-from将别的容器挂载到数据卷容器上

例如创建ubuntu2和ubuntu3两个容器,并从Ubuntu1容器挂载数据卷:

docker run -it --volumes-from ubuntu1 --name ubuntu2 ubuntu
docker run -it --volumes-from ubuntu1 --name ubuntu3 ubuntu

此时,容器ubuntu1和ubuntu2都挂载同一个相同的/dbdata目录。三个容器任何一方在该目录下的写入,其他容器都可以看到。

在这里插入图片描述
相当于这三个容器中的/dbdata数据共享

猜你喜欢

转载自blog.csdn.net/liutao43/article/details/111406420