Ubuntu 22.04下从Snap迁移到 APT 安装的 Docker 导致系统崩溃的排查与解决实录

Ubuntu 22.04下从Snap迁移到 APT 安装的 Docker 导致系统崩溃的排查与解决实录

我原以为,将Docker从 Snap 安装方式迁移到 APT,会带来更高的灵活性和兼容性。事实却恰恰相反——我亲手将一台运行良好的 Hetzner 根服务器“整瘫痪”了。

这篇文章记录了我在 Ubuntu 22.04 上将 Docker 从 Snap 切换为 APT 后所遇到的系统崩溃问题,以及我如何逐步排查并解决问题的全过程。希望能为遇到类似困境的开发者提供参考。

一、从 Snap 切换到 APT 后问题频发

这台服务器是我在 Hetzner 上的独立物理机,配置为:

  • CPU: Intel i7-7700
  • 内存: 64GB RAM + 32GB Swap
  • 系统: Ubuntu 22.04.5 LTS
  • Docker 版本: 28.2.2(APT 安装,build e6534b4)

之前,我一直使用 Snap 版本的 Docker,运行多个容器稳定如初。直到某天我尝试部署 Taiga 项目,发现 Snap 安装的 Docker 无法正常支持其容器构建需求。于是我卸载了 Snap 的 Docker,改用官方推荐的 APT 安装方式:

sudo snap remove docker
sudo apt remove docker docker.io containerd runc

sudo apt update
sudo apt install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
    gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu jammy stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

至此 Docker 安装完成,服务能正常启动,也能拉取镜像。但从那一刻开始,每当我启动 Docker 服务,服务器就会在数分钟后无响应并崩溃,无法 SSH,Ping 也不通。

二、问题表现:系统无预警崩溃、不可访问

我做了以下实验验证:

  • 启动 Docker 服务后,即使没有运行任何容器,系统仍会在大约 5–10 分钟后崩溃;
  • 崩溃期间没有系统日志写入 /var/log;
  • 内存和 CPU 占用并不异常(我在 htop 中持续观察,内存约 1.4GB,CPU 基本空闲);
  • swap 使用情况也正常,df 显示磁盘未满。

每次系统死后,我都需要通过 Hetzner 的救援模式进入、挂载原系统分区,然后手动关闭 Docker 开机启动:

systemctl disable docker
systemctl disable containerd

然后才能正常重启并恢复使用。

三、逐步排查:怀疑点与验证过程

1. 怀疑 containerd 版本不兼容

APT 安装的 Docker 依赖 containerd,而 Snap 安装会独立打包自己的 runtime。通过以下命令验证当前使用的 containerd:

containerd --version

我尝试用如下命令替换为 Docker 官方稳定版本:

sudo apt install containerd.io=1.6.20-1

仍然崩溃,说明并非 containerd 单一问题。

2. 检查 systemd 服务依赖链与内核模块冲突

我查看了 Docker 服务的依赖关系:

systemctl status docker
journalctl -xeu docker

无明显报错。转而查看 dmesg 中是否有内核 panic 或 I/O 锁死提示:

dmesg -T | tail -n 100

结果显示当 Docker 启动后系统运行几分钟内会有某些 cgroup v2 相关的内核调用堆栈触发资源锁死,疑似为 Docker 和系统资源调度器之间的冲突。

3. 确认是否为 overlay2 存储驱动导致的问题

Docker 默认使用 overlay2,而我注意到我的 Hetzner 系统分区可能挂载在不支持 d_type 的文件系统上。验证方式如下:

docker info | grep -i storage

并查看具体挂载信息:

findmnt -no FSTYPE /var/lib/docker

确认如果是 ext4 或 xfs 文件系统,需要挂载参数 ftype=1 才支持 overlay2。否则可以尝试切换为 devicemapper(不推荐)或 fuse-overlayfs(兼容性更好):

sudo apt install fuse-overlayfs
sudo mkdir -p /etc/docker
echo '{
  "storage-driver": "fuse-overlayfs"
}' | sudo tee /etc/docker/daemon.json

sudo systemctl daemon-reexec
sudo systemctl restart docker

此步骤后,我的系统不再出现崩溃现象,Docker 可以正常运行。

四、最终方案

我将目前可稳定运行的配置总结如下:

✅ 替换 Overlay2 为 Fuse-OverlayFS:

sudo apt install fuse-overlayfs

✅ 修改 Docker 配置文件 /etc/docker/daemon.json:

{
  "storage-driver": "fuse-overlayfs"
}

✅ 禁用 Snap 残留配置,彻底清除:

sudo apt purge snapd
sudo rm -rf /var/lib/snapd

✅ 检查是否启用了 Systemd 的 swap 限制(建议禁用):

sudo systemctl edit docker

添加以下配置:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --exec-opt native.cgroupdriver=systemd

五、反思与建议

这次的踩坑过程提醒我:

  • Snap 与 APT 安装的 Docker 区别不只是包装方式,底层运行时、驱动兼容性都可能存在巨大差异;
  • Docker 存储驱动对系统文件系统有特定要求,尤其是 overlay2;
  • 如果系统在不跑容器的前提下,只是启动 Docker Daemon 就崩溃,问题很可能出在 存储驱动或 CGroup 与内核的兼容性问题 上;
  • “一切正常”并不代表“未来可预测”。Docker 的底层机制更复杂,一定要读官方文档并验证系统支持。

如果你也遇到类似问题,不妨从存储驱动、CGroup 驱动、内核日志等方向深入排查,不要只依赖表面资源监控工具(如 htop 和 df)。

未经允许不得转载:A5数据 » Ubuntu 22.04下从Snap迁移到 APT 安装的 Docker 导致系统崩溃的排查与解决实录

相关文章

contact