本文大部分内容,摘自docker官方文档。Understand images, containers, and storage drivers.
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。它使开发人员能够快速创建简单的、现成的运行容器化应用;使管理和部署应用程序更加容易。
要想真正的理解docker的存储驱动,需要先了解docker镜像是如何构建和存储,以及容器如何使用镜像。
镜像与分层
下面是ubuntu:15.04的镜像分层。一共是4层,每一层都由一些只读并且描绘系统区别的文件组成。
上下两张图对比,可以清晰的看到镜像分层关系(上图是官方文档图片,可以看到镜像大小进行了精简,但是ubuntu:15.04镜像的分层结构没变)。
Docker存储驱动的作用就是:将这些分层的镜像文件堆叠起来,并且提供统一的视图。使container的文件系统看上去和我们普通的文件系统没什么区别。
当创建一个新的容器的时候,实际上是在镜像的分层上新添加了一层container layer(容器层)。之后所有对容器产生的修改,实际都只影响这一层。
注意
容器层:读写层(可写层)
镜像层:只读层
容器与分层
镜像与容器的一个主要区别就是,是否具有顶层的读写层(可写层)。对于一个容器的数据新增,修改,都存储在可写层。当你删除一个容器的时候,可写层也将被删除(注意:可写层与数据卷的区别)。然而镜像层是保持不变的。
下图展示了,多个容器共享一个镜像。镜像层是只读层,不变的。多个容器层在同一个镜像层之上,并且相互独立,互相不影响。
容器
docker 存储驱动的职责就是将镜像层和可写容器层管理起来。不同的驱动实现管理的方式也不一致。实现容器与镜像管理的两个关键技术就是可堆叠的镜像层和copy-on-write (CoW,写时复制)。
简述写时复制
举个例子:小文和小武由不同的老师上数学课,但是他们只有一个习题册。小文的作业是,练习册的第十一页。为了不影响到小武,小文的做法是将第11页copy,完成作业后上交。这就是一个典型的写时复制
第一次修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层。该文件的只读版本依然存在,但是已经被读写层中的该文件副本所隐藏。
了解了写时复制,就应该注意一个问题:如果第一次修改镜像层内包含的文件,文件的size很大。会造成大量的磁盘IO的开销。所以不建议将需要修改的大文件,集成到镜像内。可以采用数据卷的方式。
数据卷与存储驱动
当一个容器删除的时候,写入该容器的所有数据将被删除(除了保存在数据卷中的数据)
数据卷是挂载到容器的,docker宿主机上的一个目录或文件。对数据卷的文件读写是不受存储驱动控制的,接近于本地文件系统读写速度。可以挂载多个数据卷到一个容器。也可以多个容器共享一个或多个数据卷。
如图所示:一个docker宿主机运行2个容器。每个容器有自己的存储空间,存储于宿主机本地文件系统 /var/lib/docker/… 另外有一个共享的数据卷在 /data.挂载到两个容器内实现共享。
如何选择存储驱动
docker目前支持的存储驱动有:OverlayFS,AUFS,Btrfs,Device Mapper,VFS,ZFS。
docker的存储驱动目前并没有一个通用的,完美的,适用于所有环境的存储驱动。所以需要根据自己的环境来有所选择。
存储驱动在不断的改进与发展
如果从稳定性上的考量,在安装docker的时候会默认根据你的系统环境配置选择一个存储驱动。通常来说使用这个默认的驱动将减少你遇到bug的机会。
如果你的团队使用过RHEL及其相关分支,你可能有关于LVM和Device Mapper的经验。这时建议你使用devicemapper存储驱动。
查看当前docker 引擎的存储驱动
如图所示:存储驱动类型为aufs,宿主机文件系统的格式为extfs。
存储驱动与宿主机文件格式
设置docker的存储驱动
现状与未来
许多人认为OverlayFS是Docker存储驱动的未来。然而,它仍然不够成熟。稳定性上也不如一些成熟的存储驱动,如:AUFS,devicemapper.
下面的图表,显示了每个存储驱动的优势以及不足,请参考:
具体到某一个存储驱动
这部分介绍具体的存储驱动的实现方式,对于大数据技术研究者可以参考学习。对于应用实践者,可以暂时止步。
相关推荐
例如,`libseccomp`库对于Docker的安全策略至关重要,而`device-mapper`驱动则是Docker存储驱动的基础。在RHEL 6上安装这些依赖可能需要手动操作或使用第三方仓库。 文件列表中的`readme`文件通常会包含安装步骤的...
因此,你需要提前准备一个包含最新Docker安装包的USB驱动器或其它存储设备。你可以从Docker官方网站下载适用于Ubuntu 14.04的`.deb`安装包,或者从有网络连接的机器上下载并传输到离线机器上。文件名可能是如`docker...
如`yum-utils`(用于处理包管理和仓库操作)、`device-mapper-persistent-data`和`libdevmapper`(用于设备映射器支持,这是Docker存储驱动的一部分),以及`git`(如果需要从GitHub等源码仓库安装或更新Docker)。...
在这个文件中,你可以设置Docker的启动参数,如默认的存储驱动、日志驱动等。例如,如果你的系统支持overlay2但默认使用aufs,你可以通过修改`daemon.json`来切换存储驱动。确保配置正确无误后,重新启动Docker服务...
文档中还提到了Docker Machine的未来路线图,包括将主机存储集中化、与Docker Swarm的集成以及更多的驱动支持。这表明Docker Machine在持续发展和改进中,旨在为用户提供更加完善的Docker环境管理体验。 从上述描述...
总结来说,通过设置Docker的GELF日志驱动并将日志发送到Logstash,我们可以有效地收集和处理Docker容器的日志。这种方式允许我们进行更复杂的数据处理,如日志解析、过滤、聚合,以及将日志数据导入Elasticsearch...
4. **配置 Docker**:可能需要修改系统配置文件(如 `/etc/default/docker` 或 `/etc/systemd/system/docker.service.d` 下的配置),设置 Docker 的启动选项,如数据存储目录等。 5. **启动 Docker**:最后,通过...
在安装Docker之后,你可能还需要配置相关的服务和设置,例如创建Docker用户组,启动并设置Docker服务开机启动,以及设置Docker的存储驱动(如devicemapper)。此外,你可以编写额外的脚本来自动化这些任务,以实现...
4. **存储驱动**: 使用 AUFS(Advanced Union File System)作为默认的存储驱动,提供分层和只读层的特性,提高磁盘利用率。 5. **SSH访问**: 提供SSH访问,方便用户通过命令行与Boot2Docker交互。 6. **自动更新*...
本文将详细介绍如何针对新创建的以及已存在的Docker容器,通过调整配置来限制日志文件的大小和数量,以达到有效管理和节约存储空间的目的。 #### 新容器日志管理 对于新创建的Docker容器,可以通过修改或添加系统...
接着,我们需要安装Docker的依赖包,如`yum-utils`和`device-mapper-persistent-data`,这些工具可以帮助我们正确配置Docker所需的存储驱动: ```bash sudo yum install -y yum-utils device-mapper-persistent-...
在使用docker-s3-volume时,我们需要在compose文件中定义一个新的服务,并指定使用s3数据卷驱动: ```yaml version: '3' services: my_service: image: my_image volumes: - my_volume:/path/in/container ...
- **Devicemapper:** 这是一种早期的存储驱动程序,它是 Linux 内核中用于处理从逻辑设备到物理设备映射的机制。Devicemapper 支持块级别的 Copy-on-write 特性,即只有在数据被修改时才会创建新的数据块,从而提高...
总结起来,搭建人工智能环境,尤其是涉及到GPU加速的部分,需要对操作系统、驱动程序、Docker容器和存储管理有深入的理解。遵循上述步骤,你可以在CentOS Linux服务器上构建一个高效、稳定的人工智能开发平台,充分...
无论是增加新的网络驱动、存储驱动还是实现自定义的构建步骤,插件都能够轻松实现这些目标。 2. **服务化**:插件以服务的形式运行,并与Docker Engine紧密集成。这意味着插件可以在Docker平台上无缝运行,无需...
总结来说,企业Docker容器云方案通过JDOS和CAP构建弹性计算架构,实现了资源的高效利用、自动化运维和数据驱动的精细化运营。该方案不仅可以提升IT系统的弹性和响应速度,还能降低运营成本,适应不断变化的业务需求...
Docker数据卷是容器持久化数据的关键,通过命名卷和挂载卷两种方式,可以根据实际需求灵活管理和存储容器内的数据。命名卷提供了可重用性和跨容器共享的能力,而挂载卷则方便快速地利用宿主机资源。了解并熟练掌握这...
数据卷是 Docker 提供的一种存储机制,它允许用户在容器内部创建一个特殊的目录,这个目录直接连接到 Docker 的存储驱动,绕过容器的文件系统。数据卷有以下几个关键特性: 1. **可共享和重用**:数据卷可以在多个...