解决 Docker 无法连接守护进程的问题

解决 Docker 无法连接守护进程的问题

技术背景

在使用 Docker 时,有时会遇到 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 错误。此错误表明 Docker 客户端无法连接到 Docker 守护进程,这可能由多种原因导致,如守护进程未启动、权限问题、配置错误等。

实现步骤

1. 检查 Docker 守护进程是否运行

使用 ps aux | grep docker 命令查看 Docker 守护进程是否正在运行。如果未运行,可尝试以下方法启动:

  • 使用 systemctl 命令(适用于使用 systemd 的系统)
1
sudo systemctl start docker

若遇到 Failed to start docker.service: Unit docker.service is masked. 错误,可执行以下命令:

1
2
3
sudo systemctl unmask docker.service
sudo systemctl unmask docker.socket
sudo systemctl start docker.service
  • 使用 service 命令
1
sudo service docker start
  • 直接启动守护进程
1
sudo dockerd

2. 检查用户权限

确保当前用户具有访问 Docker 守护进程的权限。可将用户添加到 docker 用户组:

1
sudo usermod -aG docker $USER

添加用户后,需重新登录或执行 newgrp docker 使更改生效。

3. 检查 Docker 上下文

如果使用非 root 用户运行 Docker,可能需要检查并设置 Docker 上下文:

1
2
docker context ls
docker context use default

4. 清理残留文件

如果 Docker 未正常关闭,可能会留下残留文件影响启动。可尝试删除相关文件并重启 Docker:

1
2
3
4
5
service docker stop
cd /var/run/docker/libcontainerd
rm -rf containerd/*
rm -f docker-containerd.pid
service docker start

5. 检查磁盘空间

确保磁盘有足够的空间供 Docker 使用,磁盘空间不足可能导致 Docker 无法启动。

6. 检查配置文件

检查 /etc/docker/daemon.json 文件是否存在错误配置,如无效的 insecure-registries 条目,可尝试删除相关配置。

7. 其他特定系统或环境的解决方法

  • Mac 系统:确保 Docker Desktop 已启动,并在设置中检查是否允许使用默认 Docker 套接字。
  • WSL(适用于 Windows 子系统 Linux):可尝试使用 sudo /etc/init.d/docker startsudo dockerd 启动 Docker。
  • Debian 系统:由于 Debian 默认使用 nftables,而 Docker 安装程序使用 iptables 进行网络地址转换,可将其设置为使用传统的 iptables
1
2
3
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
sudo service docker start

核心代码

以下是一些常用的启动和管理 Docker 守护进程的代码示例:

1
2
3
4
5
6
7
8
9
10
# 启动 Docker 守护进程
sudo systemctl start docker
# 重启 Docker 守护进程
sudo systemctl restart docker
# 停止 Docker 守护进程
sudo systemctl stop docker
# 查看 Docker 守护进程状态
sudo systemctl status docker
# 将用户添加到 docker 组
sudo usermod -aG docker $USER

最佳实践

  • 定期检查 Docker 守护进程状态:使用 systemctl status dockerservice docker status 命令定期检查 Docker 守护进程的运行状态,确保其正常工作。
  • 合理配置 Docker 权限:避免使用 sudo 执行所有 Docker 命令,将用户添加到 docker 组,提高使用便利性。
  • 备份重要配置文件:如 /etc/docker/daemon.json,在进行配置更改前备份,以防配置错误导致 Docker 无法正常工作。

常见问题

1. systemctl start docker 报错 System has not been booted with systemd as init system (PID 1). Can't operate.

这表明系统未使用 systemd 作为初始化系统,systemctl 命令无法使用。可尝试使用 sudo dockerd 直接启动 Docker 守护进程。

2. sudo dockerd 报错 Error starting daemon: Devices cgroup isn't mounted

这可能是由于系统的 cgroup 配置问题导致的,需要检查并调整系统的 cgroup 挂载设置。

3. 即使 Docker 守护进程已启动,仍无法连接

可能是由于用户权限问题或 Docker 上下文配置错误。可检查用户是否已添加到 docker 组,并设置正确的 Docker 上下文。


解决 Docker 无法连接守护进程的问题
https://119291.xyz/posts/2025-04-22.solve-docker-daemon-connection-issue/
作者
ww
发布于
2025年4月23日
许可协议