openEuler+Docker真实故障:新容器无法启动,30分钟从崩溃到恢复全记录

admin 2026-07-14 04:53:00 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 故障根因是XFS文件系统创建时未启用dtype支持(ftype=0),导致Overlay2存储驱动无法挂载容器层。排查通过检查dtype支持、系统日志和历史变更确认问题。紧急方案切换存储驱动为devicemapper快速恢复业务,永久方案需重新创建XFS文件系统并启用ftype=1。建议创建XFS卷时指定-nftype=1。 综合评分: 88 文章分类: 实战经验


cover_image

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存储驱动无法正常工作

详细过程:

  1. 凌晨运维人员为了扩容,重新创建了/var/lib/docker的LVM卷
  2. 新创建的XFS文件系统使用了错误的参数:ftype=0(默认在某些旧版本是0)
  3. 而Overlay2存储驱动必须要求XFS文件系统开启ftype=1(d_type支持)
  4. 当Docker尝试启动新容器时,Overlay2无法创建所需的挂载
  5. 旧容器虽然还在运行,但新容器都无法启动
  6. 滚动更新失败,导致服务中断

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&nbsp;> /etc/docker/daemon.json <<&nbsp;'EOF'
{
&nbsp;&nbsp;"storage-driver":&nbsp;"devicemapper"
}
EOF

# 5. 启动Docker
$ systemctl&nbsp;start&nbsp;docker

# 6. 重新拉取镜像并启动容器
$ docker&nbsp;pull registry.example.com/order-service:v2.1
$ docker-compose&nbsp;-f&nbsp;docker-compose.yml up&nbsp;-d

结果: 业务在15分钟内恢复!


4.2 永久修复方案

时间: 2026-06-01 14:00:00(业务低峰期)

# 1. 停止所有容器和Docker
$ docker-compose&nbsp;-f&nbsp;docker-compose.yml down
$ systemctl&nbsp;stop&nbsp;docker

# 2. 重新创建正确的XFS文件系统
$ umount&nbsp;/var/lib/docker
$ lvremove&nbsp;-y&nbsp;/dev/vg_docker/docker-temp
$ lvremove&nbsp;-y&nbsp;/dev/vg_docker/docker
$ lvcreate&nbsp;-L&nbsp;500G&nbsp;-n&nbsp;docker vg_docker

# 关键:使用ftype=1创建XFS
$ mkfs.xfs&nbsp;-n&nbsp;ftype=1&nbsp;/dev/vg_docker/docker

# 3. 挂载并验证
$ mount&nbsp;/dev/vg_docker/docker /var/lib/docker
$ xfs_info&nbsp;/var/lib/docker |&nbsp;grep&nbsp;ftype
naming &nbsp;&nbsp;=version&nbsp;2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;bsize=4096&nbsp; &nbsp;ascii-ci=0,&nbsp;ftype=1

# 4. 恢复Docker配置,改回overlay2
$ cat&nbsp;> /etc/docker/daemon.json <<&nbsp;'EOF'
{
&nbsp;&nbsp;"storage-driver":&nbsp;"overlay2",
&nbsp;&nbsp;"log-driver":&nbsp;"json-file",
&nbsp;&nbsp;"log-opts": {
&nbsp; &nbsp;&nbsp;"max-size":&nbsp;"100m",
&nbsp; &nbsp;&nbsp;"max-file":&nbsp;"3"
&nbsp; }
}
EOF

# 5. 从备份恢复镜像和容器(或者重新拉取)
# 这里选择重新拉取,更干净

# 6. 启动Docker
$ systemctl&nbsp;start&nbsp;docker

# 7. 拉取所有镜像
$ docker-compose&nbsp;-f&nbsp;docker-compose.yml pull

# 8. 启动所有服务
$ docker-compose&nbsp;-f&nbsp;docker-compose.yml up&nbsp;-d

# 9. 设置开机自动挂载
$ blkid&nbsp;/dev/vg_docker/docker
/dev/vg_docker/docker:&nbsp;UUID="kkk3333-llll-4444-5555-mmmm6666"TYPE="xfs"

$ echo'UUID="kkk3333-llll-4444-5555-mmmm6666" /var/lib/docker xfs defaults 0 0'&nbsp;>> /etc/fstab

五、验证测试

5.1 Docker系统验证

# 验证Overlay2和d_type
$ docker&nbsp;info |&nbsp;grep&nbsp;-A&nbsp;5&nbsp;-B&nbsp;5&nbsp;"Supports d_type"
&nbsp;Storage Driver: overlay2
&nbsp; Backing Filesystem: xfs
&nbsp; Supports d_type:&nbsp;true
&nbsp; Native Overlay Diff:&nbsp;true
&nbsp; userxattr:&nbsp;false

# 验证文件系统
$ xfs_info&nbsp;/var/lib/docker |&nbsp;grep&nbsp;ftype
naming &nbsp;&nbsp;=version&nbsp;2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;bsize=4096&nbsp; &nbsp;ascii-ci=0,&nbsp;ftype=1

# 测试创建容器
$ docker&nbsp;run&nbsp;--rm&nbsp;-it&nbsp;alpine&nbsp;echo"Test container created successfully"
Test container created successfully

5.2 业务应用验证

