写点什么

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

  • 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:003786

评论

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

OpenHarmony设备开发从零到一

鸿蒙之旅

OpenHarmony 三周年连更

容量成本性能全都要有, Redis 容量版 PegaDB 设计与实践

Baidu AICLOUD

2023-05-06:X轴上有一些机器人和工厂。给你一个整数数组robot,其中robot[i]是第i个机器人的位置 再给你一个二维整数数组factory,其中 factory[j] = [posit

福大大架构师每日一题

golang rust 福大大

Django笔记二十二之多数据库操作

Hunter熊

Python django database

Go常用设计模式(下)

闫同学

三周年连更

在这样的公司工作没意义

Jadedev

职场 职场经验 职场发展

Go常用设计模式(中)

闫同学

三周年连更

云原生应用使用的云服务组件介绍

穿过生命散发芬芳

三周年连更 云服务组件

Pratt Parsing - 自顶向下的算符优先级

乌龟哥哥

三周年连更

一套前后台全部开源的H5商城送给大家

越长大越悲伤

开源 java‘

什么是人工智能领域模型的 Presence Penalty 参数?

汪子熙

人工智能 机器学习 深度学习 强化学习 三周年连更

Java IO流详解

timerring

Java

在啥样的公司工作没意义

Jadedev

职场 职场经验 职场发展

云原生文件存储 CFS 线性扩展到千亿级文件数,百度沧海·存储论文被 EuroSys 2023 录用

Baidu AICLOUD

文件存储 元数据 posix

架构训练营模块一作业

Geek_3d7c4d

架构训练营

软件测试 | MTV开发模式

测吧(北京)科技有限公司

测试

必知必会的JavaScript前端面试题篇(一),不看后悔!

Immerse

Java实现坦克大战2.0

timerring

Java

Golang中如何使用Singleflight库进行并发请求合并

Jack

深入理解 TypeScript 的 type 以及 type 与 interface 和 class 的区别

Lee Chen

typescript

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