Docker基础入门学习~数据卷容器

前言

想要了解Docker Volume,首先我们需要知道Docker的文件系统是如何工作的。Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(即镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。
为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。

总 结 : V o l u m e 可 以 将 容 器 以 及 容 器 产 生 的 数 据 分 离 开 来 \color{red}总结:Volume可以将容器以及容器产生的数据分离开来 Volume
这 样 , 当 你 使 用 d o c k e r r m m y c o n t a i n e r 删 除 容 器 时 , 不 会 影 响 相 关 的 数 据 。 \color{red}这样,当你使用docker rm my_container删除容器时,不会影响相关的数据。 使dockerrmmycontainer

联合文件系统

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
在这里插入图片描述
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

docker容器数据卷是什么?

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

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

特 点 : \color{red}特点:

1 : 数 据 卷 可 以 在 容 器 之 间 共 享 或 重 用 数 据 \color{red}1:数据卷可以在容器之间共享或重用数据 1

2 : 数 据 卷 中 的 更 改 可 以 直 接 生 效 \color{red}2:数据卷中的更改可以直接生效 2

3 : 数 据 卷 中 的 更 改 不 会 包 含 在 镜 像 的 更 新 中 \color{red}3:数据卷中的更改不会包含在镜像的更新中 3

4 : 数 据 卷 的 生 命 周 期 一 直 持 续 到 没 有 容 器 使 用 它 为 止 \color{red}4:数据卷的生命周期一直持续到没有容器使用它为止 4使

两种添加数据卷的方式

命令行挂载

  1. 首先来说第一种通过命令行挂载的方式,命令如下:
docker run -it -v  /宿主机绝对路径目录:  /容器内目录  镜像名
docker inspect  容器id

上面的命令可以查看容器的详细情况,命令返回的是JSON格式的字符串,运行命令之后我们在返回的JSON字符串中找到Volumes属性
假如挂载成功的话,Volumes里面显示的绑定结果应该是你在挂载时输入的命令参数 (/宿主机绝对路径目录: /容器内目录 )
如果与你们之前输入的一致的话,证明挂载成功。PS: Volumes里面显示的绑定结果可能有多个,但是只要找到目标结果就可以。挂载之后,当容器停止运行的时候,宿主机上对数据卷做的内容修改是会同步到容器内的。

  1. 增加权限的挂载
docker run -it -v /宿主机绝对路径目录 : /容器内目录  :ro 镜像名

上 案 例 : \color{red}上案例:

docker images
mkdir xiaozheng
cd xiaozheng
docker run -it -v /xiaozheng:/xiaozhengContainer 375e2d4d2a24
ls

在这里插入图片描述
查 看 数 据 卷 是 否 挂 载 成 功 \color{red}查看数据卷是否挂载成功

docker ps
docker inspect 容器iD

在这里插入图片描述
在这里插入图片描述
说明:挂载成功了

测 试 要 点 : \color{red}测试要点:

  1. 在宿主机的host.txt增加内容,查看容器内host.txt内容,看会不会数据同步
  2. 在容器内的host.txt增加内容,查看宿主机的host.txt内容,看会不会数据同步
  3. 停掉容器实例,然后在宿主机修改host.txt内容,重新启动实例后会不会数据同步docker start
    1~3都会同步
  4. 带权限数据卷
docker run -it -v /xiaozheng:/xiaozhengContainer:ro 375e2d4d2a24

尝试在容器内去修改host.txt,发现修改不了
在这里插入图片描述

命令行挂载

  1. dockerFile的形式添加,保留关键字
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]

上 案 例 : \color{red}上案例:

  1. 新建一个dockerFile
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash

在这里插入图片描述
3. build 后形成一个新的镜像

docker build -f /xiaozheng/dockerFile -t csdn-mycentos-test .

在这里插入图片描述
4. 启动这个新的镜像

docker run -it csdn-mycentos-test

在这里插入图片描述
5. 通过上述的步骤,容器内的目录地址已经知道,但是宿主机的地址呢?

docker ps
docker inspect 5359a72563ef

在这里插入图片描述

在这里插入图片描述

【 总 结 】 出 于 可 移 植 和 分 享 的 考 虑 , 用 − v 主 机 目 录 : 容 器 目 录 这 种 方 法 不 能 够 直 接 在 D o c k e r f i l e 中 实 现 。 \color{red}【总结】出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。 v:Dockerfile
由 于 宿 主 机 目 录 是 依 赖 于 特 定 宿 主 机 的 , 并 不 能 够 保 证 在 所 有 的 宿 主 机 上 都 存 在 这 样 的 特 定 目 录 。 \color{red}由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。 宿宿宿

什么是docker数据卷容器?

上面介绍了docker容器数据卷,它的作用相当于生活中的活动硬盘,那么数据卷容器就相当于把多个活动硬盘再挂载到一个活动硬盘上,实现数据的传递依赖。

官网解析:
命 名 的 容 器 挂 载 数 据 卷 , 其 他 的 容 器 通 过 挂 载 这 个 父 容 器 实 现 数 据 共 享 , 挂 载 数 据 卷 的 容 器 , \color{red}命名的容器挂载数据卷,其他的容器通过挂载这个父容器实现数据共享,挂载数据卷的容器,
我 们 称 为 数 据 卷 容 器 。 \color{red}我们称为数据卷容器。

上 案 例 : \color{red}上案例:

  1. 以上面新建的镜像csdn-mycentos-test为模板,并且运行容器dc001/dc002/dc003
    它们已经具备了容器卷
dataXiaozhengContainer
dataXiaozhengContainer2
  1. 先启动一个父容器dc001,并且在Container2增加内容
docker images
docker run -it --name dc001 csdn-mycentos-test
vi host.txt
cat host.txt 

在这里插入图片描述
2. 然后建立两个子容器继承父容器

docker run -it --name 别名 --volumes-from 父镜像 镜像名字 
docker run -it --name 别名 --volumes-from 父镜像 镜像名字
docker run -it --name dc002 --volumes-from dc001 csdn-mycentos-test 
docker run -it --name dc003 --volumes-from dc001 csdn-mycentos-test 

在这里插入图片描述
3. 观察
1) 在父容器中添加的数据,会共享给子容器
2) 删除dc001之后,dc002修改后,dc003能不能访问
3) 删除dc002之后,启动dc004, volumes-from dc003, 则dc004 和 dc003能否数据共享
4) 重新启动dc002后,dc002/dc003/dc004三者数据能否共享
5) 新建dc005集成dc004,然后删除dc003、dc004,观察dc005和dc002能否数据共享
结 论 : 都 可 以 \color{red}结论:都可以

数据卷容器小结

容器之间配置信息的传递,数据卷的生命周期会一致持续到没有容器使用它为止,换言之,只要有一个容器仍在使用该数据卷,该数据卷一直都可以进行数据共享,通俗地来说,如果此时我们把父容器关闭掉,两个字容器之间依旧可以进行数据共享,而且通过继承子容器生成的新容器,一样可以与子容器进行数据共享。这就是docker容器间的数据传递共享。

总结

按照上面的操作就可以了,希望对你有帮助!
授 人 以 鱼 不 如 授 人 以 渔 , 知 道 的 越 多 , 不 知 道 的 越 多 , 希 望 对 你 有 帮 助 ! \color{red}授人以鱼不如授人以渔,知道的越多,不知道的越多,希望对你有帮助!

猜你喜欢

转载自blog.csdn.net/xiaozhegaa/article/details/110825697