千里之行,始于足下
- 早上同事在群里反馈,说上
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