非常教程

Docker 17参考手册

引擎 | Engine

使用AUFS存储驱动程序(引擎) | Use the AUFS storage driver (Engine)

AUFS 联合文件系统。的aufs存储驱动程序是用于在多克尔管理图像和层的Ubuntu的默认存储驱动器,以及适用于Debian版本拉伸之前。对于Debian Stretch,overlay2是默认值。

AUFS是Docker使用的最成熟的存储驱动程序。它提供了快速的容器启动时间,以及高效的内存和存储使用。

如果您的Linux内核版本为4.0或更高版本,并且您使用Docker CE,请考虑使用较新的overlay2,它比aufs存储驱动程序具有潜在的性能优势。

注意:尽管如果AUFS在Linux内核中存在,但默认情况下使用AUFS,但某些分发版和Docker版本不支持AUFS。请参阅先决条件>以获取有关受支持平台的更多信息,另请参阅存储驱动程序首选项的顺序。

先决条件

  • 对于Docker CE,AUFS在Ubuntu上支持,而在Stretch之前在Debian版本上支持。
  • 对于Docker EE,AUFS在Ubuntu上受支持。
  • 如果您使用Ubuntu,则需要安装额外的软件包以将AUFS模块添加到内核。如果您不安装这些软件包,则需要devicemapper在Ubuntu 14.04(不推荐)或overlay2Ubuntu 16.04及更高版本上使用,这也受支持。
  • AUFS不能使用下面的后盾文件系统:aufsbtrfs,或ecryptfs。这意味着包含的文件系统/var/lib/docker/aufs不能是这些文件系统类型之一。

使用aufs存储驱动程序配置Docker

如果在启动Docker时将AUFS驱动程序加载到内核中,并且没有配置其他存储驱动程序,Docker默认使用它。

  1. 使用以下命令来验证您的内核是否支持AUFS。$ grep aufs /proc/filesystems nodev aufs
  2. 检查Docker正在使用哪个存储驱动程序。$ docker info <truncated output>存储驱动程序:aufs Root Dir: /var/lib/docker/aufs 备份文件系统:extfs Dirs:0 Dirperm1支持:true<truncated output>
  3. 如果您使用的是不同的存储驱动程序,则AUFS不包含在内核中(在这种情况下,将使用不同的默认驱动程序),或者Docker已明确配置为使用不同的驱动程序。检查/etc/docker/daemon.json或输出ps auxw | grep dockerd以查看Docker是否已经启动了--storage-driver标志。

如何aufs存储驱动程序作品

AUFS是一个联合文件系统,这意味着它在单个Linux主机上分层多个目录并将它们呈现为单个目录。这些目录在AUFS术语中称为分支,在Docker术语中称为。统一过程被称为联合安装

下图显示了一个基于ubuntu:latest图像的Docker容器。

使用AUFS存储驱动程序(引擎)  |  Use the AUFS storage driver (Engine)

每个图像层和容器层都在Docker主机上表示为子目录/var/lib/docker/。联合安装提供了所有图层的统一视图。目录名称不直接对应于图层本身的ID。

AUFS使用Copy-on-Write(CoW)策略来最大限度地提高存储效率并将开销降至最低。

示例:映像和容器在磁盘上的结构

以下docker pull命令显示了一个Docker主机下载一个包含五层的Docker镜像。

$ docker pull ubuntu

Using default tag: latest
latest: Pulling from library/ubuntu
b6f892c0043b: Pull complete
55010f332b04: Pull complete
2955fb827c94: Pull complete
3deef3fcbd30: Pull complete
cf9722e506aa: Pull complete
Digest: sha256:382452f82a8bbd34443b2c727650af46aced0f94a44463c62a9848133ecb1aa8
Status: Downloaded newer image for ubuntu:latest

图像层

警告:不要直接操作其中的任何文件或目录/var/lib/docker/。这些文件和目录由Docker管理。

所有关于图像和容器图层的信息都存储在中的子目录中/var/lib/docker/aufs/

  • diff/:每个图层的内容,每个图层都存储在一个单独的子目录中
  • layers/:关于图像图层堆叠的元数据。该目录包含Docker主机上每个图像或容器层的一个文件。每个文件都包含堆栈(其父项)下面的所有图层的ID。
  • mnt/:安装点,每个映像或容器层一个,用于组装和安装容器的统一文件系统。对于只读的图像,这些目录将始终为空。

容器层

如果容器正在运行,则以/var/lib/docker/aufs/下列方式更改内容:

  • diff/:可写容器层中引入的差异,如新文件或修改过的文件。
  • layers/:关于可写容器层的父层的元数据。
  • mnt/:每个正在运行的容器的统一文件系统的安装点,完全与容器内显示的一样。

