启动后使用命令卡顿

containerd 服务启动失败,使用命令 journalctl -xe -u containerd 查看日志如下所示:

docker panic invalid freelist pagexx

首先得根据这个 panic 的堆栈,调用关系是 main.main -> cobra -> docker daemon -> daemon.(*Daemon).restore -> initNetworkController -> libnetwork/datastore/cache -> boltdb
docker 使用了 boltdb 存储了网络信息成 db 文件,但是这个 db 文件损坏了,导致读取字节序列化错误类型,去 docker 的目录 find 下:

[root@weizb-2 ~]# find /var/lib/docker -type f -size -5M -name '*.db' | grep -v overlay
/var/lib/docker/volumes/metadata.db
/var/lib/docker/network/files/local-kv.db
/var/lib/docker/buildkit/containerdmeta.db
/var/lib/docker/buildkit/snapshots.db
/var/lib/docker/buildkit/metadata_v2.db
/var/lib/docker/buildkit/cache.db

改名 db 文件重启 docker 解决

mv /var/lib/docker/network/files/local-kv.db{,.bak}
systemctl restart docker

重启后,网络配置丢失。

root@ubutnu:/mydata# docker start 737171ee8f06
Error response from daemon: network c0cac53778b3c6234963c7195fc248c5a255e99908463bd7ba55be628a9746c8 not found
Error: failed to start containers: 737171ee8f06

docker network create -d bridge c0cac53778b3c6234963c7195fc248c5a255e99908463bd7ba55be628a9746c8