通过编写修复脚本修复 Docker 启动失败(二)

在使用 Docker 时,遇到启动失败或无法连接 Docker 守护进程的情况是非常常见的。错误信息如:​编辑

bash 复制代码
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/d9b2c13a992645d597d0539035a94b28~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgMzYwX2dvX3BocA==:q75.awebp?rk3s=f64ab15b&x-expires=1761440751&x-signature=gS8bxhnlYjOm4B1agM6gn7pdaKM%3D)![](<> "点击并拖拽以移动")​编辑  
```![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/c02613f909874274a39305ca6eed9f05~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgMzYwX2dvX3BocA==:q75.awebp?rk3s=f64ab15b&x-expires=1761440751&x-signature=bvJ0e1JNWJi4TjxpQWq4Nky71M4%3D)![](<> "点击并拖拽以移动")​编辑

或者:

-bash: cd: /var/run/docker.sock: No such file or directory​编辑

Failed to start Docker Application Container Engine.

!(https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/fb3a0dd80f14453fa7703cca19f0a4c7~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgMzYwX2dvX3BocA==:q75.awebp?rk3s=f64ab15b&x-expires=1761440751&x-signature=cst5BUoZyY0%2FEH49vMG0XXMvsHg%3D)![](<> 复制代码
>同时,可能还会遇到如下输出:

cat /etc/docker/daemon.json 2>/dev/null || echo "No daemon.json found"

No daemon.json found

markdown 复制代码
这些错误提示表明 Docker 守护进程没有启动,且必要的文件(如 `/var/run/docker.sock` 和 `/etc/docker/daemon.json`)丢失或损坏。本文将提供一种通过编写脚本自动修复这些问题的方法,帮助我们快速恢复 Docker 的正常运行。![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/bf124f9ac97841abb9363063eab5145d~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgMzYwX2dvX3BocA==:q75.awebp?rk3s=f64ab15b&x-expires=1761440751&x-signature=VFTCBn8bvS%2FjMkIIbQtiLBOheFw%3D)![](<> "点击并拖拽以移动")​编辑

### 错误分析

1. **无法连接到 Docker 守护进程**:  
   这通常意味着 Docker 守护进程未启动,或者 `docker.sock` 文件丢失或权限问题。

2. **`/var/run/docker.sock` 丢失**:  
   该文件是 Docker 客户端与 Docker 守护进程之间通信的 Unix socket 文件。如果它丢失或损坏,Docker 客户端无法正常工作。

3. **`/etc/docker/daemon.json` 文件丢失**:  
   `daemon.json` 是 Docker 配置文件,包含 Docker 守护进程的启动配置。如果该文件丢失,Docker 可能无法加载配置,导致启动失败。![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/a61944bf7c9c485e83ff1b37b933409c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgMzYwX2dvX3BocA==:q75.awebp?rk3s=f64ab15b&x-expires=1761440751&x-signature=JVbdyDiUViilVU9E%2BH0qt5tb0WU%3D)![](<> "点击并拖拽以移动")​编辑

### 修复步骤

我们可以通过编写一个简单的修复脚本 `fix_docker.sh` 来自动修复这些问题。该脚本将执行以下操作:

- 检查并重启 Docker 服务。  
- 创建缺失的配置文件 `/etc/docker/daemon.json`。  
- 确保 Docker socket 文件 `/var/run/docker.sock` 存在。  
- 输出 Docker 服务的状态信息以便进一步调试。

### 编写修复脚本 `fix_docker.sh`![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/56a38c17ce1146b78f23d875c175c922~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgMzYwX2dvX3BocA==:q75.awebp?rk3s=f64ab15b&x-expires=1761440751&x-signature=kTlj1O4rsEmAexPU5Orwma1%2BlMY%3D)![](<> "点击并拖拽以移动")​编辑

```bash  
#!/bin/bash

# 设置日志文件

#!/bin/bash echo "=== 修复 Docker Socket 激活问题 ==="

1. 停止服务

echo "1. 停止相关服务..." systemctl stop docker docker.socket 2>/dev/null pkill -f dockerd sleep 2

2. 重置 systemd 限制

echo "2. 重置 systemd 限制..." systemctl reset-failed docker docker.socket systemctl unmask docker docker.socket

3. 确保 socket 目录存在

echo "3. 检查运行时目录..." mkdir -p /var/run chmod 755 /var/run

4. 启动 socket 服务

echo "4. 启动 docker.socket..." systemctl start docker.socket systemctl enable docker.socket

5. 检查 socket 文件

echo "5. 检查 socket 文件..." sleep 2 if [ -S /var/run/docker.sock ]; then echo "✓ Docker socket 创建成功" ls -la /var/run/docker.sock else echo "✗ Docker socket 未创建,尝试手动修复..." # 手动启动 dockerd 创建 socket /usr/bin/dockerd & sleep 3 pkill -f dockerd fi

6. 启动 Docker 服务

echo "6. 启动 Docker 服务..." systemctl start docker

7. 检查结果

if systemctl is-active docker >/dev/null 2>&1; then echo "✓ Docker 启动成功" docker version else echo "✗ Docker 启动失败,尝试替代方案..." # 使用非 socket 激活方式启动 echo "尝试直接启动 dockerd..." nohup /usr/bin/dockerd -H unix:///var/run/docker.sock > /var/log/dockerd.log 2>&1 & sleep 5 if [ -S /var/run/docker.sock ]; then echo "✓ Docker 通过直接启动成功" docker version else echo "✗ 所有启动方式都失败,请检查日志" journalctl -u docker.service -n 20 --no-pager fi fi

