Ubuntu 22.04 的 ECS 上系统做过安全加固,重启 dockerd 之后所有容器都是 Created 状态,docker logs 里一行 Error starting daemon: Error initializing network controller 后面跟着 iptables: Chain already exists,dockerd 直接退出。

一开始怀疑是「docker 版本从 20.10 升到 24.0 之后表结构变了,旧规则没跟着重建」,查了一圈,方向不对。

把日志和配置对完,能解释这个现象的基本就这几处。加固脚本自己建了 DOCKER 和 DOCKER-USER 两条链,dockerd 启动时再去建就撞了名。还有一种是残留的 iptables 规则和 docker 的默认表结构对不上,初始化时校验不通过。

不容易想到的是,有人用 iptables -F 清过表,docker 依赖的链被删了一半。

动手时先把现有的 docker 相关链列出来留底

iptables-save | grep -E 'DOCKER|docker' > /root/ipt_bak.txt

随后停掉 docker 服务,清空残留的自建链

systemctl stop docker && iptables -t nat -F DOCKER-USER

接着让 docker 自己重建整套规则再启动

systemctl start docker && docker network ls

等前面都确认过,再确认容器能拿到地址并正常出网

docker run --rm alpine ip route

改完先别撤,确认这几项。dockerd 正常启动不再退出,docker ps 里容器全部 Up,新建的容器能拿到 172.17 段地址并且能 ping 通外网。

清链之前一定先 iptables-save 留底,DOCKER-USER 里往往有业务方自己加的放行规则,重建后要按备份补回去。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189