千里之行,始于足下

- 早上同事在群里反馈,说上
CentOS7运行的docker无法使用了。经过排除,发现是因为容器中的文件无法删除导致,服务启动失败的,折腾了很久都没有发现问题处理哪里。很奇怪,docker也重装了问题还是出现。

- 按理说
docker里面删除文件,文件不是同层创建的话,上一层带来的文件不会真正删除,但应该打标记,不在容器内体现才对。这事看起来像docker文件系统的问题,一搜发现docker还有好几套文件驱动支持,于是docker info看看我们的操作都支持什么驱动。
# docker info
......
WARNING: overlay: 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.
Running without d_type support will not be supported in future releases.
- 发现
Centos7默认使用的是xfs文件系统,与docker默认overlay2存储驱动不匹配。因为是WARNING,所以可能会导致容器内文件无法删除等问题。
[escape@localhost ~]$ cat /etc/fstab
#
# /etc/fstab
#
/dev/mapper/root / xfs defaults 0 0
UUID=1d82-xxx-a6d5-1245 /boot xfs defaults 0 0
/dev/mapper/home /home xfs defaults 0 0
/dev/mapper/swap swap swap defaults 0 0
/dev/sdb1 /data ext4 defaults 0 0
- [1] 格式化磁盘
- 既然已经发现了问题,那么就要开始接近问题。最最直接且彻底的方式就是,重新格式化磁盘,使用
Ext4格式。
# 磁盘分区
$ fdisk /dev/sdb1
# 格式化磁盘
$ mkfs.ext4 /dev/sdb1
# 挂载
$ mount /dev/sdb1 /data
- [2] 更改文件驱动
- 在
CentOS7中,我们还可以更改文件驱动,这个看起来更加简单一点,加参数指定老的devicemapper驱动,即devicemapper + xfs的方式运行。
# 修改文件驱动
$ vi /etc/systemd/system/multi-user.target.wants/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd --storage-driver=devicemapper
ExecReload=/bin/kill -s HUP $MAINPID
...
# 重启docker服务
$ systemctl restart docker
- [3] 宿主机中删除文件
- 因为是
docker在CentOS7下的一个Bug导致文件系统里边的文件不会被删除,所以我们使用临时方法从宿主机上直接删除。在宿主机上LowerDir目录下,删除对应的报错的文件或者文件夹(``),即可。
# 查看容器信息
$ inspect container_name
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay/xxx6aee/root",
"MergedDir": "/var/lib/docker/overlay/xxxe6a/merged",
"UpperDir": "/var/lib/docker/overlay/xxxfe6a/upper",
"WorkDir": "/var/lib/docker/overlay/xxxde96a/work"
},
# 删除文件夹
$ rm -rf /var/lib/docker/overlay/xxx6aee/root/usr/local/lib/python2.7/dist-packages/pyparsing