解决docker compose命令不存在问题

2020-11-20 Linux 运维

前言

在使用 Docker 时,docker compose 是最常用的多容器编排工具。然而很多用户在安装 Docker 后执行 docker compose 或 docker-compose 命令时会遇到 command not found 错误。本文详细分析 Docker Compose V1 和 V2 的差异,并提供三种解决方案:Docker Compose Plugin、alias 别名、Python 版 docker-compose。

1. 问题描述

执行以下命令时出现错误:

$ docker compose up -d
docker: 'compose' is not a docker command. See 'docker --help'.

$ docker-compose up -d
-bash: docker-compose: command not found

2. Docker Compose V1 与 V2 的差异

2.1 版本对比

特性 V1 (docker-compose) V2 (docker compose)
实现语言 Python Go
命令格式 docker-compose docker compose
安装方式 独立二进制文件 Docker CLI 插件
维护状态 已废弃(EOL) 活跃维护
兼容性 老项目兼容 推荐使用
性能 较慢 更快

2.2 为什么会出现 "command not found"

  1. Docker 安装方式不同:部分 Docker 安装方式不包含 Compose 插件
  2. 系统包管理器版本旧:apt/yum 安装的 docker 可能不包含 compose
  3. V1 已废弃:新版本 Docker 不再默认安装 V1 的 docker-compose
  4. PATH 问题:compose 插件未放在正确路径

3. 解决方案一:安装 Docker Compose Plugin(推荐)

这是官方推荐的方式,将 Compose 作为 Docker CLI 的插件安装。

3.1 使用官方仓库安装(推荐)

Ubuntu / Debian

# 更新软件包索引
apt update

# 安装 Docker Compose 插件
apt install docker-compose-plugin

# 验证安装
docker compose version

CentOS / Rocky / AlmaLinux

# 安装 Docker Compose 插件
yum install docker-compose-plugin

# 或使用 dnf(CentOS 8+)
dnf install docker-compose-plugin

# 验证安装
docker compose version

3.2 手动安装 Compose 插件

如果包管理器中没有 docker-compose-plugin,可以手动安装:

# 创建 Docker CLI 插件目录
mkdir -p ~/.docker/cli-plugins

# 下载最新版本的 docker-compose
# 查看最新版本:https://github.com/docker/compose/releases
COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4)
echo "最新版本: $COMPOSE_VERSION"

# 下载对应架构的二进制文件
# x86_64 架构
curl -SL "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-linux-x86_64" \
  -o ~/.docker/cli-plugins/docker-compose

# ARM64 架构(如树莓派)
curl -SL "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-linux-aarch64" \
  -o ~/.docker/cli-plugins/docker-compose

# 赋予执行权限
chmod +x ~/.docker/cli-plugins/docker-compose

# 验证安装
docker compose version

3.3 系统级安装(所有用户可用)

# 下载到系统目录(需要 root 权限)
sudo curl -SL "https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-linux-x86_64" \
  -o /usr/local/lib/docker/cli-plugins/docker-compose

# 或使用 /usr/local/bin
sudo curl -SL "https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-linux-x86_64" \
  -o /usr/local/bin/docker-compose

# 赋予执行权限
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

# 验证
docker compose version

3.4 使用官方安装脚本

Docker 官方提供了一个便捷的安装脚本:

# 安装 Docker Compose V2
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-linux-x86_64 \
  -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose

4. 解决方案二:使用 alias 别名

如果只是临时需要或不想安装插件,可以使用 alias 将 docker compose 映射到已安装的 docker-compose:

4.1 先安装 V1 版本 docker-compose

# 下载 docker-compose V1(Python 版本)
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" \
  -o /usr/local/bin/docker-compose

# 赋予执行权限
chmod +x /usr/local/bin/docker-compose

# 验证
docker-compose version

4.2 设置 alias 别名

# 临时设置(当前终端有效)
alias 'docker compose'='docker-compose'

# 永久设置(写入 ~/.bashrc)
echo "alias 'docker compose'='docker-compose'" >> ~/.bashrc
source ~/.bashrc

# 对于 zsh 用户
echo "alias 'docker compose'='docker-compose'" >> ~/.zshrc
source ~/.zshrc

验证别名:

$ type 'docker compose'
docker compose is aliased to `docker-compose'

$ docker compose version
docker-compose version 1.29.2, build 5becea4c

5. 解决方案三:安装 Python 版 docker-compose(V1)

虽然 V1 已废弃,但在某些老项目中仍可能需要。

5.1 使用 pip 安装

# 安装 Python3 和 pip
apt install python3 python3-pip   # Ubuntu/Debian
yum install python3 python3-pip   # CentOS/RHEL

# 使用 pip 安装 docker-compose
pip3 install docker-compose

# 验证
docker-compose version

5.2 使用 pipx 安装(推荐 Python 方式)

pipx 可以在隔离环境中安装 Python 包,避免依赖冲突:

# 安装 pipx
pip3 install pipx
pipx ensurepath

# 使用 pipx 安装 docker-compose
pipx install docker-compose

# 验证
docker-compose version

5.3 国内加速(pip 源)

# 使用清华镜像源
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple docker-compose

# 或使用阿里云镜像
pip3 install -i https://mirrors.aliyun.com/pypi/simple/ docker-compose

6. 三种方案对比

方案 优点 缺点 适用场景
Docker Compose Plugin 官方推荐,性能最好 需要手动安装 新项目、生产环境
alias 别名 简单快速 需要安装 V1 版本 临时使用、兼容老命令
Python 版 docker-compose 兼容老项目 已废弃,性能差 维护老项目

推荐:优先使用 方案一(Docker Compose Plugin),这是官方推荐且持续维护的版本。

7. 验证安装

安装完成后,使用以下命令验证:

# 检查 docker compose 命令
docker compose version

# 应该看到类似输出:
# Docker Compose version v2.24.5

# 测试 compose 功能
mkdir -p /tmp/test-compose
cd /tmp/test-compose

cat > docker-compose.yml <<EOF
version: '3'
services:
  nginx:
    image: nginx:alpine
    ports:
      - "8080:80"
EOF

# 启动测试容器
docker compose up -d

# 检查状态
docker compose ps

# 清理测试
docker compose down

8. 常见问题排查

8.1 权限拒绝(Permission denied)

# 检查文件权限
ls -l $(which docker-compose)

# 添加执行权限
chmod +x /usr/local/bin/docker-compose
chmod +x ~/.docker/cli-plugins/docker-compose

# 如果仍然报错,检查是否属于 docker 用户组
groups $USER

# 如不在 docker 组,添加用户到 docker 组
usermod -aG docker $USER
# 重新登录或执行
newgrp docker

8.2 下载速度慢或超时

# 使用国内镜像加速下载
# 中科大镜像
curl -L "https://mirrors.ustc.edu.cn/docker-ce/linux/static/stable/x86_64/docker-compose-$(uname -s | tr '[:upper:]' '[:lower:]')-$(uname -m)" \
  -o /usr/local/bin/docker-compose

# 或手动下载后上传到服务器
# 下载地址:https://github.com/docker/compose/releases

8.3 架构不匹配

# 检查系统架构
uname -m

# x86_64 使用:
docker-compose-linux-x86_64

# ARM64 使用:
docker-compose-linux-aarch64

# ARMv7 使用:
docker-compose-linux-armv7

8.4 docker compose 和 docker-compose 同时存在

# 检查两个命令
which docker-compose
which docker

# 查看 docker compose 插件路径
docker compose version
ls -l ~/.docker/cli-plugins/
ls -l /usr/local/lib/docker/cli-plugins/

# 如果出现冲突,建议保留 V2 版本
rm /usr/local/bin/docker-compose   # 删除 V1 版本

8.5 仍然报错 "is not a docker command"

# 检查插件路径是否正确
ls -l ~/.docker/cli-plugins/docker-compose
ls -l /usr/local/lib/docker/cli-plugins/docker-compose

# 正确的插件命名:文件名必须是 docker-compose(无后缀)
# 错误的命名:docker-compose.sh, docker-compose-v2 等

# 检查文件是否有执行权限
chmod +x ~/.docker/cli-plugins/docker-compose

# 重启 Docker 服务
systemctl restart docker

# 再试一次
docker compose version

9. 快速安装脚本(一键解决)

以下是一个自动检测和安装 Docker Compose 的脚本:

使用方法:

# 保存脚本
vim docker-compose-install.sh

# 赋予执行权限
chmod +x docker-compose-install.sh

# 执行安装
./docker-compose-install.sh

10. 总结

docker compose 命令不存在的问题主要由以下原因引起:

  1. Docker 安装时未包含 Compose 插件
  2. 混淆了 V1 (docker-compose) 和 V2 (docker compose)
  3. PATH 路径或权限问题

解决方案优先级:

  1. 首选:安装 Docker Compose Plugin(V2)
  2. 备选:使用 alias 别名兼容老命令
  3. 特殊:安装 Python 版(仅维护老项目)

最佳实践:

  • 新项目统一使用 docker compose(V2 格式)
  • 弃用 docker-compose(V1 已废弃)
  • 将 Compose 插件安装到系统路径,避免权限问题
  • 使用国内镜像加速下载