markdown 复制代码
![](<> "点击并拖拽以移动")

### 脚本说明

1. **检查 Docker 服务状态**:  
   - `systemctl is-active --quiet docker` 用于检查 Docker 服务是否正在运行。  
   - 如果服务未运行,脚本尝试启动 Docker 服务。

2. **检查 `/var/run/docker.sock` 文件**:  
   - 如果该文件不存在,脚本通过重启 Docker 服务来自动生成该文件。

3. **检查并恢复 `/etc/docker/daemon.json` 配置文件**:  
   - 如果 `daemon.json` 文件缺失,脚本会创建一个默认的配置文件。

4. **重启 Docker 服务**:  
   - 配置文件恢复后,脚本会重启 Docker 服务,确保配置生效。

5. **检查 Docker 服务状态**:  
   - 最后,脚本会再次检查 Docker 服务的状态,并记录操作结果。

### 使用方法

1. **下载脚本**:  
   将上面的脚本内容保存为 `fix_docker.sh` 文件。

chmod +x fix_docker.sh ./fix_docker.sh

perl 复制代码
![](<> "点击并拖拽以移动")

![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/3bbed1c90182446ab4c4479e5e40d552~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgMzYwX2dvX3BocA==:q75.awebp?rk3s=f64ab15b&x-expires=1761440751&x-signature=0Z0MUJsgZpzSAICitmQiAmXliOA%3D)![](<> "点击并拖拽以移动")​编辑

2. **赋予执行权限**:  
   在终端中执行以下命令,给脚本文件赋予执行权限:![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/6b9c0828622f4feb96ecbc0af7ea56f5~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgMzYwX2dvX3BocA==:q75.awebp?rk3s=f64ab15b&x-expires=1761440751&x-signature=XCciWcqa6FYw944CxDPKCzPo8jI%3D)![](<> "点击并拖拽以移动")​编辑

   ```bash  
   chmod +x fix_docker.sh  
   ```

3. **运行脚本**:  
   通过以下命令运行脚本:

   ```bash  
   ./fix_docker.sh  
   ```

4. **查看日志**:  
   脚本执行过程中的日志会被记录到 `/var/log/fix_docker.log` 文件中,可以查看此文件了解修复过程。

![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/f57d56f97fd64644a092114bac3cd2ac~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgMzYwX2dvX3BocA==:q75.awebp?rk3s=f64ab15b&x-expires=1761440751&x-signature=8t%2FhdND4tFmnOPzfZxDKQIfC7WU%3D)![](<> "点击并拖拽以移动")​编辑

### 总结与 **验证修复**

检查服务状态

systemctl status docker systemctl status docker.socket

测试 Docker 功能

docker ps docker version

检查 socket 文件

ls -la /var/run/docker.sock

markdown 复制代码
![](<> "点击并拖拽以移动")

1.  **运行修复脚本** → `./fix_docker.sh`
1.  **检查 socket 文件** → `ls -la /var/run/docker.sock`
1.  **修改服务配置** → 如果前两步失败,编辑服务文件禁用 socket 激活
1.  **重新安装 Docker** → 作为最后手段

这个问题的根本原因是 systemd 的 socket 激活机制配置错误,通过上述步骤应该能够解决。![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/f27474871eff4ec292bd5d847cabc7d5~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgMzYwX2dvX3BocA==:q75.awebp?rk3s=f64ab15b&x-expires=1761440751&x-signature=fBW1d9rhHUOjtpsH0%2Fc6WcNNqPg%3D)![](<> "点击并拖拽以移动")​编辑

通过编写 `fix_docker.sh` 修复脚本,可以快速地恢复 Docker 守护进程的正常运行。该脚本会检查并恢复缺失的配置文件和 socket 文件,自动重启 Docker 服务,并记录操作日志。通过这种方式可以在遇到 Docker 启动失败时,快速解决问题并确保 Docker 正常运行。![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/88e86cc4608043b2883c62f65001589b~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgMzYwX2dvX3BocA==:q75.awebp?rk3s=f64ab15b&x-expires=1761440751&x-signature=Cr4dwH6vGJDWHzIAOJ80LEmMXsE%3D)![](<> "点击并拖拽以移动")​编辑

​
相关推荐
老K的Java兵器库3 小时前
并发集合踩坑现场:ConcurrentHashMap size() 阻塞、HashSet 并发 add 丢数据、Queue 伪共享
java·后端·spring
冷冷的菜哥3 小时前
go邮件发送——附件与图片显示
开发语言·后端·golang·邮件发送·smtp发送邮件
向葭奔赴♡3 小时前
Spring Boot 分模块:从数据库到前端接口
数据库·spring boot·后端
计算机毕业设计木哥3 小时前
计算机毕业设计选题推荐:基于SpringBoot和Vue的爱心公益网站
java·开发语言·vue.js·spring boot·后端·课程设计
Q741_1473 小时前
C++ 面试基础考点 模拟题 力扣 38. 外观数列 题解 每日一题
c++·算法·leetcode·面试·模拟
IT_陈寒4 小时前
Redis 性能翻倍的 5 个隐藏技巧,99% 的开发者都不知道第3点!
前端·人工智能·后端
JaguarJack4 小时前
PHP 桌面端框架NativePHP for Desktop v2 发布!
后端·php·laravel
自由的疯4 小时前
Java 怎么学习Kubernetes
java·后端·架构
自由的疯4 小时前
Java kubernetes
java·后端·架构