1. 理解 Docker 与 Docker Compose 的连接机制

Docker 是一个开源平台,用于将应用程序打包成容器,容器中包含了应用代码及其所有依赖(如库、配置等),确保应用在不同环境中一致性运行。而 Docker Compose 则用于简化多容器应用的管理,它通过一个 docker-compose.yml 文件定义并运行多个容器服务。

Docker Compose 依赖于 Docker 的核心功能运行,它本质上是对 Docker 的高级封装。当 Docker 出现问题(如 Docker 守护进程未运行、权限问题等)时,Docker Compose 无法正常连接 Docker,从而报错。

常见连接失败原因

  • Docker 守护进程未运行
  • Docker Socket 配置错误
  • Docker Compose 版本过旧
  • 用户权限不足或 Docker Socket 权限受限

示例配置文件

我们先看一个典型的 docker-compose.yml 示例:

version: '3'
services:
  web:
    image: nginx
    ports:
      - "80"
    volumes:
      - var/www/html

这个配置使用了 Compose 文件格式版本 3,定义了一个使用官方 nginx 镜像的服务,映射了端口 80,并将本地目录挂载到容器中。

运行以下命令尝试启动服务:

$ docker-compose up docker-compose.yml

如果出现如下错误:

PermissionError: [Errno 13] Permission denied

说明 Docker Compose 没有权限连接 Docker 守护进程。接下来我们从多个角度排查和解决这个问题。


2. 检查 Docker 守护进程状态

Docker 守护进程(即 dockerd)是一个后台服务,负责管理镜像、容器、网络、卷等资源。它是 Docker 运行的基础。

如何确认 Docker 守护进程是否运行?

使用以下命令检查:

$ docker info

如果输出正常,说明 Docker 正在运行。如果报错,则可能守护进程未启动。

Linux 系统下启动 Docker 守护进程

$ sudo systemctl enable docker
$ sudo systemctl start docker

也可以直接检查状态:

$ sudo systemctl status docker

输出中看到 Active: active (running) 表示 Docker 正常运行。


3. 检查版本兼容性

不同版本的 Docker Engine 和 Docker Compose 文件格式之间存在兼容性要求。如果版本不匹配,可能导致连接失败。

查看 Docker Engine 版本

$ docker --version
Docker version 27.0.3, build 7d4bcd8

Docker Compose 文件格式与 Docker Engine 的兼容性对照表

Compose 文件格式版本 支持的 Docker Engine 最低版本
3.8 19.03.0+
3.7 18.06.0+
3.6 18.02.0+
3.5 17.12.0+
3.4 17.09.0+
3.3 17.06.0+
3.2 17.04.0+
3.1 1.13.1+
3.0 1.13.0+
2.4 17.12.0+
2.3 17.06.0+
2.2 1.13.0+
2.1 1.12.0+
2.0 1.10.0+
1.0 1.9.1+

建议:使用最新的 Docker Engine 和 Compose 插件版本,避免版本兼容性问题。


4. 权限与所有权问题

权限问题是 Docker Compose 无法连接 Docker 的常见原因,尤其是用户没有访问 Docker Socket(即 /var/run/docker.sock)的权限。

解决方案

✅ 方式一:使用 sudo

$ sudo docker-compose up -d

⚠️ 缺点:每次都要加 sudo,不推荐长期使用。

✅ 方式二:将用户加入 docker

$ sudo groupadd docker
$ sudo usermod -aG docker $USER
$ newgrp docker

然后测试是否可以无权限运行:

$ docker-compose up -d

优点:安全、方便,推荐使用。

✅ 方式三:修改 Docker Socket 权限

$ sudo chmod 666 /var/run/docker.sock

⚠️ 缺点:会降低系统安全性,建议仅用于测试环境。


5. macOS / Windows 系统(Docker Toolbox 用户)

如果你使用的是 Docker Toolbox(较旧版本的 Docker 客户端),而不是 Docker Desktop,需要手动配置 Docker 环境变量。

启动 Docker Quickstart Terminal 并重启 VM

$ docker-machine restart default

然后设置环境变量:

$ eval $(docker-machine env default)

这个命令会设置如下变量:

  • DOCKER_HOST
  • DOCKER_CERT_PATH
  • DOCKER_TLS_VERIFY

⚠️ 注意:Docker Desktop 用户无需执行这些步骤,现代 Docker 安装已自动处理环境配置。


6. 总结

解决 Docker Compose 无法连接 Docker 的问题,关键在于理解 Docker 守护进程、用户权限和版本兼容性之间的关系。

常见解决方法包括:

  • ✅ 检查 Docker 守护进程是否运行
  • ✅ 确保 Docker Engine 与 Compose 文件格式版本兼容
  • ✅ 将用户加入 docker 组以避免权限问题
  • ✅ 调整 Docker Socket 权限(测试环境可用)
  • ✅ Docker Toolbox 用户需手动配置环境变量(已逐渐淘汰)

根据实际环境选择最合适的方案,避免因权限放宽带来的安全隐患。


原始标题:How to Fix Unable to Connect to Docker Using Docker-Compose