Docker致力于:

  • 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
  • 容器之间希望有可能共享数据

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。

一、容器数据卷能做什么

卷(volume)就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

特点:

1:数据卷可在容器之间共享或重用数据

2:卷中的更改可以直接生效

3:数据卷中的更改不会包含在镜像的更新中

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

二、容器内添加数据卷

1. 直接命令添加

# docker run -it -v /宿主机绝对路径目录:/容器内目录  镜像名
# myDataVolume和dataValumeContainer由Docker自建
docker run -it -v /myDataVolume:/dataValumeContainer centos
# 如果想要创建多个容器卷, 则 -v /宿主机绝对路径目录:/容器内目录 这个选项多添加多个
# 查看数据卷是否挂载成功
# docker inspect 容器ID
# "Binds": [ # "/myDataVolume:/dataValumeContainer" # ]

(1) 容器和宿主机之间数据共享

在容器中创建一个文件:

在宿主机器中查看,发现同样存在一个文件:

(2) 容器停止退出后,主机修改后数据是否同步

  • 现在容器终端中输入停止且退出命令:exit
  • 在宿主机器终端中修改文件内容
  • 重新启动容器
  • 查看数据卷的内容

(3) 带权限的数据卷

# docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
# 以下这个命令表示容器卷的内容只读不可写
docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos

在容器中创建文件,提示没有权限:

修改主机同步到容器的文件,提示:

2. Dockerfile添加

在 公共仓库 https://hub.docker.com/ 搜索镜像,可以找到Dockerfile,方便借鉴。

(1) 根目录下新建mydocker文件夹并进入

(2) Dockerfile构建,可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷

# 第一步:编写Dockerfile
# filename Dockerfile
# volume test
# 相当于从centos镜像继承
FROM centos
# 在容器内创建两个数据卷
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
# 执行 输出命令
CMD echo "finished,--------success1"
# 执行 进入终端
CMD /bin/bash
# 第二步:build后生成镜像
# docker build [-f Dockerfile Path] -t 镜像名 .
# 最后有一个.,表示当前目录
docker build -f /mydocker/Dockerfile -t linhw/centos .

出现上面的信息,则docker build成功,使用docker images可以查看我们刚才构建的镜像。

(3) docker run容器

可以发现一启动容器,就在容器创建了两个数据卷。

那这两个数据卷对应的宿主机器的目录是什么呢?可以使用 docker inspect 镜像ID 查看。

备注:

若Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied

解决办法:在挂载目录后多加一个--privileged=true参数即可

docker run -it -v /myDataVolume:/dataValumeContainer --privileged=true centos

三、数据卷容器

1. 数据卷容器是什么

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。

2. 演示步骤

以之前新建的镜像linhw/centos为模板并运行容器dc01/dc02/dc03,它们已经具有两个容器卷dataVolumeContainer1和/dataVolumeContainer2

(1) 运行容器dc01,并在/dataVolumeContainer2创建一个dc01-add.txt文件

docker run -it --name dc01 linhw/centos
cd dataVolumeContainer2
touch dc01-add.txt

(2) 以继承dc01的方式启动容器dc02

# --volumes-from dc01 继承dc01
docker run -it --name dc02 --volumes-from dc01 linhw/centos

查看容器dc02下的/dataVolumeContainer2,发现存在dc01-add.txt文件。

在/dataVolumeContainer2添加dc02-add.txt。

(3) 以继承dc01的方式启动容器dc03

# --volumes-from dc01 继承dc01
docker run -it --name dc03 --volumes-from dc01 linhw/centos

查看容器dc03下的/dataVolumeContainer2,发现存在dc01-add.txt和dc02-add.txt文件。

在/dataVolumeContainer2添加dc03-add.txt。

(4) 回到dc01可以看到dc02/dc03各自添加的都能共享了,在dc02或dc03也能看到添加的文件都在,即每个容器的数据是所有容器数据的总和。

(5) 删除dc01后,dc02和dc03的文件都还存在,可以访问。

(6) 删除dc01后,修改dc02,dc03也可以实现数据共享和传递。

(7) 删除dc02后,dc03依然可以访问。

结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。

