千家信息网

Docker存储驱动中AUFS有什么用

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章给大家分享的是有关Docker存储驱动中AUFS有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。简介AUFS曾是Docker默认的首选存储驱动。它非常稳定、有
千家信息网最后更新 2026年11月01日Docker存储驱动中AUFS有什么用

这篇文章给大家分享的是有关Docker存储驱动中AUFS有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

简介

  AUFS曾是Docker默认的首选存储驱动。它非常稳定、有很多真实场景的部署、很强的社区支持。它有以下主要优点:
  极短的容器启动时间。
  有效的存储利用率。
  有效的内存利用率。
  虽然如此,但由于它没有包含在Linux内核主线中,所有很多Linux发行版并不支持AUFS。

特性

镜像分层和部署

  AUFS是一种联合文件系统。它使用同一个Linux host上的多个目录,逐个堆叠起来,对外呈现出一个统一的文件系统。AUFS使用该特性,实现了Docker镜像的分层。下图展示出ubuntu:latest的镜像的分层。
  
  注意:在Docker1.10之前,layer的ID对应着其在/var/lib/docker下的目录名称,但在Docker1.10之后,不再有这种直接的对应关系。
  对于一个容器来说,只有顶层的容器layer是可读写的,而下面的layer都是只读的。

读写文件

  Docker使用AUFS的CoW(Copy-on-Write)技术来实现镜像共享和最小化磁盘空间的使用。AUFS作用于文件层,也就是说AUFS CoW拷贝整个文件--即使文件只修改了一点点的内容。所以,它对容器的性能影响很明显,尤其拷贝多层镜像下的大文件,或者是在一个深层次的目录树中进行搜索。
  不过,在给定的容器中,这种拷贝到顶层layer的操作,每个文件只会做一次。随后,对该文件的读写操作,都只针对容器顶层可读写layer的拷贝文件。

删除文件

  通过上面的介绍,很容易想到。如果要在容器中删除一个非顶层layer的文件,肯定不会在下层layer中直接删除,因为下层layer对于容器来说都是只读的。AUFS存储驱动要删除一个文件,是通过在容器顶层layer增加一个whiteout文件来实现的。这个whiteout文件可以隐藏下层只读layer中文件的存在,容器感知不到只读层layer中文的存在。事实上,无论该文件在下层只读layer中是否还存在,容器都认为这个文件被删除了。

重命名目录

  AUFS未能完美的支持rename(2)重命名操作,会返回EXDEV["cross-device link not permitted"],即使源路径和目的路径都在同一个AUFS层。因此,你的应用需要能处理EXDEV,可以用"拷贝再删除"的策略来替代rename操作。
  我在这里做了一个测试,写了一个简单地C程序,该程序将目录test重命名为目录gaga,并打印出rename的结果。该程序在普通服务器上完美运行,那么在容器中呢?开始做测试吧。

创建docker build目录,进入该目录。并在该目录下创建子目录test。

$ mkdir build-rename$ cd build-rename$ mkdir test

创建文件test.c

$ vim test.c#include#include int main(void){    char oldname[100] = "test", newname[100]="gaga";    int ret = rename(oldname, newname);    if (ret == 0)        printf("rename ok.\n");    else        printf("ret = %d\n", ret);    return 0;}

  编译该程序,生成可执行文件a.out。

$ gcc test.c

创建Dockerfile

