Volume

https://www.cnblogs.com/51kata/p/5266626.html

前言

在介绍VOLUME指令之前,我们来看下如下场景需求:

1)容器是基于镜像创建的,最后的容器文件系统包括镜像的只读层+可写层,容器中的进程操作的数据持久化都是保存在容器的可写层上。一旦容器删除后,这些数据就没了,除非我们人工备份下来(或者基于容器创建新的镜像)。能否可以让容器进程持久化的数据保存在主机上呢?这样即使容器删除了,数据还在。

2)当我们在开发一个web应用时,开发环境是在主机本地,但运行测试环境是放在docker容器上。

这样的话,我在主机上修改文件(如html,js等)后,需要再同步到容器中。这显然比较麻烦。

3)多个容器运行一组相关联的服务,如果他们要共享一些数据怎么办?

对于这些问题,我们当然能想到各种解决方案。而docker本身提供了一种机制,可以将主机上的某个目录与容器的某个目录(称为挂载点、或者叫卷)关联起来,容器上的挂载点下的内容就是主机的这个目录下的内容,这类似linux系统下mount的机制。 这样的话,我们修改主机上该目录的内容时,不需要同步容器,对容器来说是立即生效的。 挂载点可以让多个容器共享。

具体的机制。

一、通过docker run命令

1、运行命令:docker run --name test -it -v /home/xqh/myimage:/data ubuntu /bin/bash

其中的 -v 标记 在容器中设置了一个挂载点 /data(就是容器中的一个目录),并将主机上的 /home/xqh/myimage 目录中的内容关联到 /data下。

这样在容器中对/data目录下的操作,还是在主机上对/home/xqh/myimage的操作,都是完全实时同步的,因为这两个目录实际都是指向主机目录。

2、运行命令:docker run --name test1 -it -v /data ubuntu /bin/bash

上面-v的标记只设置了容器的挂载点,并没有指定关联的主机目录。这时docker会自动绑定主机上的一个目录。通过docker inspect 命令可以查看到。