Docker容器数据卷(七)的更多相关文章

  1. 『现学现忘』Docker基础 — 28、Docker容器数据卷介绍

    目录 1.什么是Docker容器数据卷 2.数据卷的作用 3.数据卷的使用 1.什么是Docker容器数据卷 Docker容器数据卷,即Docker Volume(卷). 当Docker容器运行的时候 ...

  2. docker 12 docker容器数据卷

    数据卷概念 ♣我们知道,当我们把一个运行中的容器关闭后,容器里的数据就没有了(如果你做了docker commit操作,数据会保留到新的镜像里面).所以我们就需要用容器数据卷把容器数据进行持久化储存. ...

  3. Docker容器数据卷

    ⒈Docker容器中数据如何持久化? ①通过commit命令使容器反向为镜像 ②以容器数据卷的方式将数据抽离 ⒉容器数据卷的作用? ①容器数据的持久化 ②容器间继承.共享数据 ⒊能干嘛? 卷就是目录或 ...

  4. 5、docker容器数据卷: -v添加共享传递容器数据卷

    1.是什么 1.docker理念 先来看看Docker的理念:*  将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的*  容器之间希望有可能共享数据 2.保 ...

  5. Docker 容器数据卷(Data Volume)与数据管理

    卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享.通过卷,我们可以可以使修改数据直接生效,而不必 ...

  6. Docker容器数据卷-Volume详解

    Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume).数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享.数据 ...

  7. docker学习笔记-04:docker容器数据卷

    一.容器数据卷是什么 1.为了保存docker容器运行时产生的数据,做数据的持久化,我们需要用到容器数据卷.因为如果不通过docker commit 生成新的镜像,那么当容器被删除时,数据自然就没有了 ...

  8. 『现学现忘』Docker基础 — 29、Docker容器数据卷的应用

    目录 1.验证容器和宿主机之间数据共享 2.容器停止退出后,主机修改后数据是否同步 3.带只读权限的挂载数据卷 1.验证容器和宿主机之间数据共享 通过上面的操作,接下来我们演示一下通过数据卷的挂载,实 ...

  9. Docker——容器数据卷

    为什么需要容器数据卷 角度:遇到问题,尝试以朴素的道理解决问题.问题复杂化,解决的方式也变得复杂 问题的提出:docker将应用和环境打包成一个镜像,但是对于容器内的数据,如果不进行外部的保存,那么当 ...

随机推荐

  1. 第一次作业--Numpy练习

    1.创建一个边界值为1而内部都是0的数组,图例如下:[提示:]解此题可以先把所有值都设置为1,这是大正方形:其次,把边界除外小正方形全部设置为0.本题用到numpy的切片原理.多维数组同样遵循x[st ...

  2. 10.12 csp-s模拟测试70 木板+打扫卫生+骆驼

    T1 木板 求$[\sqrt{n},n)$间有多少个数的平方是n的倍数 通过打表可以发现(我没带脑子我看不出来),符合条件的数构成一个等差数列,公差为首项 而首项就是将n质因数分解后每个质因数出现次数 ...

  3. RedisHelper (C#)

    <add key="RedisServers" value="172.20.2.90:9379,password=Aa+123456789" /> ...

  4. PMP132种工具与技术

    <PMBOK ® 指南>第六版中共包括 132 种工具与技术 <PMBOK ® 指南>使用了以下工具与技术分组:1.数据收集技术.用于从各种渠道收集数据与信息.共有9 种数据收 ...

  5. LeetCode 2:两数相加 Add Two Numbers

    ​给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

  6. flask 第一章

    1.安装flask 首先安装python的虚拟环境,每个环境之间的包并不会产生冲突 ,相当于一个单独的 小空间. 由于自己使用的是windows开发环境  所以安装虚拟包的命令如下 pip  inst ...

  7. 海关单一窗口程序出现网络/MQ问题后自动修复处理

    单一窗口切换了2年多了,由于RabbitMQ或者网络的不稳定,或者升级或者网络调整,等等诸多问题导致了海关单一窗口程序会不定期的出现文件及回执自动处理的作业停止的问题. 最近终于想明白了,把日志监控起 ...

  8. excel转pdf,itextpdf转换excel

    最近项目有需求,需要把excel转pdf.由于时间比较急,所以在github上找了一个转换的.最终没用上,但还是踩坑了一波. 踩坑一: 首先,这个是导出的流之间会互相影响,因为流读取过,导致导出的ex ...

  9. 原生js与jquery加载页面元素比较

    原生js:将获取元素的语句写到页面头部,会因为元素还没有加载而出错,js提供了window.onload 这个方法事先加载元素 <script type="text/javascrip ...

  10. 设计模式之(十)装饰模式(DECORATOR)

    在购买了一个房子后,如果是毛坯房,肯定不合适直接入住的.需要对它进行装修:地面找平贴地砖.批墙贴墙纸.吊顶装订以及买需要的家具,住进去以后也可能根据需要再添加或者去掉一些家具或者修改一些东西.所以的这 ...