CentOS 7 断电重启后 Docker 无法启动的问题

服务器因意外断电导致Docker服务未启动,手动启动时遇到服务尝试次数过多的错误。通过`systemctl status docker`和`systemctl reset-failed docker.service`尝试解决问题,但未成功。进一步检查发现是防火墙服务firewalld与Docker存在冲突。错误信息显示‘docker0’已绑定到某个区域。解决方案是使用`firewall-cmd`命令更改docker0接口的防火墙区域,并重启firewalld服务。问题解决后,Docker服务成功启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、问题记录

服务器意外断电重启之后,发现 Docker 服务没有启动,于是手动执行启动命令

systemctl start docker

启动失败,报错如下

Job for docker.service failed because start of the service was attempted too often. See "systemctl status docker.service" and "journalctl -xe" for details.
To force a start use "systemctl reset-failed docker.service" followed by "systemctl start docker.service" again.

按照提示执行重置错误,再次启动依然报错

systemctl reset-failed docker.service

查看 Docker 服务状态

systemctl status docker

状态信息如下,没有什么有价值的信息

● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since 一 2022-04-18 09:13:21 CST; 29s ago
     Docs: https://docs.docker.com
  Process: 11997 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE)
 Main PID: 11997 (code=exited, status=1/FAILURE)

418 09:13:21 master1 systemd[1]: start request repeated too quickly for docker.service
418 09:13:21 master1 systemd[1]: Failed to start Docker Application Container Engine.
418 09:13:21 master1 systemd[1]: Unit docker.service entered failed state.
418 09:13:21 master1 systemd[1]: docker.service failed.
418 09:13:21 master1 systemd[1]: start request repeated too quickly for docker.service
418 09:13:21 master1 systemd[1]: Failed to start Docker Application Container Engine.
418 09:13:21 master1 systemd[1]: docker.service failed.
418 09:13:21 master1 systemd[1]: start request repeated too quickly for docker.service
418 09:13:21 master1 systemd[1]: Failed to start Docker Application Container Engine.
418 09:13:21 master1 systemd[1]: docker.service failed.

2、问题分析

Docker 服务启动失败大概率是以下两种问题:

  • 防火墙策略
  • /etc/docker/daemon.json 配置文件

在确认过配置文件没有问题后(将所有配置都注释掉,依然无法启动),按照防火墙的问题进行排查。

# 查看防火墙状态
systemctl status firewalld

果然问题在防火墙

● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 一 2022-04-18 08:53:37 CST; 25min ago
     Docs: man:firewalld(1)
 Main PID: 1607 (firewalld)
    Tasks: 2
   Memory: 22.6M
   CGroup: /system.slice/firewalld.service
           └─1607 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

418 09:17:40 master1 firewalld[1607]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D OUTPUT -m addrtype --dst-type LOCAL ! --dst 127.0.0.0/8 -j DOCKER' fail...y that name.
418 09:17:40 master1 firewalld[1607]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D OUTPUT -m addrtype --dst-type LOCAL -j DOCKER' failed: iptables: No cha...y that name.
418 09:17:40 master1 firewalld[1607]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D PREROUTING' failed: iptables: Bad rule (does a matching rule exist in that chain?).
418 09:17:40 master1 firewalld[1607]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D OUTPUT' failed: iptables: Bad rule (does a matching rule exist in that chain?).
418 09:17:40 master1 firewalld[1607]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -F DOCKER-ISOLATION' failed: iptables: No chain/target/match by that name.
418 09:17:40 master1 firewalld[1607]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER-ISOLATION' failed: iptables: No chain/target/match by that name.
418 09:17:40 master1 firewalld[1607]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed: iptables: Bad rule (does a matc...hat chain?).
418 09:17:40 master1 firewalld[1607]: ERROR: ZONE_CONFLICT: 'docker0' already bound to a zone
418 09:17:40 master1 firewalld[1607]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed: iptables: Bad rule (does a matc...hat chain?).
418 09:17:40 master1 firewalld[1607]: ERROR: ZONE_CONFLICT: 'docker0' already bound to a zone
Hint: Some lines were ellipsized, use -l to show in full.

