Docker storage driver(十四)

本文涉及的产品
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
简介:

一、storage driver 作用

正常情况下,只有很少量的数据被写入到容器最上层的写入层,并且通过 volume 来写数据,然而我们也会遇到一些情况需要我们可以直接写入到容器的写入层,这我们就需要到了 storage driver 来帮忙。

Docker 使用一些列不同的 storage driver 来管理镜像层和容器层,这些 storage driver 不同于前面说到的 volume。

为了有效的使用 storage drivers,我们可以简单温习一下 storage driver 管理的镜像层和容器层的工作情况。

1、Images and layers

我们可以通过下面的 Dockerfile 文件来理解镜像的分层。

FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py

Docker storage driver(十四)

  • 一个镜像是有若干镜像层组成。
  • Dockerfile 中的每条指令都会生成一个镜像层,除了最上面的一层之外,其他的都是只读的。
  • 最上一层主要是镜像运行时的一些命令。
  • 每一层只是与它之前的层有一些不同,层层堆叠在一起。
  • 创建容器的时候,只是在底层上添加一个新的可写层。这一层通常称为“容器层”。

2、Container and layers

容器和镜像最大的区别在于最上层的可写层,所有对容器的新增或者修改,都会存在在可写层,当容器被删除的时候,可写层的数据也就随之被删除了,然后镜像的不会改变。

这是因为每个容器都有自己的可写层,所有的更改都会存储在容器的可写层,多个容器可以共享对同一底层映像的访问,但他们都拥有自己的数据状态,如下图所示:

Docker storage driver(十四)

Copy-on-Write

容器由最上面一个可写的容器层,以及若干只读的镜像层组成,容器的数据就存放在这些层中。这样的分层结构最大的特性是 Copy-on-Write:

  1. 新数据会直接存放在最上面的容器层。
  2. 修改现有数据会先从镜像层将数据复制到容器层,修改后的数据直接保存在容器层中,镜像层保持不变。
  3. 如果多个层中有命名相同的文件,用户只能看到最上面那层中的文件。

分层结构使镜像和容器的创建、共享以及分发变得非常高效,而这些都要归功于 Docker storage driver。正是 storage driver 实现了多层数据的堆叠并为用户提供一个单一的合并之后的统一视图。

3、Data volumes and the storage driver

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

  • Data Volume 是目录或文件,而非没有格式化的磁盘(块设备)。
  • 容器可以读写 volume 中的数据。
  • volume 数据可以被永久的保存,即使使用它的容器已经销毁。
  • Data volumes 不被 storage driver 所管理。
  • 对 data volume 的读写操作绕过 storage driver,以本地主机速度运行。

Docker storage driver(十四)

二、如何选择 storage driver

Docker 支持多种 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它们都能实现分层的架构,同时又有各自的特性。对于 Docker 用户来说,具体选择使用哪个 storage driver 是一个难题。

下表是官方根据不同的发行版支持推荐的 storage driver。

Linux 发行版 推荐的storage drivers
Docker CE on Ubuntu aufs, devicemapper, overlay2 (Ubuntu 14.04.4 or later, 16.04 or later), overlay, zfs, vfs
Docker CE on Debian aufs, devicemapper, overlay2 (Debian Stretch), overlay, vfs
Docker CE on CentOS devicemapper, vfs
Docker CE on Fedora devicemapper, overlay2 (Fedora 26 or later, experimental), overlay (experimental), vfs

不过 Docker 官方给出了一个简单的答案:
优先使用 Linux 发行版默认的 storage driver。

Docker 安装时会根据当前系统的配置选择默认的 driver。默认 driver 具有最好的稳定性,因为默认 driver 在发行版上经过了严格的测试。

运行docker info查看 Ubuntu 的默认 driver:

root@ubuntu:~# docker info

Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 19
Server Version: 17.09.0-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs

