记一次 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