docker overlay2清理_你的 Docker 存储驱动与磁盘文件系统 是最佳拍档吗?

ac000619695cbb1b26d47f27903ee9d5.png

引言

在往下看时,建议先用docker info检查下你的 docker 信息是不是与下面的保持一致。

  Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
  • 如果是,那么恭喜你幸运的避开了一个坑。具体什么坑,下面细说。
  • 如果不是,那么这篇文章将会对你有帮助的。

1.  掉坑经过

  • docker 版本 19.03.6
  • 系统 ubuntu:18.04

事情起因是我的 docker 拉取镜像没有问题,但在起容器时一直报下面的错:

docker error creating overlay mount to xxx invalid argumentf1dba16a77b25d01a4231cf8429973c7.png

这让我很困惑,重装 docker 之后也不行。

2. 定位问题

2.1 现有"失效"方案

于是我就开始上网找解决方案,网上大概有以下几种:

  1. 在 daemon.json 中添加 “storage-driver”:“overlay”
  2. 在 daemon.json 中添加 “storage-driver”:“devicemapper”
  3. 禁用 selinux

但上面的三个方案 全不靠谱

  • 首先,他们都是docker官方 不推荐的做法。
  • 其次是我都尝试了,但都没成功。

不过事后来看,通常你们改成 devicemapper应该就可以勉强”解决问题“了。但不幸也幸运的是我没有成功,正好也能让我从根本上解决问题,填平这个坑。

2.2 定位经过

我通过 debug 模式查看原因

# 查看原因
sudo dockerd --debug
185a87d618b5e5387f4267260e3d6b4a.png

发现是我镜像同时存在 devicemapperoverlay两种,需要清理一种。

f4b71a840f852d9e5f4c0234dfd8eb96.png

我选择删除 devicemapper (很遗憾我选错了)。

上面的问题又出现了。继续上网找答案,终于在官方文档中发现原因。官方文档中提到:

the overlay and overlay2 drivers are supported on xfs backing filesystems, but only with d_type=true enabled

也就是说,用overlay2驱动,必须是以 xfs 作为后端的文件系统。

此外,官方说推荐用overlay2 代替 overlaydevicemapper(18.09 版本中废除)以获得更高的效率和磁盘 inode 的节省. 这就是我说上面三种方案不靠谱的原因。

b4e44a7e381cceec82ce18f39042eb9a.png
2.3 明确原因
  1. 查看 docker info 看到 docker info 中的 Backing Filesystem 异常

7493a1c0599aecc323068fc6f3bb6f64.png2. 查看磁盘占用

# 查看磁盘位置
sudo blkid

目标磁盘 /dev/sdc1 的文件系统格式竟是ntfs. 终于找到问题的根源了:

磁盘文件系统原因,导致 Docker 的存储驱动(storage-driver)与后端文件系统(Backing Filesystem) 不匹配

3 解决方案

既然定位了问题,那么解决办法就很清晰了:

  1. 格式化磁盘,更改文件系统为xfs
  2. 挂载磁盘
  3. 修改daemon.json 配置文件

注:XFS是一个64位文件系统,极具伸缩性,非常健壮.2000年被 Linux 系统支持.

3.1. 格式化磁盘,更改文件系统为xfs
sudo mkfs.xfs /dev/sdc1
3.2. 挂载磁盘
# 切换管理员
sudo -i
mount /dev/sdc1 /media/kevin/storage2
# 设置开机自动挂载:
vi /etc/fstab

修改内容如下:de9a894a9d5a307a402f533732c3cc38.png

3.3. 修改daemon.json 配置文件

将镜像存储位置修改为挂载磁盘

{
"graph":"/media/kevin/storage2/docker/images_data",
}

重启 docker

sudo systemctl daemon-reload
sudo systemctl restart docker

检验结果

检查 docker info

已经变成文章开头的形式,确认没有问题。

启动容器

启动成功,解决问题。6e185b0ca7fff2b2ab3c2c99ec0f6ec5.png

总结

对于开篇的问题,如果你答案是不一致,那么不建议采用 overlay2 之外的驱动。同时最好将镜像存放在 xfs磁盘上,不行的话 ext4上也也行。

复盘整个问题的产生。其实早在主机刚到家的时候,这个坑我便挖好了:当时装了ubuntu 和 win10 双系统, 两块主力硬盘,却都是在 windows下格式化和挂载的,对应的文件系统格式是 ntfs。而主要用的却是在 ubuntu 使用docker,当时将 “storage-driver” 改成 “devicemapper”,算是临时解决问题。借着这个机会,索性彻底解决了。抬眼窗外,不得不感叹, 出来混迟早要还的!

注:下面是我的 公众号知行并重欢迎关注,我会在那分享关于金融风控建模、图挖掘以及知识图谱的文章,一起交流。

参考文章
  1. Docker Error Creating Overlay Mount To Invalid Argument

    https://curiousviral.com/docker-error-creating-overlay-mount-to-invalid

  2. Use the OverlayFS storage driver

    https://docs.docker.com/storage/storagedriver/overlayfs-driver/

d203cbc50572a8316a5a43a0288c9bc8.png
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值