本文摘要:结论:Docker 服务启动失败,常见原因可能包括存储驱动配置错误、文件权限问题或内核兼容性故障。排查的核心在于验证 Docker 守护进程本身是否正常。基础的验证方法是:使用 systemctl status 和 journalctl 查看服务状态与日志,并用 docker run –rm hello-world 测试基础功能。
问题与结论
场景:在 Ubuntu 22.04 LTS 服务器上,使用 Docker 部署 Nextcloud。执行 docker compose up -d 后,容器未能启动,随后发现所有 Docker 容器均无法运行。尝试重启 Docker 服务,命令无响应。
结论:Docker 服务启动失败,常见原因可能包括存储驱动配置错误、文件权限问题或内核兼容性故障。排查的核心在于验证 Docker 守护进程本身是否正常。基础的验证方法是:使用 systemctl status 和 journalctl 查看服务状态与日志,并用 docker run –rm hello-world 测试基础功能。
排查过程
当容器无法启动时,应首先定位故障层级。排查遵循从服务到底层系统的顺序。
检查服务状态与日志: bash sudo systemctl status docker.service sudo journalctl -u docker.service –no-pager | tail -30 若服务状态为 failed 或 inactive,日志中会记录具体错误原因,如“存储驱动错误”、“cgroup 挂载失败”或“权限被拒绝”。
检查依赖与系统状态: bash # 检查关键内核模块是否加载 lsmod | grep -E 'overlay|br_netfilter' # 检查 Docker 数据目录所在文件系统的类型与空间 df -hT /var/lib/docker # 检查 Docker 守护进程的 socket 文件权限 ls -la /var/run/docker.sock
启动服务并进行基础功能验证: bash # 尝试启动服务 sudo systemctl start docker # 如果成功,运行测试容器 sudo docker run –rm hello-world 若 hello-world 容器成功运行并输出欢迎信息,则表明 Docker 服务及内核环境正常,问题可能出在具体应用容器的配置上。
关键步骤与输入输出示例
以排查因权限问题导致的 docker.sock 连接失败为例。

- 失败输入: bash docker ps
- 失败输出: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
-
排查与修复步骤: bash # 确认当前用户不在 docker 组 groups # 将用户添加到 docker 组 sudo usermod -aG docker $USER 重要:执行 usermod 命令后,必须完全退出当前终端会话并重新登录,用户组变更才会生效。
-
成功输入/输出: 重新登录后: bash docker run –rm hello-world # 输出包含“Hello from Docker!”即表示修复成功。
失败场景与替代方案
存储驱动失败场景
- 现象:docker info 显示存储驱动为 overlay2,但创建容器时日志报错 invalid argument 或 device or resource busy。
- 验证:检查 dmesg | grep -i btrfs 和 mount | grep docker,确认宿主机文件系统类型。overlay2 在某些 btrfs 版本或配置下可能存在兼容性问题。
- 解决方案:
- 将 Docker 数据目录迁移至 ext4 或 xfs 分区。修改 /etc/docker/daemon.json 中的 data-root 配置项并重启服务。
- 临时更换存储驱动(需评估影响): json // /etc/docker/daemon.json { "storage-driver": "devicemapper" } 注意:devicemapper 配置复杂,且在生产环境中需配置为 direct-lvm 模式,否则性能较差。
技术选型替代方案
| 直接安装 (APT/YUM) | 应用简单,依赖关系清晰,无需隔离环境。 | 可能污染系统库版本,卸载困难,难以管理多版本共存。 |
| Docker | 标准化交付,隔离环境,管理多应用及依赖。 | 存在守护进程,需管理镜像与存储,对内核特性有要求。 |
| Podman | 不需守护进程,支持 rootless 模式,兼容 Docker CLI。 | 生态工具链成熟度可能不及 Docker,部分网络高级功能有差异。 |
| Kubernetes (单节点如 K3s) | 学习 K8s 概念,或未来有集群扩展需求。 | 架构复杂,资源开销大,对于单机自托管场景通常属于“杀鸡用牛刀”。 |
思考
参考资料
- Linux 内核源码,包含了 cgroups、namespaces、overlayfs 等技术的具体实现,是理解容器底层原理的基础:https://github.com/torvalds/linux


