在介绍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
# volume指令
# Dockerfile中CMD和ENTRYPOINT命令详解
# 编写最佳的Dockerfile的方法
# 详解Dockerfile 中的 COPY 与 ADD 命令
# Docker中镜像构建文件Dockerfile与相关命令的详细介绍
# 详解利用Dockerfile构建mysql镜像并实现数据的初始化及权限设置
# Dockerfile中的ENV指令的具体使用详解
# Docker Dockerfile的使用实例
# Dockerfile制作官方Tomcat镜像及镜像使用详解
# Dockerfile中常用命令汇总
# 利用Dockerfile部署SpringBoot项目的方法
# 利用Dockerfile制作java运行环境的镜像的方法步骤
# docker Dockerfile文件制作自己的镜像的方法
# Dockerfile 指令 ADD 和 COPY介绍
# Dockerfile中multi-stage(多阶段构建)详解
# Docker 基础之Dockerfile命令详解
# 使用Dockerfile部署nodejs服务的方法步骤
# Dockerfile指令详解
# Docker构建文件Dockerfile简单入门
# 镜像
# 多个
# 都是
# 是在
# 可以看到
# 这样的话
# 这是
# 也不
# 我在
# 放在
# 有个
# 目录下
# 还在
# 有很多
# 不需要
# 都能
# 目录中
# 这两个
# 这类
# 但也
相关文章:
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
清除minerd进程的简单方法
如何通过远程VPS快速搭建个人网站?
如何通过多用户协作模板快速搭建高效企业网站?
临沂网站制作企业,临沂第三中学官方网站?
建站主机服务器选购指南:轻量应用与VPS配置解析
家庭建站与云服务器建站,如何选择更优?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
如何高效完成自助建站业务培训?
相册网站制作软件,图片上的网址怎么复制?
制作宣传网站的软件,小红书可以宣传网站吗?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
高端智能建站公司优选:品牌定制与SEO优化一站式服务
建站之星与建站宝盒如何选择最佳方案?
网站设计制作企业有哪些,抖音官网主页怎么设置?
宝塔新建站点为何无法访问?如何排查?
宝塔Windows建站如何避免显示默认IIS页面?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
招贴海报怎么做,什么是海报招贴?
一键网站制作软件,义乌购一件代发流程?
长沙企业网站制作哪家好,长沙水业集团官方网站?
如何在建站之星绑定自定义域名?
如何在云主机快速搭建网站站点?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
建站之星安装后如何自定义网站颜色与字体?
建站之星如何配置系统实现高效建站?
如何在宝塔面板创建新站点?
,石家庄四十八中学官网?
山东云建站价格为何差异显著?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
如何在阿里云虚拟服务器快速搭建网站?
免费网站制作appp,免费制作app哪个平台好?
如何用y主机助手快速搭建网站?
平台云上自主建站:模板化设计与智能工具打造高效网站
头像制作网站在线制作软件,dw网页背景图像怎么设置?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星logo尺寸如何设置最合适?
企业微网站怎么做,公司网站和公众号有什么区别?
如何在云指建站中生成FTP站点?
如何快速生成ASP一键建站模板并优化安全性?
如何选择网络建站服务器?高效建站必看指南
建站之星免费版是否永久可用?
如何在新浪SAE免费搭建个人博客?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
临沂网站制作公司有哪些,临沂第四中学官网?
济南网站制作的价格,历城一职专官方网站?
巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成
*请认真填写需求信息,我们会在24小时内与您取得联系。