Featured image of post docker存储引擎相关问题

docker存储引擎相关问题

问题起源

我在某个项目上看到docker daemon启动之后默认使用了vfs的存储方式,我们都知道docker官方推荐的是overlay2的方式,vfs存储仅适用于测试环境,性能很差,官网是这么说的:

The vfs storage driver is intended for testing purposes, and for situations where no copy-on-write filesystem can be used. Performance of this storage driver is poor, and is not generally recommended for production use.

(vfs存储驱动是用于测试目的,以及不能使用写时复制文件系统的情况。这个存储驱动的性能很差,一般不建议在生产中使用。)

overlay2 is the preferred storage driver for all currently supported Linux distributions, and requires no extra configuration.

(overlay2是目前所有支持的Linux发行版的首选存储驱动,不需要额外配置。)

排查过程

启用overlay2

其实官方默认启用的就是overlay2,但是既然没有使用,绝对是底层存储不满足嘛,我们可以强制指定存储引擎以后看看报错再依次排查掉问题。

那么咋个指定呢?我们可以在/etc/docker/daemon.json中强制指定存储引擎为overlay2。

1
2
3
4
{
    ...,
    "storage-driver": overlay2
}

排查底层存储问题

启用之后,果然启动过程中提示报错了:

failed to start daemon: error initializing graphdriver: overlay2: the backing xfs filesystem is formatted without d_type support, which leads to incorrect behavior. Reformat the filesystem with ftype=1 to enable d_type support. Backing filesystems without d_type support are not supported.

从报错上看,overlay2需要文件系统支持d_type,但出现问题的机器上配置的Data Dir Root目录采用的是xfs文件系统,默认并没有开启d_type,需要开启d_type的支持。

什么是d_type

d_type 是 Linux 内核的一个术语,表示 “目录条目类型”,而目录条目其实是文件系统上目录信息的一个数据结构。d_type,就是这个数据结构的一个字段,这个字段用来表示文件的类型,是文件、管道,目录还是套接字等。

d_type 从 Linux 2.6 内核开始就已经支持了,只不过虽然 Linux 内核虽然支持,但有些文件系统实现了 d_type,而有些没有实现,有些是选择性的实现,也就是需要用户自己用额外的参数来决定是否开启d_type的支持。

检查xfs文件系统是否支持d_type:

1
$ xfs_info /docker
1
2
3
4
5
6
7
8
9
meta-data=/dev/vda2              isize=256    agcount=9, agsize=2589248 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=20843184, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=5057, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

注意以上输出中的ftype字段,为0则表示不支持。

解决d_type问题

直接重新格式化指定d_type启用即可:

1
$ mkfs.xfs -n ftype=1 /dev/vda2 -f

重启docker daemon发现问题解决