dockerd 服务未启动导致“connection refused”,应先检查 systemctl status docker 状态,再排查 daemon.json 格式错误、缺失内核模块、firewalld 冲突或镜像源配置问题,并重启服务。

dockerd 服务没起来,docker ps 报 “connection refused” 怎么办
绝大多数初装失败卡在这一步:Docker 守护进程根本没跑起来。不是命令输错了,是系统级服务没启动或启动失败。
先确认服务状态:sudo systemctl status docker。如果显示 inactive (dead) 或报 Failed to start Docker Application Container Engine,别急着重装。
- 常见原因是
/etc/docker/daemon.json格式错误(多一个逗号、引号不闭合),删掉这个文件再试sudo systemctl start docker - Ubuntu/Debian 上可能缺
linux-image-extra-$(uname -r)包,它提供 overlay2 所需内核模块,用apt install linux-image-extra-$(uname -r)补上 - CentOS 7 默认用 firewalld,有时会和 docker0 网桥冲突,临时关掉
sudo systemctl stop firewalld看是否恢复
拉镜像时卡在 Waiting for download 或超时
不是网络差,大概率是默认 registry 配置没走国内镜像源。Docker Hub 国内直连成功率极低,尤其带宽小的 VPS。
改法很简单,编辑 /etc/docker/daemon.json(不存在就新建),填入国内镜像加速地址:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
改完必须重启守护进程:sudo systemctl daemon-reload && sudo systemctl restart docker。注意不是 docker restart —— 那是重启容器,对镜像拉取无效。
- USTC、阿里云、腾讯云镜像源都可用,但别堆一堆进去,Docker 会按顺序尝试,第一个挂了才切下一个,反而拖慢
- 如果公司有私有 registry,加到
insecure-registries列表前,得先确认它是否启用了 HTTPS;没启的话,得在 same 文件里显式声明为不安全源 -
docker pull hello-world是最小验证项,成功了再拉nginx或ubuntu:22.04这类大镜像
docker images 列出来的镜像 ID 为什么总变
镜像 ID 不是固定值,而是内容哈希(SHA256)。哪怕只改一行 Dockerfile 再 build,ID 就全变了。这不是 bug,是设计使然 —— 它保证“相同构建输入 = 相同输出”。
真正该用来标识版本的是 tag,比如 ubuntu:22.04 或你自己打的 myapp:v1.2。但要注意:
-
latest是个普通 tag,不是特殊关键字;它不会自动更新,你得手动docker tag xxx latest才能覆盖 -
docker image prune默认只删dangling镜像(即没 tag 且没被任何容器引用的层),不会动你打过 tag 的镜像 —— 但很多人误以为“没 tag 就是垃圾”,结果删掉还在运行的容器依赖层 - 用
docker images --format "{{.Repository}}:{{.Tag}} {{.ID}}"可以更清晰地看 tag 和 ID 对应关系,避免靠肉眼对齐
删镜像时提示 “image is being used by running container” 却找不到对应容器
不是 Docker 记错了,是存在已退出但没清理的容器(status 是 Exited 而非 Up)。它们仍持有对镜像层的引用,所以 docker rmi 拒绝删除。
先查所有容器(含已退出的):docker ps -a。重点关注 STATUS 列里带 Exited 字样的行。
- 批量清理退出容器:
docker rm $(docker ps -aq --filter status=exited)(注意别漏-q,否则传给rm的是容器名而非 ID,会报错) - 如果容器 ID 显示为
000000000000,说明它用了--rm参数启动,本不该残留 —— 这时可能是 Docker daemon 异常崩溃导致状态没同步,重启 daemon 再试 - 极端情况(如磁盘满导致容器元数据损坏),
docker system prune -a会清空全部镜像+容器+网络+构建缓存,慎用;执行前务必确认没重要数据
镜像管理真正的复杂点不在命令多,而在“引用关系”是隐式的:容器、构建缓存、甚至 docker build --cache-from 都可能锁住某一层。只要看到删不掉,第一反应不该是硬删,而是先跑一遍 docker system df -v 看谁在占着。