xqh@ubuntu:~/myimage$ docker inspect test1
[
{"Id": "1fd6c2c4bc545163d8c5c5b02d60052ea41900a781a82c20a8f02059cb82c30c",
............................."Mounts": [{"Name": "0ab0aaf0d6ef391cb68b72bd8c43216a8f8ae9205f0ae941ef16ebe32dc9fc01","Source": "/var/lib/docker/volumes/0ab0aaf0d6ef391cb68b72bd8c43216a8f8ae9205f0ae941ef16ebe32dc9fc01/_data","Destination": "/data","Driver": "local","Mode": "","RW": true}],

上面 Mounts下的每条信息记录了容器上一个挂载点的信息,“Destination” 值是容器的挂载点,"Source"值是对应的主机目录。

可以看出这种方式对应的主机目录是自动创建的,其目的不是让在主机上修改,而是让多个容器共享。

二、通过dockerfile创建挂载点

上面介绍的通过docker run命令的-v标识创建的挂载点只能对创建的容器有效。

通过dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。

还有一个区别是,通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。

#test
FROM ubuntu
MAINTAINER hello1
VOLUME [“/data1”,“/data2”]
上面的dockfile文件通过VOLUME指令指定了两个挂载点 /data1 和 /data2.

我们通过docker inspect 查看通过该dockerfile创建的镜像生成的容器,可以看到如下信息

    "Mounts": [{"Name": "d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21","Source": "/var/lib/docker/volumes/d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21/_data","Destination": "/data1","Driver": "local","Mode": "","RW": true},{"Name": "6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36","Source": "/var/lib/docker/volumes/6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36/_data","Destination": "/data2","Driver": "local","Mode": "","RW": true}],

可以看到两个挂载点的信息。

三、容器共享卷(挂载点)

docker run --name test1 -it myimage /bin/bash

上面命令中的 myimage是用前面的dockerfile文件构建的镜像。 这样容器test1就有了 /data1 和 /data2两个挂载点。

下面我们创建另一个容器可以和test1共享 /data1 和 /data2卷 ,这是在 docker run中使用 --volumes-from标记,如:

可以是来源不同镜像,如:

docker run --name test2 -it --volumes-from test1 ubuntu /bin/bash

也可以是同一镜像,如:

docker run --name test3 -it --volumes-from test1 myimage /bin/bash

上面的三个容器 test1 , test2 , test3 均有 /data1 和 /data2 两个目录,且目录中内容是共享的,任何一个容器修改了内容,别的容器都能获取到。

四、最佳实践:数据容器

如果多个容器需要共享数据(如持久化数据库、配置文件或者数据文件等),可以考虑创建一个特定的数据容器,该容器有1个或多个卷。

其它容器通过–volumes-from 来共享这个数据容器的卷。

因为容器的卷本质上对应主机上的目录,所以这个数据容器也不需要启动。

如: docker run --name dbdata myimage echo “data container”

说明:有个卷,容器之间的数据共享比较方便,但也有很多问题需要解决,如权限控制、数据的备份、卷的删除等。这些内容后续文章介绍。

dockerfile volume相关推荐

  1. Docker(五):Docker Volume

    一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即***数据不随着Container的结束而结束***),需要将数据从宿主机挂载到容器中.目前Do ...

  2. Docker技术入门与实战 第二版-学习笔记-7-数据管理(volume)

    Docker 数据管理 为什么要进行数据管理呢?因为当我们在使用container时,可能会在里面创建一些数据或文件,但是当我们停掉或删除这个容器时,这些数据或文件也会同样被删除,这是我们并不想看见的 ...

  3. dockerfile 执行原理_docker笔记2_原理解析和dockerfile简单理解

    Docker 的镜像原理 镜像是一种轻量级.可执行的独立软件包,用来打包运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件. 官方解释 Uni ...

  4. docker之容器数据卷

    目录 1.使用volume添加数据卷 2.dockerFile添加数据卷 3.数据卷容器 4.dockerFile解析 4.1dockerfile解析过程 4.2 dockerfile保留关键字 介绍 ...

  5. 【区块链技术与应用】(一)

    技术胖 开启docker 使用systemctl start命令,开启Docker服务端. sudo systemctl start docker 创建容器后,如果查看这个容器的信息和状态那?这时候你 ...

  6. Docker快速入门,看这个就够了

    Docker快速入门 一.Docker介绍 1.1 Docker背景 1.2 Docker概念 1.3 Docker的优势 1.4 Docker的三个基本概念 二.Docker的安装和使用 2.1 安 ...

  7. dind(docker in docker)镜像-使用Docker学习Docker

    文章目录 使用Docker学习Docker 一.搭建演示环境 二.关联基础 docker image 文件系统 什么是image layer Dockerfile VOLUME(数据卷) 指令 Vol ...

  8. docker镜像和仓库

    文章目录 一.docker镜像 1.镜像的分层结构 (1).分层结构案例 (2).容器层详解 2.镜像的构建 (1). 创建一个Dockerfile (2).构建镜像 (3).查看镜像的分层结构 (4 ...

  9. 史上最详细的docker学习手册,请收藏!

    大家好,我是飘渺,今天我们来学习一下Docker! 一.docker入门 docker的安装及入门示例 环境准备:docker需要安装在centos7 64位系统上:docker要求系统内核在3.10 ...

最新文章

  1. 高文院士:中国在AI领域有哪些长板和短板
  2. SpringtBoot+SpringSecurity+Jwt+MyBatis整合实现用户认证以及权限控制
  3. windows环境下Oracle数据库冷备份和恢复
  4. 用Java编写约分最简公式,2013年Java方向C组第五题
  5. [转帖]外壳命名空间扩展
  6. python函数示例_带Python示例的complex()函数
  7. 简单粗暴地理解js原型链--js面向对象编程
  8. 寺冈labelnet使用说明_基于imagenet数据集的ResNet50模型训练示例
  9. python接口自动化(四十二)- 项目架构设计之大结局(超详解)
  10. 全局变量定义的时候左侧加了static_c语言中static 用法
  11. java 定义全局变量_都说变量有七八种,到底谁是 Java 的亲儿子
  12. 深入浅出工厂设计模式
  13. 关于彻底卸载流氓 “趋势科技防毒网络版客户端”最详细步骤,亲测有效
  14. Vue开发环境的搭建
  15. 题目 1035: [编程入门]自定义函数之字符类型统计
  16. 宽高变化动画代码,旋转动画代码(HTML5)
  17. 计算机专业选修课怎么选比较好,你知道怎么选AP课程吗?附AP不同专业方向的选课建议...
  18. python取出数组大于某值_Python替换NumPy数组中大于某个值的所有元素实例
  19. WORD插入摄氏华氏度及换算
  20. XMind商业思维导图——市场营销!

热门文章

  1. 信号检测与估计理论_论文解读 | 利用脑功能连接实现疲劳驾驶检测
  2. 如何提升会议体验感和氛围感?
  3. 空间大地测量与GPS导航定位时间系统相互转换,格里高利时通用时儒略日,GPS时,年积日相互转换
  4. 【大数据面试题】(一)Hadoop 相关面试题总结
  5. Akamai JS _abck sensor_data 源码解读第一天 纵观全文(2)
  6. 港科夜闻|香港科技大学(广州)与广东联通签署多方位战略合作协议
  7. C++对象构建与使用,error: taking address of temporary [-fpermissive]
  8. 与省市级联的市县——根据省/直辖市显示对应的市县
  9. 【嵌入式】7段数码管引脚(2019版开发板)
  10. STM32---ucosii和ucosiii