容器用aufs读取和写入的工作方式

读取文件

考虑三种场景,其中一个容器打开一个文件进行重叠读取访问。

  • 该文件不存在于容器层中:如果容器打开一个文件以进行读取访问,并且文件尚不存在于容器层中,则存储驱动程序会在图像层中搜索文件,容器层。它从它所在的图层读取。
  • 该文件仅存在于容器层中:如果容器打开一个用于读取访问的文件,并且文件存在于容器层中,则从该文件中读取该文件。
  • 该文件同时存在于容器图层和图像图层中:如果容器打开文件进行读取访问,并且文件存在于容器图层和一个或多个图像图层中,则从容器图层读取文件。容器图层中的文件会隐藏图像图层中具有相同名称的文件。

修改文件或目录

考虑一些容器中的文件被修改的场景。

  • 第一次写入文件:容器首次写入现有文件时,该文件不存在于容器(upperdir)中。该aufs驱动程序执行copy_up操作将文件从存在的图像层复制到可写容器层。容器然后将更改写入容器层中的文件的新副本。但是,AUFS在文件级别而不是块级别上工作。这意味着所有的copy_up操作都会复制整个文件,即使文件非常大,只有一小部分被修改。这可能会对容器写入性能产生显着影响。AUFS在搜索多层图像中的文件时可能会出现明显的延迟。但是,值得注意的是copy_up操作仅在给定文件第一次写入时发生。随后写入同一文件的操作与已经复制到容器的文件副本相反。
  • 删除文件和目录
-  When a _file_ is deleted within a container, a _whiteout_ file is created in the container layer. The version of the file in the image layer is not deleted (because the image layers are read-only). However, the whiteout file prevents it from being available to the container.
-  When a _directory_ is deleted within a container, an _opaque file_ is created in the container layer. This works in the same way as a whiteout file and effectively prevents the directory from being accessed, even though it still exists in the image layer.
  • 重命名目录rename(2)在AUFS上不完全支持呼叫目录。它返回EXDEV(即“跨设备链接不允许”),即使源和目标路径都位于同一个AUFS层上,除非目录中没有子节点。您的应用程序需要被设计为处理EXDEV并回退到“复制和取消链接”策略。

AUFS和Docker性能

总结一些已经提到的性能相关方面:

  • AUFS存储驱动程序的性能低于overlay2驱动程序,但对于PaaS和其他类似的容器密度很重要的使用案例来说,这是一个不错的选择。这是因为AUFS可以在多个正在运行的容器之间高效地共享映像,从而实现快速的容器启动时间和最少的磁盘空间使用。
  • AUFS如何在图像层和容器之间共享文件的底层机制非常高效地使用页面缓存。
  • AUFS存储驱动程序可以在容器写入性能方面引入显着的延迟。这是因为第一次容器写入任何文件时,该文件必须被定位并被复制到容器顶部可写层中。当这些文件存在于许多图像层下并且文件本身很大时,这些延迟会增加并且复杂化。

性能最佳实践

以下通用性能最佳实践也适用于AUFS。

  • 固态设备(SSD)比旋转磁盘提供更快的读取和写入速度。
  • 将卷用于写入繁重的工作负载:卷为写入繁重的工作负载提供最佳和最可预测的性能。这是因为它们绕过了存储驱动程序,并且不会产生精简配置和写入时复制引入的任何潜在开销。卷还有其他好处,例如允许您在容器之间共享数据,并且即使在没有正在运行的容器正在使用它们时也会持久存在。

相关信息

  • 了解图像,容器和存储驱动程序
  • 选择存储驱动程序
  • Btrfs存储驱动程序在实践中
  • Device Mapper存储驱动程序在实践中

容器,存储,驱动程序,AUFS

引擎 | Engine相关

