写点什么

存储在容器中是如何工作的

  • 2015-09-30
  • 本文字数:1471 字

    阅读完需:约 5 分钟

将应用程序运行在容器中已经成为一种趋势,但是容器的概念并不是才有的。容器的起源实际可以追溯到大型机,这项技术在最近逐渐成熟,并以惊人的速度获得用户的兴趣和接受。

容器被设计成运行在操作系统之上的虚拟实例,它包含了应用程序在用户空间(user space)所需的所有内容。同时,容器提供一定的隔离性,使得运行在同一个操作系统之上的容器看起来是独立的,并且拥有整个操作系统。这种隔离还支持容器和外接交互。

目前有少数针对容器的备份软件,有没有一种方法能够使用任何备份软件来备份容器呢?

为了实现写时复制(copy-on-write),容器会使用一种名为叠加(overlay)文件系统的特性。即需要对根镜像进行修改时,容器会利用这一特性,将变更内容写入到独立区域并“覆盖”原有内容。这种修改通常都是瞬时的,也就是说,通常情况下,当容器删除时,这些修改也将不复存在。因此,容器默认是没有永久存储的。

为了解决存储问题,像 Docker 这样的工具,提供了两个新的特性来获得更加持久化的存储:Docker 卷和数据容器。

Docker 卷允许将数据保存在容器的启动卷之外。容器可以在启动时,通过“-v”开关挂载多个独立的数据卷。该参数会在Docker 的配置目录(/var/lib/docker)中创建一个实体,配置内容会保存在/var/lib/docker/volumes 目录中。每个子目录由卷的UUID(universally unique identifier)命名,其中包含该卷的配置,如卷ID、路径、读写权限等。卷的数据内容存储在/var/lib/docker/vfs/dir 目录中,同样由卷的UUID 命名。

卷中的数据可以在主机上进行读写,并且有着标准的文件权限。然而,使用卷的方式,有其优点和缺点。优点是由于采用标准文件系统,对容器的数据的备份、复制、移动等操作,可以在主机操作系统上完成。缺点是卷的名字使用了UUID,并且和容器ID 关联,导致卷路径很难和容器名称关联起来。目前,Docker 提供了 docker cp命令,可以将文件在主机和容器之前复制。

通过挂载外部卷的方式,还可以将存储放到 NFS(Network File System)或者 LUN(Logical Unit Number)上,这样可以方便的对容器数据进行备份。

另一种方式是采用数据容器。数据容器像 Docker 内部的 NFS 服务器一样,可以通过“–volumes-from”开关在容器启动时设置关联的数据容器。使用这种方式的优点是将应用数据独立抽取出来,而不必关心它实际存放的位置。

当然,使用卷和数据容器,可能会遇到一些问题:

  • 孤立的存储:当前一般容器默认的设置是容器删除之后保留容器使用过的存储。这样可能会导致一些卷已经没有容器引用,但是要删除它们成本又非常高,需要遍历主机上所有容器的配置,确保没有容器还在使用才能执行删除。
  • 数据安全:挂载的卷除了操作系统本身的文件权限控制,没有其他安全措施。这些文件可能会被主机上的进程修改,同时容器中的进程访问共享文件,也需要按照主机上的文件权限设置进行配置(如用户和组信息)。
  • 数据完整性:共享数据在数据完整性上无法保证,容器中的应用程序需要自己控制。同时数据备份需要容器或者主机上的应用程序来完成。

最后,容器存储上还有一个问题,就是不同主机上容器之间的存储无法共享。即目前容器可以使用外部存储,但是无法使用在其他主机上的数据容器。目前, ClusterHQ 公司开发了 flocker ,试图解决这一问题。也希望 Docker 官方能够在存储管理上提供分布式解决方案。


感谢魏星对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-09-30 19:003639

评论

发布
暂无评论
发现更多内容

【收藏】2021年Android跳槽大厂必备宝典(1),android教程零基础入门

android 程序员 移动开发

【面试准备】JavaWeb部分,android webview

android 程序员 移动开发

【阿里P8大牛教你Android入门之路(java篇,移动端开发工程师转型

android 程序员 移动开发

一位普通Android程序员呕心沥血八次大小厂的面试复盘总结,收藏一波扩展知识体系!

android 程序员 移动开发

一文带你搞懂Android的-Binder-机制,flutterandroid最低版本

android 程序员 移动开发

【扔物线】消失这半年,讲的真详细

android 程序员 移动开发

【译】使用Kotlin从零开始写一个现代Android-项目-Part1

android 程序员 移动开发

【译】彻底理解 Android 中的阴影(1),apk优化签名

android 程序员 移动开发

【透镜系列】看穿 _ 触摸事件分发 _,android界面开发框架

android 程序员 移动开发

【收藏】2021年Android跳槽大厂必备宝典(2),移动混合开发技术

android 程序员 移动开发

【译】使用Kotlin从零开始写一个现代Android-项目-Part1(1)

android 程序员 移动开发

一个Android开发6年程序员的年终面试总结,2021无畏艰难险阻,迎风潇洒前行

android 程序员 移动开发

【自学Flutter】32 交错动画的使用,掌握这个提升路径,

android 程序员 移动开发

一个非常好用的页面引导工具guideView,html5移动开发框架

android 程序员 移动开发

一场赛跑引起的并发知识,flutterrow换行

android 程序员 移动开发

一位Android程序员入坑Flutter后整理出一份超详细的学习笔记

android 程序员 移动开发

一封给Android开发者 UI 自动化测试上手指南,前方高能

android 程序员 移动开发

【收藏】2021年Android跳槽大厂必备宝典,阿里大牛整理

android 程序员 移动开发

【自学Flutter】1,详解Android架构进阶面试题

android 程序员 移动开发

华为云·核心伙伴开发者训练营第七期开营,共赴产业云美好明天!

华为云开发者联盟

华为云 鲁班会

【面试必会】全网最具深度的三次握手,腾讯Android开发面试记录

android 程序员 移动开发

【设计思想解读开源框架】热修复设计-,卑微打工人

android 程序员 移动开发

恒源云(GpuShare)_未闻Prompt名(论文学习笔记)

恒源云

深度学习

【议程公布】2021年MongoDB中文社区南京技术沙龙

MongoDB中文社区

mongodb

一文了解AndroidStudio3-4的全部更新,androidapp开发从入门到精通

android 程序员 移动开发

【最强】Android 项目集成 Flutter 实战分享,android开发笔试题

android 程序员 移动开发

一个view事件分发,面试官6连问直击灵魂,我被虐的体无完肤

android 程序员 移动开发

【译】彻底理解 Android 中的阴影,三年经验Android开发面经总结

android 程序员 移动开发

Cube 技术解读 | Cube 卡片技术栈详解

阿里巴巴终端技术

支付宝 客户端开发 卡片服务 cube 动态化

一个8年Android 开发想转后端,还来得及嘛?,android开发菜鸟教程

android 程序员 移动开发

一个中专生的逆袭之旅(如何做到收到阿里、腾讯、滴滴等面试邀请)

android 程序员 移动开发

存储在容器中是如何工作的_语言 & 开发_金灵杰_InfoQ精选文章