记一次 Docker 启动失败解决方案

前言

近日,Docker 容器总是无法上网,提示 “No route to host”。且此时重启 Docker 服务会报错。

我使用的系统是 RockyLinux 8

查错

networks have same bridge name

使用 systemctl start docker 命令启动 Docker,失败。

于是使用 journalctl -xe 查看日志。

Error starting daemon: Error initializing network controller: Error creating default "bridge" network: cannot create network xxxxxxxxxxxxxxxxxxxxx (docker0): conflicts with network xxxxxxxxxxxxxxxxxx (docker0): networks have same bridge name
问题似乎出在 /var/docker/network/。存储了许多通过旧 ID 引用 网桥(Bridge) 的套接字。要解决这个问题,您可以删除所有套接字,删除接口,然后启动 docker,但所有容器都将拒绝工作,因为它们的套接字消失了。就我而言,我并不关心我的无状态容器,所以这解决了问题

先尝试更简单的方案

sudo rm -rf /var/lib/docker/network
sudo systemctl start docker

如果仍启动失败,再尝试:

ip link del docker0
rm -rf /var/docker/network/*
mkdir /var/docker/network/files
systemctl start docker
# 删除所有容器
docker ps -a | cut -d' ' -f 1 | xargs -n 1 echo docker rm  -f
# 重新创建所有容器

Firewalld: docker zone already exists

先查看当前活动的区域:firewall-cmd --get-active-zones
可能会遇到以下情况:

[root@RockyLinux ~]# firewall-cmd --get-active-zones
libvirt
  interfaces: virbr0
public
  interfaces: ens18, docker0
trusted
  sources: 192.168.6.0/24
[root@RockyLinux ~]# firewall-cmd --get-active-zones
libvirt
  interfaces: virbr0
public
  interfaces: ens18
trusted
  interfaces: docker0
  sources: 192.168.6.0/24

以上情况,我均无法启动 Docker。
解决方案是把 docker0 接口移动到名为 docker 的区域。

sudo firewall-cmd --permanent --zone=docker --change-interface=docker0
sudo firewall-cmd --reload

然后再查看区域,应该像这样:

[root@RockyLinux ~]# firewall-cmd --get-active-zones
docker
  interfaces: docker0
libvirt
  interfaces: virbr0
public
  interfaces: ens18
trusted
  sources: 192.168.6.0/24

然后再启动 docker 即可。

参考与鸣谢

https://stackoverflow.com/questions/40524602/error-creating-default-bridge-network-cannot-create-network-docker0-confli
https://stackoverflow.com/questions/67497455/failed-to-start-docker-daemon-firewalld-docker-zone-already-exists

本文链接:

https://blog.nkxingxh.top/archives/337/
1 + 7 =
快来做第一个评论的人吧~