# 检查所有容器状态
$ docker-compose&nbsp;-f&nbsp;docker-compose.yml&nbsp;ps
NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;COMMAND &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SERVICE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; STATUS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PORTS
order-service-1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"java -jar /app/ord…"&nbsp; &nbsp;order-service &nbsp; &nbsp; &nbsp; running &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;0.0.0.0:8080->8080/tcp
user-center-1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"java -jar /app/user…"&nbsp; &nbsp;user-center &nbsp; &nbsp; &nbsp; &nbsp; running &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;0.0.0.0:8081->8081/tcp
payment-service-1 &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"java -jar /app/pay…"&nbsp; &nbsp;payment-service &nbsp; &nbsp; running &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;0.0.0.0:8082->8082/tcp

# 检查服务健康
$ curl&nbsp;http://localhost:8080/actuator/health
{"status":"UP"}

# 验证业务功能
$ curl&nbsp;-X&nbsp;POST http://localhost:8080/api/orders \
&nbsp;&nbsp;-H"Content-Type: application/json"&nbsp;\
&nbsp;&nbsp;-d'{"userId":1,"productId":1001,"quantity":2}'
{"orderId":10001,"status":"created"}

六、预防措施

6.1 技术预防

  1. 创建XFS文件系统标准操作指南
   # 正确创建Docker存储的XFS文件系统
   mkfs.xfs&nbsp;-nftype=1&nbsp;/dev/your-device

   # 验证ftype
   xfs_info /mountpoint |&nbsp;grep&nbsp;ftype
   # 期望输出: ftype=1
  1. Docker部署检查清单
  • 检查存储驱动配置
  • 验证文件系统d_type支持
  • 测试创建和删除容器
  • 配置监控告警
  1. 自动化检查脚本
   #!/bin/bash
   # Docker存储检查脚本

   echo&nbsp;"=== 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&nbsp;$NF}')

   if&nbsp;[&nbsp;"$D_TYPE"="true"&nbsp;];&nbsp;then
   &nbsp; &nbsp;&nbsp;echo"✓ d_type support: OK"
   else
   &nbsp; &nbsp;&nbsp;echo"✗ d_type support: FAILED!"
   &nbsp; &nbsp;&nbsp;exit1
   fi

   # 检查文件系统
   FS_TYPE=$(df -Th /var/lib/docker | awk 'NR==2{print&nbsp;$2}')
   echo"File System:&nbsp;$FS_TYPE"

   if&nbsp;[&nbsp;"$FS_TYPE"="xfs"&nbsp;];&nbsp;then
   &nbsp; &nbsp;&nbsp;FTYPE=$(xfs_info /var/lib/docker 2>/dev/null | grep -oP 'ftype=\K\d+')
   &nbsp; &nbsp;&nbsp;if&nbsp;[&nbsp;"$FTYPE"="1"&nbsp;];&nbsp;then
   &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;echo&nbsp;"✓ XFS ftype=1: OK"
   &nbsp; &nbsp;&nbsp;else
   &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;echo&nbsp;"✗ XFS ftype not equal to 1: FAILED!"
   &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;exit&nbsp;1
   &nbsp; &nbsp;&nbsp;fi
   fi

   echo&nbsp;"=== All checks passed! ==="
   exit0

6.2 流程改进

  1. 变更审批流程
  • 任何生产环境文件系统变更必须经过审批
  • 变更前必须有完整的回滚方案
  1. 运维操作标准化
  • 创建标准操作手册(SOP)
  • 定期进行运维技能培训
  1. 监控告警
  • 监控Docker服务健康状态
  • 监控文件系统使用情况
  • 配置容器启动失败告警

七、经验总结

7.1 关键教训

  1. 存储驱动选择至关重要
  • Overlay2是Docker推荐的驱动,但有文件系统要求
  • 生产环境部署前必须验证存储驱动兼容性
  1. 文件系统参数不可忽视
  • XFS的ftype参数是Overlay2的必需条件
  • 重新创建文件系统时要使用正确的参数
  1. 变更操作风险大
  • 即使是看似简单的扩容操作,也可能导致严重问题
  • 变更前、中、后都要进行充分的测试和验证
  1. 应急预案要常备
  • 准备多个恢复方案(临时方案、永久方案)
  • 定期进行灾难恢复演练

7.2 成功因素

  1. 快速定位问题
  • 从Docker info的输出中立即发现了关键线索
  • 系统日志提供了重要佐证
  1. 分层恢复策略
  • 先用临时方案快速恢复业务
  • 再在业务低峰期进行永久修复
  • 最小化业务影响时间
  1. 充分的验证测试
  • 从Docker系统到应用业务逐层验证
  • 确保问题真正解决

7.3 改进方向

  1. 基础设施即代码(IaC)
  • 使用Terraform、Ansible等工具管理基础设施
  • 避免手动操作导致的人为错误
  1. 存储架构优化
  • 考虑使用更稳定的存储方案
  • 做好存储容量规划和监控
  1. 知识沉淀
  • 将此次故障经验整理成案例
  • 培训团队,避免类似问题再次发生

附录

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分钟从崩溃到恢复全记录》

绕过权限 网络安全文章

绕过权限

文章总结: 本文分享了一个前端权限绕过案例。作者发现目标系统验证密码后会在浏览器LocalStorage写入状态参数,通过分析JS手动添加该参数并赋值为true
评论:0   参与:  0