根据 ZONE_CONFLICT: 'docker0' already bound to a zone 这个错误提示,找到对应的解决办法
参考博客地址 https://www.cnblogs.com/wxbn/p/15057806.html


3. 问题解决
  1. 查看防火墙中是否存在 docker0
    firewall-cmd --get-active-zones
    
  2. 变更接口为 docker0 并重启防火墙服务
    sudo firewall-cmd --permanent --zone=docker --change-interface=docker0 
    sudo systemctl restart firewalld
    
  3. 启动 Docker 服务,正常
    systemctl start docker
    
### 解决方案概述 在 Ubuntu 18.04 上,由于默认的 glibc 版本为 2.27,低于 Visual Studio Code (VSCode) v1.95 所需的最低版本 GLIBC_2.28,因此需要通过旁路安装较高版本的 glibc 来解决兼容性问题。此外,针对 NVIDIA 容器工具包 APT 源配置过程中可能出现的 ‘Unsupported distribution or misconfigured repository settings’ 错误,也需要采取相应措施。 --- ### 一、旁路安装较高版本的 Glibc(如 2.29) #### 步骤 1:准备编译环境 确保系统已安装必要的开发工具和依赖项: ```bash sudo apt update sudo apt install -y build-essential checkinstall libc6-dev-i386 gcc-multilib ``` #### 步骤 2:下载并解压 Glibc 源码 从 GNU 官方网站获取目标版本的源码包,并解压缩: ```bash wget https://ftp.gnu.org/gnu/glibc/glibc-2.29.tar.gz tar -xf glibc-2.29.tar.gz cd glibc-2.29 ``` #### 步骤 3:创建独立构建目录 为了避免覆盖系统现有的 glibc 文件,建议在一个专用子目录中完成编译过程: ```bash mkdir build cd build ``` #### 步骤 4:配置并编译 Glibc 指定安装路径以避免干扰现有系统组件: ```bash ../configure --prefix=/opt/glibc-2.29 make -j$(nproc) sudo make install ``` 此操作将在 `/opt/glibc-2.29` 路径下安装完整的 glibc 库文件[^1]。 #### 步骤 5:调整 VSCode 启动脚本 为了使 VSCode 使用新版本的 glibc,可通过修改其启动脚本来设置 `LD_LIBRARY_PATH` 环境变量: ```bash #!/bin/bash export LD_LIBRARY_PATH="/opt/glibc-2.29/lib:$LD_LIBRARY_PATH" exec /usr/share/code/bin/code "$@" ``` 将上述内容保存为可执行脚本(例如 `/usr/local/bin/vscode-glibc`),赋予执行权限后即可通过该脚本启动 VSCode。 --- ### 二、正确配置 NVIDIA 容器工具包的 APT 源 #### 步骤 1:添加官方密钥 首先导入 NVIDIA 提供的安全签名密钥: ```bash curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg ``` #### 步骤 2:注册 APT 源地址 根据当前 Linux 发行版代号(对于 Ubuntu 18.04 是 `bionic`),生成适合的 APT 配置文件: ```bash distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -fsSL https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \ sed 's#deb|#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg]#' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list ``` #### 步骤 3:更新本地索引 刷新 APT 缓存以同步新增加的内容: ```bash sudo apt update ``` #### 步骤 4:安装必要组件 最后一步是实际安装所需的 NVIDIA 工具集及其关联依赖关系: ```bash sudo apt install -y nvidia-docker2 docker-ce-cli containerd.io ``` 完成后重启 Docker 服务来激活插件支持: ```bash sudo systemctl restart docker ``` --- ### 注意事项 尽管上述方法有效解决了两个主要的技术障碍,但在实施前仍需注意以下几点潜在隐患: - **稳定性风险**:引入第三方维护的核心库可能导致某些原生应用程序行为异常; - **安全性考量**:手动管理关键基础架构增加了人为失误概率以及暴露攻击面的机会; - **长期维护成本**:随着上游项目迭代推进,持续跟踪补丁进展变得尤为重要。 务必权衡利弊后再决定是否采纳此类非常规手段。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值