docker中的应用被 “僵尸” 了怎么办?

  • 环境:VPS 上跑着 Docker + MySQL 容器,本来好好的,有天突然容器死活停不了/进不去/各种崩。
  • 报错:提示 “Read-only file system”,touch 也写不进,Docker 重启失败。
  • 结论:根分区出现文件系统错误,系统为了保护数据,强行把 /dev/vda1 挂载成只读,导致一切读写操作 GG。

 

处理思路

1. 确认真的只读了吗?

  • df -hdf -i 看磁盘容量/inode,还蛮富裕,但不能高兴太早。
  • touch /var/lib/docker/testfile 直接跳 “Read-only file system” 错误。
  • dmesg | tail 里清清楚楚写着:
    python-repl
    EXT4-fs (vda1): Remounting filesystem read-only
    ...
    Detected aborted journal
    ...

    说明真的是文件系统炸了。

2. 进入救援模式 (Rescue/Recovery Mode)

因为根分区已经被系统“只读”挂载,在正常环境下无法 fsck

  • 不同 VPS 的救援模式入口略有不同,一般在云面板上找 “Rescue Mode” 或 “Recovery Mode”。
  • 重启后 SSH 登录到救援系统,根分区 /dev/vda1 此刻只作为一块数据盘/甚至可能没自动挂载。

3. fsck 修复文件系统

在救援模式里,对该分区执行:

bash
fsck -f -y /dev/vda1
  • -f 强制彻底检查。
  • -y 遇到错误自动修复(省得你一个个按 Y 答应它)。
  • 如果日志里出现 “FILE SYSTEM WAS MODIFIED”,恭喜你成功治愈它了。

4. 重启回正常系统

  • 在救援系统里敲 reboot 退出救援模式(或在面板里关掉“Rescue Mode”)。
  • 系统正常引导以后,再次 SSH 进入。

5. 验证是否读写OK

回到正常系统后:

  1. mount | grep '/dev/vda1' 看是否挂载了 rw 而非 ro
  2. touch /var/lib/docker/testfile 测试一下能不能写,不再报只读就成功啦。

6. 重启 Docker 并检查容器

  1. systemctl start docker
  2. docker ps -a 看看容器列表都还在不在。
  3. 如果有容器停止了,就 docker start <容器名>;如果要进容器,则 docker exec -it <容器名> bash
  4. MySQL 等应用基本就能复活啦!

 

注意事项

  1. 先备份重要数据
    虽然在只读状态下读取问题不大,但修复前最好把关键文件拷走,万一坏块严重,修复过程可能出现意外损坏。

  2. 观察磁盘健康
    如果频繁出现“EXT4-fs error”之类,可能是硬盘本身真坏了,要么联系云厂商,要么升级换盘。

  3. 适度监控
    一旦出现只读,/var/log 也写不进日志,会给系统运维带来大麻烦。可以给磁盘跑跑健康检查,比如 smartctl(硬盘支持的情况下)或者云厂商自带的体检工具。


小结

当 VPS 提示 “Read-only file system”,十有八九是分区文件系统出错,系统自动“帮”你启用只读保护。修复要点就是进救援模式下跑 fsck,然后重启。Docker/MySQL 这类依赖写操作的家伙,才能继续愉快地蹦跶。

以上就是“VPS 文件系统只读 + Docker/MySQL 僵尸大作战”的完整经验贴啦。希望能帮到和你境况相似的小伙伴们,一起远离“读写阻塞”的阴影,恢复幸福快乐的远程运维生活!

© 版权声明
THE END
喜欢就支持一下吧
点赞182 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容