文章总结: 故障根因是XFS文件系统创建时未启用dtype支持(ftype=0),导致Overlay2存储驱动无法挂载容器层。排查通过检查dtype支持、系统日志和历史变更确认问题。紧急方案切换存储驱动为devicemapper快速恢复业务,永久方案需重新创建XFS文件系统并启用ftype=1。建议创建XFS卷时指定-nftype=1。 综合评分: 88 文章分类: 实战经验
openEuler+Docker真实故障:新容器无法启动,30分钟从崩溃到恢复全记录
原创
刘军军 刘军军
运维星火燎原
2026年6月6日 00:00 天津
在小说阅读器读本章
去阅读
一、故障现象
1.1 环境信息
- 操作系统: openEuler 22.03 LTS SP3
- 内核版本: 5.10.0-136.12.0.89.oe2203sp3.x86_64
- Docker版本: 20.10.21 (containerd 1.6.15)
- 容器编排: Docker Compose 2.12.2
- 业务应用: 企业级微服务平台(基于Spring Cloud)
- 部署架构: 3台服务器组成的Docker Swarm集群
1.2 故障表现
[2026-06-01 09:30:00] 业务系统新功能上线,执行滚动更新
[2026-06-01 09:32:00] 发现订单服务容器无法启动
[2026-06-01 09:35:00] 尝试手动启动多个容器都失败
[2026-06-01 09:38:00] 影响范围扩大到用户中心、支付服务等核心服务
[2026-06-01 09:40:00] 启动紧急故障响应流程
1.3 初始错误信息
# 尝试启动容器
$ docker start order-service-1
Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: rootfs_linux.go:76: mounting "/var/lib/docker/overlay2/abc123456789/diff" to rootfs at "/var/lib/docker/overlay2/abc123456789/merged" caused: invalid argument: unknown
Error: failed to start containers: order-service-1
# 查看容器日志
$ docker logs order-service-1
Error: No such container: order-service-1
# 查看Docker服务状态
$ systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2026-06-0109:00:00 CST; 42min ago
二、排查过程
步骤1: 检查Docker系统状态
时间: 2026-06-01 09:45:00
# 检查Docker信息
$ docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
compose: Docker Compose (Docker Inc., v2.12.2)
Server:
Containers: 35
Running: 28
Paused: 0
Stopped: 7
Images: 125
Server Version: 20.10.21
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: false
Native Overlay Diff: false
userxattr: false
Logging Driver: json-file
Cgroup Driver: systemd
Cgroup Version: 2
关键发现: Supports d_type: false – 这是一个严重问题!
步骤2: 检查文件系统和d_type
时间: 2026-06-01 09:48:00
# 检查文件系统类型
$ df -Th /var/lib/docker
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg_docker xfs 500G 420G 80G 84% /var/lib/docker
# 检查d_type支持
$ xfs_info /var/lib/docker | grep ftype
naming =version 2 bsize=4096 ascii-ci=0, ftype=0
# 检查挂载选项
$ mount | grep /var/lib/docker
/dev/mapper/vg_docker on /var/lib/docker type xfs (rw,relatime,attr2,inode64,noquota)
重要问题: ftype=0 – XFS文件系统没有启用d_type支持!
步骤3: 查看系统日志
时间: 2026-06-01 09:52:00
# 查看Docker服务日志
$ journalctl -u docker -n100--no-pager
# 关键错误信息
Jun 0109:32:15 node-1 dockerd[12345]: time="2026-06-01T09:32:15.123+08:00"level=error msg="Handler for POST /v1.41/containers/order-service-1/start returned error: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: rootfs_linux.go:76: mounting \"/var/lib/docker/overlay2/abc123456789/diff\" to rootfs at \"/var/lib/docker/overlay2/abc123456789/merged\" caused: invalid argument: unknown"
# 查看内核日志
$ dmesg -T | tail -50
[Mon Jun 109:32:15 2026] overlayfs: upper fs does not support xattr, falling back to index=off and inodes=off
[Mon Jun 109:32:15 2026] overlayfs: upper fs missing required features.
步骤4: 检查历史变更记录
时间: 2026-06-01 09:58:00
# 查看yum历史
$ yum history
ID | Command line | Date and time | Action(s) | Altered
-------|---------------------|------------------|----------------|--------
150 | install xxx | 2026-06-0108:00 | Install | 5
149 | update system | 2026-05-3010:00 | Update | 23
# 查看文件系统变更
$ lsblk-f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1 xfs bbb111-cccc-2222-3333-dddd4444
└─sda2 LVM2_member eee555-ffff-6666-7777-gggg8888
└─vg_docker xfs hhh999-iiii-0000-1111-jjjj2222 80G 84% /var/lib/docker
# 检查LVM操作日志
$ cat /var/log/messages | grep-i"lvm\|vgcreate\|lvcreate"
发现线索: 凌晨有人重新创建了Docker存储的LVM卷!
步骤5: 验证Overlay2存储驱动
时间: 2026-06-01 10:05:00
# 检查Overlay2是否正常
$ ls -la /var/lib/docker/overlay2/
total 0
drwx--x--x. 1 root root 386 Jun 109:00 .
drwx--x--x. 1 root root 224 Jun 109:00 ..
drwx--x--x. 1 root root 128 Jun 109:00 abc123456789
drwx--x--x. 1 root root 128 Jun 109:00 def987654321
# 查看现有容器的存储
$ docker inspect order-service-1 | jq -r'.[].GraphDriver'
{
"Data": {
"LowerDir": "/var/lib/docker/overlay2/abc123456789-init/diff:/var/lib/docker/overlay2/def987654321/diff",
"MergedDir": "/var/lib/docker/overlay2/abc123456789/merged",
"UpperDir": "/var/lib/docker/overlay2/abc123456789/diff",
"WorkDir": "/var/lib/docker/overlay2/abc123456789/work"
},
"Name": "overlay2"
}
# 尝试手动测试Overlay2挂载
$ mkdir -p /tmp/overlay2-test/{lower,upper,work,merged}
$ echo "test" > /tmp/overlay2-test/lower/file.txt
$ mount -t overlay overlay -olowerdir=/tmp/overlay2-test/lower,upperdir=/tmp/overlay2-test/upper,workdir=/tmp/overlay2-test/work /tmp/overlay2-test/merged
mount: /tmp/overlay2-test/merged: wrong fs type, bad option, bad superblock on overlay, missing codepage or helper program, or other error.
手动测试也失败了 – 确认是Overlay2驱动问题!
三、根因分析
3.1 故障根因
核心问题: XFS文件系统缺少d_type支持,导致Overlay2存储驱动无法正常工作
详细过程:
- 凌晨运维人员为了扩容,重新创建了
/var/lib/docker的LVM卷 - 新创建的XFS文件系统使用了错误的参数:
ftype=0(默认在某些旧版本是0) - 而Overlay2存储驱动必须要求XFS文件系统开启
ftype=1(d_type支持) - 当Docker尝试启动新容器时,Overlay2无法创建所需的挂载
- 旧容器虽然还在运行,但新容器都无法启动
- 滚动更新失败,导致服务中断
3.2 技术细节
- d_type: “directory entry type”,目录项类型,Overlay2需要此功能来高效处理文件
- Overlay2: Docker默认的存储驱动,依赖d_type支持
- ftype=0: XFS文件系统创建时的参数,表示不支持d_type
- ftype=1: 支持d_type,Overlay2的必需条件
四、解决方案
4.1 紧急恢复方案(临时方案)
时间: 2026-06-01 10:15:00
为了快速恢复业务,先切换Docker存储驱动为devicemapper:
# 1. 停止Docker服务
$ systemctl stop docker
# 2. 备份Docker数据(虽然现在有问题)
$ mv /var/lib/docker /var/lib/docker.backup
# 3. 创建临时的XFS文件系统(用于快速恢复)
$ lvcreate-L 100G -n docker-temp vg_docker
$ mkfs.xfs -nftype=1 /dev/vg_docker/docker-temp
$ mount /dev/vg_docker/docker-temp /var/lib/docker
# 4. 修改Docker配置,暂时使用devicemapper
$ cat > /etc/docker/daemon.json << 'EOF'
{
"storage-driver": "devicemapper"
}
EOF
# 5. 启动Docker
$ systemctl start docker
# 6. 重新拉取镜像并启动容器
$ docker pull registry.example.com/order-service:v2.1
$ docker-compose -f docker-compose.yml up -d
结果: 业务在15分钟内恢复!
4.2 永久修复方案
时间: 2026-06-01 14:00:00(业务低峰期)
# 1. 停止所有容器和Docker
$ docker-compose -f docker-compose.yml down
$ systemctl stop docker
# 2. 重新创建正确的XFS文件系统
$ umount /var/lib/docker
$ lvremove -y /dev/vg_docker/docker-temp
$ lvremove -y /dev/vg_docker/docker
$ lvcreate -L 500G -n docker vg_docker
# 关键:使用ftype=1创建XFS
$ mkfs.xfs -n ftype=1 /dev/vg_docker/docker
# 3. 挂载并验证
$ mount /dev/vg_docker/docker /var/lib/docker
$ xfs_info /var/lib/docker | grep ftype
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
# 4. 恢复Docker配置,改回overlay2
$ cat > /etc/docker/daemon.json << 'EOF'
{
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
# 5. 从备份恢复镜像和容器(或者重新拉取)
# 这里选择重新拉取,更干净
# 6. 启动Docker
$ systemctl start docker
# 7. 拉取所有镜像
$ docker-compose -f docker-compose.yml pull
# 8. 启动所有服务
$ docker-compose -f docker-compose.yml up -d
# 9. 设置开机自动挂载
$ blkid /dev/vg_docker/docker
/dev/vg_docker/docker: UUID="kkk3333-llll-4444-5555-mmmm6666"TYPE="xfs"
$ echo'UUID="kkk3333-llll-4444-5555-mmmm6666" /var/lib/docker xfs defaults 0 0' >> /etc/fstab
五、验证测试
5.1 Docker系统验证
# 验证Overlay2和d_type
$ docker info | grep -A 5 -B 5 "Supports d_type"
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
# 验证文件系统
$ xfs_info /var/lib/docker | grep ftype
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
# 测试创建容器
$ docker run --rm -it alpine echo"Test container created successfully"
Test container created successfully
5.2 业务应用验证
# 检查所有容器状态
$ docker-compose -f docker-compose.yml ps
NAME COMMAND SERVICE STATUS PORTS
order-service-1 "java -jar /app/ord…" order-service running 0.0.0.0:8080->8080/tcp
user-center-1 "java -jar /app/user…" user-center running 0.0.0.0:8081->8081/tcp
payment-service-1 "java -jar /app/pay…" payment-service running 0.0.0.0:8082->8082/tcp
# 检查服务健康
$ curl http://localhost:8080/actuator/health
{"status":"UP"}
# 验证业务功能
$ curl -X POST http://localhost:8080/api/orders \
-H"Content-Type: application/json" \
-d'{"userId":1,"productId":1001,"quantity":2}'
{"orderId":10001,"status":"created"}
六、预防措施
6.1 技术预防
- 创建XFS文件系统标准操作指南
# 正确创建Docker存储的XFS文件系统
mkfs.xfs -nftype=1 /dev/your-device
# 验证ftype
xfs_info /mountpoint | grep ftype
# 期望输出: ftype=1
- Docker部署检查清单
- 检查存储驱动配置
- 验证文件系统d_type支持
- 测试创建和删除容器
- 配置监控告警
- 自动化检查脚本
#!/bin/bash
# Docker存储检查脚本
echo "=== Docker Storage Check ==="
# 检查Docker信息
docker info > /tmp/docker-check.txt
# 检查d_type
D_TYPE=$(docker info 2>/dev/null | grep "Supports d_type" | awk '{print $NF}')
if [ "$D_TYPE"="true" ]; then
echo"✓ d_type support: OK"
else
echo"✗ d_type support: FAILED!"
exit1
fi
# 检查文件系统
FS_TYPE=$(df -Th /var/lib/docker | awk 'NR==2{print $2}')
echo"File System: $FS_TYPE"
if [ "$FS_TYPE"="xfs" ]; then
FTYPE=$(xfs_info /var/lib/docker 2>/dev/null | grep -oP 'ftype=\K\d+')
if [ "$FTYPE"="1" ]; then
echo "✓ XFS ftype=1: OK"
else
echo "✗ XFS ftype not equal to 1: FAILED!"
exit 1
fi
fi
echo "=== All checks passed! ==="
exit0
6.2 流程改进
- 变更审批流程
- 任何生产环境文件系统变更必须经过审批
- 变更前必须有完整的回滚方案
- 运维操作标准化
- 创建标准操作手册(SOP)
- 定期进行运维技能培训
- 监控告警
- 监控Docker服务健康状态
- 监控文件系统使用情况
- 配置容器启动失败告警
七、经验总结
7.1 关键教训
- 存储驱动选择至关重要
- Overlay2是Docker推荐的驱动,但有文件系统要求
- 生产环境部署前必须验证存储驱动兼容性
- 文件系统参数不可忽视
- XFS的ftype参数是Overlay2的必需条件
- 重新创建文件系统时要使用正确的参数
- 变更操作风险大
- 即使是看似简单的扩容操作,也可能导致严重问题
- 变更前、中、后都要进行充分的测试和验证
- 应急预案要常备
- 准备多个恢复方案(临时方案、永久方案)
- 定期进行灾难恢复演练
7.2 成功因素
- 快速定位问题
- 从Docker info的输出中立即发现了关键线索
- 系统日志提供了重要佐证
- 分层恢复策略
- 先用临时方案快速恢复业务
- 再在业务低峰期进行永久修复
- 最小化业务影响时间
- 充分的验证测试
- 从Docker系统到应用业务逐层验证
- 确保问题真正解决
7.3 改进方向
- 基础设施即代码(IaC)
- 使用Terraform、Ansible等工具管理基础设施
- 避免手动操作导致的人为错误
- 存储架构优化
- 考虑使用更稳定的存储方案
- 做好存储容量规划和监控
- 知识沉淀
- 将此次故障经验整理成案例
- 培训团队,避免类似问题再次发生
附录
A. 相关命令参考
| 命令 | 说明 |
| — | — |
| docker info | 查看Docker系统信息 |
| docker logs <container> | 查看容器日志 |
| journalctl -u docker | 查看Docker服务日志 |
| dmesg | 查看内核日志 |
| xfs_info <mountpoint> | 查看XFS文件系统信息 |
| df -Th | 查看文件系统信息 |
| mkfs.xfs -n ftype=1 <device> | 创建支持d_type的XFS文件系统 |
| docker inspect <container> | 查看容器详细信息 |
B. 参考文档
- Docker Overlay2 Storage Driver Documentation
- openEuler Docker Deployment Guide
- XFS Filesystem and d_type
- Docker Troubleshooting Guide
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:运维星火燎原 刘军军 刘军军《openEuler+Docker真实故障:新容器无法启动,30分钟从崩溃到恢复全记录》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论