设为首页 收藏本站
查看: 1118|回复: 0

[经验分享] Data Volume 之 bind mount

[复制链接]

尚未签到

发表于 2017-12-6 09:44:12 | 显示全部楼层 |阅读模式
storage driver 和 data volume 是容器存放数据的两种方式,上一节我们学习了 storage driver,本节开始讨论 Data Volume。


  Data Volume 本质上是 Docker Host 文件系统中的目录或文件,能够直接被 mount 到容器的文件系统中。Data Volume 有以下特点:

  •   Data Volume 是目录或文件,而非没有格式化的磁盘(块设备)。
  •   容器可以读写 volume 中的数据。
  •   volume 数据可以被永久的保存,即使使用它的容器已经销毁。
  好,现在我们有数据层(镜像层和容器层)和 volume 都可以用来存放数据,具体使用的时候要怎样选择呢?考虑下面几个场景:

  •   Database 软件 vs Database 数据
  •   Web 应用 vs 应用产生的日志
  •   数据分析软件 vs input/output 数据
  •   Apache Server vs 静态 HTML 文件
  相信大家会做出这样的选择:

  •   前者放在数据层中。因为这部分内容是无状态的,应该作为镜像的一部分。
  •   后者放在 Data Volume 中。这是需要持久化的数据,并且应该与镜像分开存放。
  还有个大家可能会关心的问题:如何设置 voluem 的容量?
  因为 volume 实际上是 docker host 文件系统的一部分,所以 volume 的容量取决于文件系统当前未使用的空间,目前还没有方法设置 volume 的容量。
  在具体的使用上,docker 提供了两种类型的 volume:bind mount 和 docker managed volume。
bind mount
  bind mount 是将 host 上已存在的目录或文件 mount 到容器。
  例如 docker host 上有目录 $HOME/htdocs:
DSC0000.jpg

  通过 -v 将其 mount 到 httpd 容器:

DSC0001.jpg

  -v 的格式为 <host path>:<container path>。/usr/local/apache2/htdocs 就是 apache server 存放静态文件的地方。由于 /usr/local/apache2/htdocs 已经存在,原有数据会被隐藏起来,取而代之的是 host $HOME/htdocs/ 中的数据,这与 linux mount 命令的行为是一致的。
DSC0002.jpg

  curl 显示当前主页确实是 $HOME/htdocs/index.html 中的内容。更新一下,看是否能生效:
DSC0003.jpg

  host 中的修改确实生效了,bind mount 可以让 host 与容器共享数据。这在管理上是非常方便的。
  下面我们将容器销毁,看看对 bind mount 有什么影响:
DSC0004.jpg

  可见,即使容器没有了,bind mount 也还在。这也合理,bind mount 是 host 文件系统中的数据,只是借给容器用用,哪能随便就删了啊。
  另外,bind mount 时还可以指定数据的读写权限,默认是可读可写,可指定为只读:
DSC0005.jpg

  ro 设置了只读权限,在容器中是无法对 bind mount 数据进行修改的。只有 host 有权修改数据,提高了安全性。
  除了 bind mount 目录,还可以单独指定一个文件:
DSC0006.jpg

  使用 bind mount 单个文件的场景是:只需要向容器添加文件,不希望覆盖整个目录。在上面的例子中,我们将 html 文件加到 apache 中,同时也保留了容器原有的数据。
  使用单一文件有一点要注意:host 中的源文件必须要存在,不然会当作一个新目录 bind mount 给容器。
  mount point 有很多应用场景,比如我们可以将源代码目录 mount 到容器中,在 host 中修改代码就能看到应用的实时效果。再比如将 mysql 容器的数据放在 bind mount 里,这样 host 可以方便地备份和迁移数据。
  bind mount 的使用直观高效,易于理解,但它也有不足的地方:bind mount 需要指定 host 文件系统的特定路径,这就限制了容器的可移植性,当需要将容器迁移到其他 host,而该 host 没有要 mount 的数据或者数据不在相同的路径时,操作会失败。
  移植性更好的方式是 docker managed volume,下一节我们讨论。
  有个好消息:出版社现在搞促销,《每天5分钟玩转OpenStack》全网最低价销售,有兴趣的同学可以访问 https://detail.tmall.com/item.htm?id=543416839771 了解详情 。
DSC0007.jpg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-421087-1-1.html 上篇帖子: Docker学习实践 下篇帖子: 让docker中的mysql启动时自动执行sql文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表