1..NET核心应用程序(引擎) | .NET Core application (Engine)
2.关于图像,容器和存储驱动程序(引擎) | About images, containers, and storage drivers (Engine)
3.向swarm添加节点(Engine) | Add nodes to the swarm (Engine)
4.应用自定义元数据(引擎) | Apply custom metadata (Engine)
5.应用滚动更新(引擎) | Apply rolling updates (Engine)
6.apt-cacher-ng
7.编写Dockerfiles(引擎)的最佳实践 | Best practices for writing Dockerfiles (Engine)
8.二进制(引擎) | Binaries (Engine)
9.将容器端口绑定到主机(引擎) | Bind container ports to the host (Engine)
10.突破性变化(引擎) | Breaking changes (Engine)
11.建立自己的网桥 | Build your own bridge (Engine)
12.CentOS (Engine)
13.CentOS (Engine)
14.配置容器DNS(引擎) | Configure container DNS (Engine)
15.在用户定义的网络中配置容器DNS(引擎) | Configure container DNS in user-defined networks (Engine)
16.CouchDB (Engine)
17.创建基本映像(引擎) | Create a base image (Engine)
18.创建群(引擎) | Create a swarm (Engine)
19.自定义docker0网桥(引擎) | Customize the docker0 bridge (Engine)
20.Debian (Engine)
21.默认桥接网络 | Default bridge network
22.删除服务(引擎) | Delete the service (Engine)
23.部署服务(引擎) | Deploy a service (Engine)
24.将服务部署到一个群(引擎) | Deploy services to a swarm (Engine)
25.不推荐的引擎功能 | Deprecated Engine features
26.Docker容器网络(引擎) | Docker container networking (Engine)
27.Docker概述(引擎) | Docker overview (Engine)
28.Docker运行参考(引擎) | Docker run reference (Engine)
29.Dockerfile引用(引擎) | Dockerfile reference (Engine)
30.Dockerize应用程序 | Dockerize an application
31.排空节点(引擎) | Drain a node (Engine)
32.引擎 | Engine
33.FAQ(引擎) | FAQ (Engine)
34.Fedora (Engine)
35.开始 | Get started (Engine)
36.开始使用macvlan网络驱动程序 | Get started with macvlan network driver (Engine)
37.开始使用多主机网络 | Get started with multi-host networking (Engine)
38.节点如何工作 | How nodes work (Engine)
39.服务如何运作(引擎) | How services work (Engine)
40.图像管理 | Image management (Engine)
41.检查服务(引擎) | Inspect the service (Engine)
42.安装Docker(引擎) | Install Docker (Engine)
43.IPv6与Docker(引擎) | IPv6 with Docker (Engine)
44.将节点加入群集(引擎) | Join nodes to a swarm (Engine)
45.旧容器链接(引擎) | Legacy container links (Engine)
46.锁定你的群(引擎) | Lock your swarm (Engine)
47.管理群中的节点(引擎) | Manage nodes in a swarm (Engine)
48.使用Docker机密管理敏感数据(引擎) | Manage sensitive data with Docker secrets (Engine)
49.使用PKI管理swarm安全性(引擎) | Manage swarm security with PKI (Engine)
50.管理群体服务网络(引擎) | Manage swarm service networks (Engine)
51.迁移到引擎1.10 | Migrate to Engine 1.10
52.可选的Linux安装后步骤(引擎) | Optional Linux post-installation steps (Engine)
53.总览 | Overview (Engine)
54.总览 | Overview (Engine)
55.PostgreSQL(引擎) | PostgreSQL (Engine)
56.群集模式中的筏共识(引擎) | Raft consensus in swarm mode (Engine)
57.Riak (Engine)
58.以群集模式运行Docker Engine | Run Docker Engine in swarm mode
59.扩展服务(引擎) | Scale the service (Engine)
60.SDKs (Engine)
61.选择一个存储驱动 | Select a storage driver (Engine)
62.设置教程(引擎) | Set up for the tutorial (Engine)
63.SSHd (Engine)
64.存储驱动总览 | Storage driver overview (Engine)
65.存储服务配置数据(引擎) | Store service configuration data (Engine)
66.Swarm管理指南(引擎) | Swarm administration guide (Engine)
67.Swarm模式关键概念(引擎) | Swarm mode key concepts (Engine)
68.Swarm模式覆盖网络安全模型(引擎) | Swarm mode overlay network security model (Engine)
69.群模式概述(引擎) | Swarm mode overview (Engine)
70.Ubuntu (Engine)
71.Ubuntu (Engine)
72.了解容器通信(引擎) | Understand container communication (Engine)
73.使用多阶段构建(引擎) | Use multi-stage builds (Engine)
74.使用swarm模式路由网格(引擎) | Use swarm mode routing mesh (Engine)
75.使用Btrfs存储驱动程序(引擎) | Use the Btrfs storage driver (Engine)
76.使用设备映射器存储驱动程序(引擎) | Use the Device mapper storage driver (Engine)
77.使用OverlayFS存储驱动程序(引擎) | Use the OverlayFS storage driver (Engine)
78.使用VFS存储驱动程序(引擎) | Use the VFS storage driver (Engine)
79.使用ZFS存储驱动程序(引擎) | Use the ZFS storage driver (Engine)
80.处理图像 | Work with images
81.使用网络命令(引擎) | Work with network commands (Engine)
Docker 17

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

主页 https://docker.com/
源码 https://github.com/docker/docker
版本 17
发布版本 17.06