dockerfile volume
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相关推荐
- Docker(五):Docker Volume
一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即***数据不随着Container的结束而结束***),需要将数据从宿主机挂载到容器中.目前Do ...
- Docker技术入门与实战 第二版-学习笔记-7-数据管理(volume)
Docker 数据管理 为什么要进行数据管理呢?因为当我们在使用container时,可能会在里面创建一些数据或文件,但是当我们停掉或删除这个容器时,这些数据或文件也会同样被删除,这是我们并不想看见的 ...
- dockerfile 执行原理_docker笔记2_原理解析和dockerfile简单理解
Docker 的镜像原理 镜像是一种轻量级.可执行的独立软件包,用来打包运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件. 官方解释 Uni ...
- docker之容器数据卷
目录 1.使用volume添加数据卷 2.dockerFile添加数据卷 3.数据卷容器 4.dockerFile解析 4.1dockerfile解析过程 4.2 dockerfile保留关键字 介绍 ...
- 【区块链技术与应用】(一)
技术胖 开启docker 使用systemctl start命令,开启Docker服务端. sudo systemctl start docker 创建容器后,如果查看这个容器的信息和状态那?这时候你 ...
- Docker快速入门,看这个就够了
Docker快速入门 一.Docker介绍 1.1 Docker背景 1.2 Docker概念 1.3 Docker的优势 1.4 Docker的三个基本概念 二.Docker的安装和使用 2.1 安 ...
- dind(docker in docker)镜像-使用Docker学习Docker
文章目录 使用Docker学习Docker 一.搭建演示环境 二.关联基础 docker image 文件系统 什么是image layer Dockerfile VOLUME(数据卷) 指令 Vol ...
- docker镜像和仓库
文章目录 一.docker镜像 1.镜像的分层结构 (1).分层结构案例 (2).容器层详解 2.镜像的构建 (1). 创建一个Dockerfile (2).构建镜像 (3).查看镜像的分层结构 (4 ...
- 史上最详细的docker学习手册,请收藏!
大家好,我是飘渺,今天我们来学习一下Docker! 一.docker入门 docker的安装及入门示例 环境准备:docker需要安装在centos7 64位系统上:docker要求系统内核在3.10 ...
最新文章
- 高文院士:中国在AI领域有哪些长板和短板
- SpringtBoot+SpringSecurity+Jwt+MyBatis整合实现用户认证以及权限控制
- windows环境下Oracle数据库冷备份和恢复
- 用Java编写约分最简公式,2013年Java方向C组第五题
- [转帖]外壳命名空间扩展
- python函数示例_带Python示例的complex()函数
- 简单粗暴地理解js原型链--js面向对象编程
- 寺冈labelnet使用说明_基于imagenet数据集的ResNet50模型训练示例
- python接口自动化(四十二)- 项目架构设计之大结局(超详解)
- 全局变量定义的时候左侧加了static_c语言中static 用法
- java 定义全局变量_都说变量有七八种,到底谁是 Java 的亲儿子
- 深入浅出工厂设计模式
- 关于彻底卸载流氓 “趋势科技防毒网络版客户端”最详细步骤,亲测有效
- Vue开发环境的搭建
- 题目 1035: [编程入门]自定义函数之字符类型统计
- 宽高变化动画代码,旋转动画代码(HTML5)
- 计算机专业选修课怎么选比较好,你知道怎么选AP课程吗?附AP不同专业方向的选课建议...
- python取出数组大于某值_Python替换NumPy数组中大于某个值的所有元素实例
- WORD插入摄氏华氏度及换算
- XMind商业思维导图——市场营销!
热门文章
- 信号检测与估计理论_论文解读 | 利用脑功能连接实现疲劳驾驶检测
- 如何提升会议体验感和氛围感?
- 空间大地测量与GPS导航定位时间系统相互转换,格里高利时通用时儒略日,GPS时,年积日相互转换
- 【大数据面试题】(一)Hadoop 相关面试题总结
- Akamai JS _abck sensor_data 源码解读第一天 纵观全文(2)
- 港科夜闻|香港科技大学(广州)与广东联通签署多方位战略合作协议
- C++对象构建与使用,error: taking address of temporary [-fpermissive]
- 与省市级联的市县——根据省/直辖市显示对应的市县
- 【嵌入式】7段数码管引脚(2019版开发板)
- STM32---ucosii和ucosiii