Redhat/CentOS 的默认 driver 是 Device Mapper,SUSE 则是 Btrfs。

对于某些容器,直接将数据放在由 storage driver 维护的层中是很好的选择,比如那些无状态的应用。无状态意味着容器没有需要持久化的数据,随时可以从镜像直接创建。

比如 busybox,它是一个工具箱,我们启动 busybox 是为了执行诸如 wget,ping 之类的命令,不需要保存数据供以后使用,使用完直接退出,容器删除时存放在容器层中的工作数据也一起被删除,这没问题,下次再启动新容器即可。

但对于另一类应用这种方式就不合适了,它们有持久化数据的需求,容器启动时需要加载已有的数据,容器销毁时希望保留产生的新数据,也就是说,这类容器是有状态的。这就需要我们使用 volume。

参考文档:https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/
https://docs.docker.com/engine/userguide/storagedriver/selectadriver/


     本文转自 wzlinux 51CTO博客,原文链接:http://blog.51cto.com/wzlinux/2047986,如需转载请自行联系原作者



相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3 )前置知识要求   课程大纲 第一章 了解数据仓库概念 初步了解数据仓库是干什么的 第二章 按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章 数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章 采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章 用户行为数据仓库 严格按照企业的标准开发 第六章 搭建业务数仓理论基础和对表的分类同步 第七章 业务数仓的搭建  业务行为数仓效果图  
相关文章
|
1月前
|
网络安全 Docker 容器
Docker常见问题1: driver failed programming external connectivity on endpoint
Docker常见问题1: driver failed programming external connectivity on endpoint
|
Docker 容器
docker: Error response from daemon: driver failed programming external connectivity on endpoint mysq
docker: Error response from daemon: driver failed programming external connectivity on endpoint mysq
|
jenkins Linux 网络安全
【Docker】 Error response from daemon: driver failed programming external connectivity on endpoint
【Docker】 Error response from daemon: driver failed programming external connectivity on endpoint
1588 0
【Docker】 Error response from daemon: driver failed programming external connectivity on endpoint
|
网络协议 应用服务中间件 Docker
Docker - 解决 Error response from daemon: driver failed programming external connectivity on endpoint tomcat9999
Docker - 解决 Error response from daemon: driver failed programming external connectivity on endpoint tomcat9999
3016 0
|
JSON 数据格式 Docker
容器日志知多少 (1) Docker logs & logging driver
监控和日志历来都是系统稳定运行和问题排查的关键,在微服务架构中,数量众多的容器以及快速变化的特性使得一套集中式的日志管理系统变成了生产环境中一个不可获取的部分。此次话题我们会集中在日志管理方面,本篇会介绍Docker自带的logs子命令以及其Logging driver。
2119 0
|
4天前
|
运维 Ubuntu Docker
深入理解容器化技术:Docker的应用与实践
在这个数字化转型迅速推进的时代,容器化技术为软件开发和部署提供了新的路径。本文将深入探讨Docker技术的基本原理、应用场景以及实际操作,旨在帮助读者全面理解并掌握这一关键技术。
25 2
|
4天前
|
Docker 容器
蓝易云 - Docker修改容器ulimit的全部方案及各方案的详细步骤
以上就是修改Docker容器ulimit的全部方案及其详细步骤。
10 2
|
4天前
|
存储 Linux Docker
Docker|了解容器镜像层(2)
Docker|了解容器镜像层(2)
15 0
Docker|了解容器镜像层(2)
|
6天前
|
运维 Kubernetes 持续交付
Docker与Kubernetes:容器化技术的黄金搭档
【6月更文挑战第10天】Docker和Kubernetes是容器化技术的黄金组合,Docker提供轻量级、可移植的容器引擎,简化应用部署,而Kubernetes作为容器编排系统,实现自动化部署、扩展和管理,确保高可用性和可扩展性。两者的协作使得容器化应用更高效、可靠,共同推动软件开发和运维的创新。