开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 22天,点击查看活动详情
Docker容器化技术相信大伙都听说过,有着出色的性能、沙箱化的机制。为开发和运维提供了便捷的支持,来帮助我们实现快速集成快速交付。当然这一切都要归功于Docker出色的架构设计。今天我们就来浅谈一下Docker中的存储体系。
我们知道容器是由若干镜像层+最上层的可写层组成,这种分层结构最大特性就是Copy on Write,即:
- 新数据会存储在最上层容器层
- 修改现有数据是先从镜像层将数据复制到容器层,然后修改后就保存在容器层,镜像层不变
- 多层中有相同文件,用户只能看到最上面层的文件
分层机构使得容器的创建、共享变得非常高效,这些都要归功于Docker storage driver实现了将堆叠的多层数据合并成一个统一视图提供给用户。
Docker中有两种存储数据的方式:
- (1)由操作系统的storage driver来管理我们的镜像/容器层数据
- (2)利用data volume技术
storage driver
Docker支持的storage driver主要由AUFS、Device Mapper、Btrfs、OverlayFS、VFS、ZFS。它们都能实现分层的架构且具有各自的特色。那么我们如何在这些选项中找到适合我们的storage driver呢?官方的建议是:优先选择Linux发行版默认的storage driver,不过Docker安装时也会根据系统来选择最合适的driver。通常默认的driver是最好的,因为默认的driver在发行版上已经经过大量的测试,稳定性方面可以不用担心。
我们可以通过docker info来查看我们服务器上docker安装的时选择的driver是什么,可以看到Centos操作系统默认的driver是Device Mapper。通常如果我们不需要进行持久化数据,那么直接将数据交给storage driver来维护就可以了,但如果需要部署的应用有持久化的需求那就得考虑Data Volume。
Data Volume
Data Volume实际上是Docker Host文件系统中的目录或文件,能直接被mount到容器的文件系统中。Data Volume的特点如下:
- Data Volume是文件或目录
- 容器可以读写volume中数据
- volume中的数据可以永久存储,即使容器被销毁
一般我们都是通过运行容器时附加 -v告诉docker需要一个Data Volume,并将其mount到容器内,例如:
docker run -d -p 80:80 -v ~/htdocs/index.html:/usr/local/apache2/htdocs/index.html httpd
mount的对象既可以是文件也可以是目录,mount文件时需要注意的就是host中源文件必须要存在,不然就会被当作是一个新目录mount给容器。