$ vim DockerfileFROM ubuntuWORKDIR /usr/src/appCOPY ./* /usr/src/app/CMD /usr/src/app/a.out

生成镜像。

$ docker build -t rename:v1.0 ./

运行容器

$ docker run --rm rename:v1.0ret = -1

  该容器启动后会执行可执行文件a.out,重命名一个目录。可见结果,rename重命名一个目录的确是返回了失败。

配置AUFS

准备

  只有在OS安装了AUFS的情况下才能使用AUFS存储驱动,一般来说,Debian/Ubuntu都支持AUFS,而Redhat/CentOS都不支持AUFS。所以,你需要先查看下你的系统是否安装了AUFS。

$ grep aufs /proc/filesystemsnodev   aufs

  如果以上命令有输出则表示支持AUFS,否则就说明还未安装AUFS。可执行以下步骤:
  a. 升级你系统的kernel版本到3.13或者更高,另外建议安装kernel headers;
  b. 对于Ubuntu/Debian:安装linux-image-extra-*包:

$ apt-get install linux-image-extra-$(uname -r) \                       linux-image-extra-virtual

配置

  如果上述操作无误,就可以使用AUFS来作为你Docker Daemon的存储驱动了。

$ dockerd --storage-driver=aufs &

  如果想持久化这个配置,可以编辑你的Docker配置文件(如/etc/default/docker,虽然官方已经不建议使用该文件了),并加入--storage-driver=aufs选项到DOCKER_OPTS中。

# Use DOCKER_OPTS to modify the daemon startup options.DOCKER_OPTS="--storage-driver=aufs"

  重启docker daemon(systemctl restart docker.service)后,确认默认存储驱动是否配置成功:

$ docker info | grep "Storage Driver"Storage Driver: aufs

本地存储和AUFS

  当dockerd使用AUFS驱动时,驱动把镜像和容器存储在Docker host的本地存储下:/var/lib/docker/aufs。

镜像

  镜像层存储在/var/lib/docker/aufs/diff里。Docker 1.10之后,镜像对应的目录名称不再和镜像ID意义对应了。
  /var/lib/docker/aufs/layers/目录保存了元数据信息,这些元数据显示了image层是如何叠加的。该目录下的每个文件,对应了一个层,而这个文件的内容就是该层之下的层。如:

$ cat /var/lib/docker/aufs/layers/91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267cd74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82c22013c8472965aa5b62559f2b540cd440716ef149756e7b958a1b2aba421e87d3a1f33e8a5a513092f01bb7eb1c2abf4d711e5105390a3fe1ae2248cfde1391

  由于base layer之下不再有其它层,所有base layer对应的文件内容是空的。

容器

  运行中的容器映射在 /var/lib/docker/aufs/mnt/下,这就是AUFS给容器和它下层layer的一个mount point。如果容器没有运行了,依然还有这个目录,但却是个空目录,因为AUFS只在容器运行是才映射。Docker 1.10之上的版本,目录名同样不和容器ID对应。
  容器元数据和多种配置文件存放在该目录下。

$ ls /var/lib/docker/aufs/mnt/670e0053b2ba02ab33dc24daca293e200aa98e871cefec016a5cbf9d41b7cfbfbin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

  容器的可写层存储在目录 /var/lib/docker/aufs/diff/,即使容器停止了,容器对应的目录依然存在。只有删除容器时,对应的目录才会删除。

AUFS在Docker中的性能

  对于PaaS层来说,AUFS存储驱动是一个很好的选择。因为AUFS有效地在多个运行容器中共享镜像,加速了容器启动时间,减少了容器使用的磁盘空间。
  AUFS在多个镜像层和容器间分享文件所使用的底层机制,高效地使用了系统的页缓存。
  同时,AUFS存储驱动也带来了一些容器写性能上的隐患。这是因为,容器第一次对任何文件的修改,都需要先定位到文件的所在的镜像层次,并拷贝到容器最顶层的读写层。尤其当这些文件存在于很底层,或者文件本身非常大时,性能问题尤其严重。

  AUFS是Docker在Ubuntu/Debian中的默认存储驱动,虽然后面可能会被替换掉。但暂时来说,它完美地契合Docker的特性。并且,如何合理使用,其性能非常优异。另外,需要注意的是,AUFS对目录的重命名支持得不好,在编写程序时需要注意这点。

感谢各位的阅读!关于"Docker存储驱动中AUFS有什么用"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

容器 文件 目录 存储 镜像 驱动 支持 拷贝 运行 配置 内容 性能 程序 系统 顶层 有效 只有 多个 数据 特性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 华服互联网科技靠谱吗 华服互联网科技怎么样 互联网科技网 互联网科技的 金融科技创新监管互联网金融 远信互联网科技 济南和联互联网科技有限公司 卫星互联网科技股票 云创客互联网科技公司 随着互联网科技发展 互联网经济与金融科技 崇明区互联网教育科技诚信经营 江阴互联网智能科技产品进口 注册互联网科技公司经营范围大全 银川新华互联网科技学校联系电话 群盈汇互联网科技有限公司 烟台灵鸽互联网科技有限公司 区块链结合互联网科技 上海科技产业互联网平台 互联网金融金融科技 互联网黑科技 中国互联网金融科技基金 哈尔滨秒房互联网科技有限公司 太原新华互联网科技学校怎么样 互联网科技热点资讯 随着互联网科技发展 科技与互联网哪个更好 互联网企业和科技型企业 黑龙江互联网科技公司 互联网企业和网络科技有限公司
0