无法启动守护进程:初始化网络控制器时出错:创建默认 "bridge" 网络时出错

failed to start daemon: Error initializing network controller: Error creating default "bridge" network

我正在使用 Fedora release 33 (Thirty Three) Docker 版本为 Docker version 20.10.0, build 7287ab3

首先我 运行 docker system prune 然后 docker 守护进程无法启动。

我运行systemctl start docker命令得到

Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.

然后systemctl status docker.service我得到了

● docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor pr>
     Active: failed (Result: exit-code) since Wed 2020-12-09 11:10:58 IST; 15s >
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
    Process: 10391 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/contai>
   Main PID: 10391 (code=exited, status=1/FAILURE)

Dec 09 11:10:58 barad-laptop systemd[1]: docker.service: Scheduled restart job,>
Dec 09 11:10:58 barad-laptop systemd[1]: Stopped Docker Application Container E>
Dec 09 11:10:58 barad-laptop systemd[1]: docker.service: Start request repeated>
Dec 09 11:10:58 barad-laptop systemd[1]: docker.service: Failed with result 'ex>
Dec 09 11:10:58 barad-laptop systemd[1]: Failed to start Docker Application Con>

然后sudo dockerd --debug得到

failed to start daemon: Error initializing network controller: Error creating default "bridge" network: Failed to program NAT chain: ZONE_CONFLICT: 'docker0' already bound to a zone

this Github issue相关

发现

$ firewall-cmd --get-active-zones
FedoraWorkstation
  interfaces: ens4u1u2 wlp59s0
docker
  interfaces: br-48d7d996793a
libvirt
  interfaces: virbr0
trusted
  interfaces: docker0

接口 docker0 似乎在 trusted 区域。 但是还有另一个区域叫做 docker.

所以我决定试一试并将其添加到 docker 区域。

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

之后看起来像这样:

$ firewall-cmd --get-active-zones
FedoraWorkstation
  interfaces: ens4u1u2 wlp59s0
docker
  interfaces: br-48d7d996793a docker0
libvirt
  interfaces: virbr0

似乎有效。
也许有人可以对此有更多的了解。

编辑: 添加了 firewall-cmd --reload 如评论中所指出的

我在我的 Fedora 32 上升级 docker-ce 后出现了这个错误。看起来新的 docker 与您在 the article 中提到的手动防火墙配置冲突回答。我的机器上有启用容器到容器通信的规则。

Docker 在我还原防火墙规则后成功启动:

sudo firewall-cmd --permanent --zone=trusted --remove-interface=docker0
sudo firewall-cmd --permanent --zone=FedoraWorkstation --remove-masquerade
sudo firewall-cmd --reload
sudo systemctl restart docker

这些更改似乎不会影响容器相互通信的能力。

由于类似的问题,我从信任区域中删除了 docker0,重新加载了防火墙,并且还从 /etc/docker

中删除了 daemon.json
sudo firewall-cmd --get-active-zones

sudo firewall-cmd --permanent --zone=trusted --remove-interface=docker0
sudo firewall-cmd --reload

sudo rm -rf /etc/docker/daemon.json # or mv to another location

然后用sudo systemctl restart docker重新启动docker服务。