如何解决在 CentOS 7 上解决因未设置 Docker 开机自启而出现的 “Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?” 问题
在 CentOS 7 环境下,当我们在未开启 Docker 服务开机自启(systemctl enable docker
)的情况下重启系统,再次执行任何 docker
命令时,往往会遇到令人头疼的报错信息——“Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?”。本篇文章将重点讲解如何在 CentOS 7 上快速定位并彻底解决该“Docker 守护进程连接失败”问题,涵盖从启动 Docker 服务、验证 /var/run/docker.sock
套接字权限,到编辑 /etc/docker/daemon.json
配置镜像加速,再到一键设置 Docker 开机自启的全流程操作步骤,帮助您在云原生部署中避免因 Docker 服务未自启造成的容器构建和镜像拉取失败。
目录
-
- 安装并启动 Docker 服务
- 验证 Docker 服务状态
- 编辑
/etc/docker/daemon.json
并配置镜像加速 - 重启 Docker 服务并验证
- 设置 Docker 开机自启
问题描述
在 CentOS 7 中执行任何 docker
命令时,均提示:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
此时无论是否已执行 systemctl start docker
,重启机器后再次使用 docker
命令依然报错,影响日常容器建设与部署工作。
环境与前提
- 操作系统:CentOS 7.x
- Docker 版本:Docker CE 或 Docker EE(18.x 及以上均适用)
- 用户:具有
sudo
权限或 root 用户 - 网络环境:访问 Docker Hub 速度较慢,推荐使用国内镜像加速
错误现象分析
-
执行命令
docker version
或docker info
时,均报相同错误:$ docker info Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
-
查看 Docker 服务状态:
$ systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: inactive (dead)
其中可以看到
Loaded
一行的末尾标注为disabled
,说明该服务未设置自动启动,且当前处于未运行(inactive
)状态。
根本原因
- Docker 服务未设置开机自启
CentOS 7 默认安装 Docker 后,docker.service
并不会自动随系统启动。未手动enable
服务时,每次重启都需要手动执行systemctl start docker
,否则/var/run/docker.sock
(Docker 守护进程的 UNIX 套接字)不会存在,从而导致客户端无法连接守护进程。
解决思路概览
- 启动并验证 Docker 服务,确保能够正常运行。
- 配置国内镜像源加速,提升拉取镜像速度,避免因网络缓慢导致超时等其他问题。
- 设置 Docker 服务开机自启,保证重启后无需手动启动。
- 验证最终效果,确保
docker
命令恢复正常使用。
详细操作步骤
1. 安装并启动 Docker 服务
如果尚未安装 Docker,可参考官方文档安装。这里假设已安装。
# 安装完成后,先启动服务
sudo systemctl start docker
2. 验证 Docker 服务状态
# 查看服务状态
sudo systemctl status docker
-
若显示
Active: active (running)
且无报错,即守护进程已正常运行。 -
若仍未运行,可查看日志定位问题:
sudo journalctl -u docker -n 50 --no-pager
3. 编辑 /etc/docker/daemon.json
并配置镜像加速
在国内环境下,访问 Docker 官方仓库速度较慢,建议添加国内镜像加速配置:
-
确保目录存在:
sudo mkdir -p /etc/docker
-
编辑或新建文件
/etc/docker/daemon.json
:sudo vi /etc/docker/daemon.json
-
添加如下内容,替换为你所选的镜像加速地址(以阿里云为例):
{ "registry-mirrors": [ "https://<your-id>.mirror.aliyuncs.com" ] }
说明
registry-mirrors
:指定加速器地址数组,可填多个。- 保存后,文件需为合法 JSON 格式。
4. 重启 Docker 服务并验证
# 重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
# 再次检查状态
sudo systemctl status docker
-
如果显示
Active: active (running)
,则守护进程连接套接字/var/run/docker.sock
已恢复。 -
可执行拉取测试:
docker pull busybox
若能正常拉取并显示进度,说明配置和服务均正常。
5. 设置 Docker 开机自启
为避免下次重启后再次出现同样问题,建议设置 Docker 服务随系统启动:
sudo systemctl enable docker
-
执行后,
docker.service
在Loaded:
一行将由disabled
变为enabled
。 -
再次重启系统验证:
sudo reboot # 重启后无需手动启动 docker info
常见误区与排查建议
-
仅配置镜像加速而未启动服务
- 配置文件无效时,守护进程也可能启动失败。请先确认服务可启动,再添加镜像配置。
-
daemon.json 格式错误
- JSON 中不能有多余逗号,严格按照 JSON 语法书写,否则重启时会报解析错误。
- 可执行
docker info
,若配置错误,通常会在日志中看到Error parsing config file
。
-
SELinux 或权限导致套接字不可访问
-
/var/run/docker.sock
默认归属为root:docker
,需确保当前用户在docker
组内:sudo usermod -aG docker $USER
-
退出并重新登录后生效。
-
总结与最佳实践
-
核心问题:未设置 Docker 服务开机自启,导致重启后守护进程未运行,客户端无法连接套接字。
-
解决方案:
- 启动并验证 Docker 服务
- 编辑
/etc/docker/daemon.json
添加registry-mirrors
- 重启服务,确认正常
- 执行
systemctl enable docker
设置开机自启
-
建议:
- 在所有生产或开发节点上统一配置镜像加速和开机自启。
- 定期检查 Docker 日志和服务状态,避免因版本升级、配置变更导致意外中断。
- 对于多节点集群,可结合 Ansible、SaltStack 等自动化工具,统一下发上述配置。
参考资料
- Docker 官方文档 — Daemon 配置文件
- 阿里云加速器使用指南 — Docker 镜像加速
- CentOS 7 Systemd 指南 — systemctl 命令详解
后记:确保 Docker 服务的高可用和稳定运行,是云原生平台建设的基础。正确的开机自启配置和镜像源优化,可以大幅减少生产环境中因服务未启动或拉取超时带来的风险。祝你在云原生之路上一路顺畅!