解决“docker-compose: 命令未找到”错误

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本实验提供了一份实用指南,用于解决 “docker-compose: 命令未找到” 错误,这是 Docker 用户经常遇到的一个常见问题。Docker Compose 是管理多容器 Docker 应用程序的重要工具,遇到此错误可能会阻碍你的工作流程。通过完成本实验,你将获得排查和修复此问题的技能,从而能够继续有效地开发和部署你的容器化应用程序。

docker compose命令未找到

本实验需要联网进行学习,因此只有专业版用户可以启动虚拟机。将你的账户升级到专业版


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/SystemManagementGroup -.-> docker/version("Show Docker Version") subgraph Lab Skills docker/run -.-> lab-390530{{"解决“docker-compose: 命令未找到”错误"}} docker/ps -.-> lab-390530{{"解决“docker-compose: 命令未找到”错误"}} docker/start -.-> lab-390530{{"解决“docker-compose: 命令未找到”错误"}} docker/stop -.-> lab-390530{{"解决“docker-compose: 命令未找到”错误"}} docker/rm -.-> lab-390530{{"解决“docker-compose: 命令未找到”错误"}} docker/logs -.-> lab-390530{{"解决“docker-compose: 命令未找到”错误"}} docker/create -.-> lab-390530{{"解决“docker-compose: 命令未找到”错误"}} docker/version -.-> lab-390530{{"解决“docker-compose: 命令未找到”错误"}} end

了解 Docker Compose 并验证安装

什么是 Docker Compose?

Docker Compose 是一个帮助你定义和共享多容器应用程序的工具。使用 Compose,你可以创建一个 YAML 文件来配置应用程序的服务,然后通过一个命令启动所有服务。它简化了管理协同工作的多个容器的过程。

检查 Docker Compose 是否已安装

让我们首先检查 Docker Compose 是否已经安装在你的系统上。打开一个终端并运行:

docker-compose --version

你将会看到类似这样的输出:

docker-compose: 命令未找到
command not found

然而,如果你收到像 docker-compose: 命令未找到 这样的错误消息,这意味着 Docker Compose 没有安装,或者没有在你系统的路径中正确配置。

验证 Docker 安装

在我们安装 Docker Compose 之前,让我们验证 Docker 本身是否已正确安装。运行:

docker --version

你应该会看到类似这样的输出:

Docker 版本 20.10.21,构建版本 20.10.21-0ubuntu1~22.04.3

如果你没有看到这个输出,Docker 可能没有正确安装。不过,对于本实验,我们将专注于解决 Docker Compose 的问题。

安装 Docker Compose

由于我们确认 Docker Compose 未安装或无法访问,让我们来安装它。安装 Docker Compose 有几种不同的方法,但我们将重点介绍适用于 Ubuntu 系统的最直接的方法。

方法一:使用 apt 包管理器

安装 Docker Compose 最简单的方法是通过 apt 包管理器。让我们来操作:

  1. 首先,设置存储库并安装依赖项:
## 添加 Docker 的官方 GPG 密钥:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

## 将存储库添加到 Apt 源:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo \"${UBUNTU_CODENAME:-$VERSION_CODENAME}\") stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

你应该会看到显示更新过程的输出。

  1. 接下来,安装 Docker Compose:
sudo apt install -y docker-compose-plugin

你会看到显示安装进度的输出。

  1. 安装完成后,通过检查版本来验证是否成功:
docker compose version

注意:在较新的 Docker 安装中,命令是 docker compose(有空格)而不是 docker-compose(有连字符)。

你应该会看到类似这样的输出:

Docker Compose 版本 v2.33.1

方法二:使用 curl 安装特定版本

如果你已经使用 apt 方法安装了 Docker Compose,可以跳过此方法。

如果 apt 方法不起作用,或者你需要特定版本,可以直接安装 Docker Compose:

  1. 如果不存在,为 Docker CLI 插件创建一个目录:
mkdir -p ~/.docker/cli-plugins/
  1. 下载 Docker Compose 二进制文件:
curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose

文件下载时你会看到一个进度条。

  1. 使二进制文件可执行:
chmod +x ~/.docker/cli-plugins/docker-compose
  1. 验证安装:
docker compose version

你应该会看到显示 Docker Compose 版本的输出。

创建一个简单的 Docker Compose 项目

既然我们已经成功安装了 Docker Compose,那就创建一个简单的 Docker Compose 项目来确保一切正常运行。

创建项目目录

首先,为我们的 Docker Compose 项目创建一个目录:

mkdir -p ~/project/docker-compose-test
cd ~/project/docker-compose-test

创建 Docker Compose 文件

现在,创建一个简单的 Docker Compose 文件来运行一个基本的 Nginx 网络服务器。使用 nano 文本编辑器创建一个名为 docker-compose.yml 的文件:

nano docker-compose.yml

在编辑器中,添加以下内容:

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes: -./html:/usr/share/nginx/html

此配置定义了:

  • 一个名为 “web” 的服务,使用最新的 Nginx 镜像
  • 端口映射,将容器的端口 80 映射到主机的端口 8080
  • 一个卷,将本地目录映射到 Nginx 网络根目录

按下 Ctrl+O 然后 Enter 保存文件,再按下 Ctrl+X 退出 nano。

创建 HTML 内容

创建 html 目录和一个简单的 index.html 文件:

mkdir -p html
nano html/index.html

在编辑器中,添加以下 HTML 内容:

<!DOCTYPE html>
<html>
  <head>
    <title>Docker Compose Test</title>
  </head>
  <body>
    <h1>Docker Compose 正在运行!</h1>
    <p>如果你能看到此页面,则说明你已成功解决了 docker-compose 问题。</p>
  </body>
</html>

按下 Ctrl+O 然后 Enter 保存文件,再按下 Ctrl+X 退出 nano。

运行 Docker Compose 项目

现在,运行我们的 Docker Compose 项目:

docker compose up -d

-d 标志表示在分离模式下(在后台)运行容器。

你应该会看到类似这样的输出:

Creating network "docker-compose-test_default" with the default driver
Creating docker-compose-test_web_1... done

这表明 Docker Compose 已成功创建并启动了你的容器。

验证网络服务器

验证我们的网络服务器是否正常运行:

curl http://localhost:8080

你应该会看到你之前创建的 HTML 内容:

<!DOCTYPE html>
<html>
  <head>
    <title>Docker Compose Test</title>
  </head>
  <body>
    <h1>Docker Compose 正在运行!</h1>
    <p>如果你能看到此页面,则说明你已成功解决了 docker-compose 问题。</p>
  </body>
</html>

这确认了 Docker Compose 运行正常。

docker compose is working

管理 Docker Compose 应用程序

既然我们已经成功设置并运行了一个 Docker Compose 应用程序,那就来学习如何使用各种 Docker Compose 命令对其进行管理。

检查正在运行的容器

要检查 Docker Compose 容器的状态,运行:

cd ~/project/docker-compose-test
docker compose ps

你应该会看到类似这样的输出:

NAME                        COMMAND                  SERVICE             STATUS              PORTS
docker-compose-test-web-1   "/docker-entrypoint.…"   web                 running             0.0.0.0:8080->80/tcp

这表明你的 Nginx 网络服务器容器正在运行,并且端口映射处于活动状态。

查看容器日志

要查看容器的日志,运行:

docker compose logs

这将显示 Docker Compose 应用程序中所有容器的合并日志。你应该会看到包含 Nginx 启动消息的输出。

要查看特定服务的日志,指定其名称:

docker compose logs web

停止应用程序

要在不删除容器的情况下停止 Docker Compose 应用程序,运行:

docker compose stop

你应该会看到表明容器正在停止的输出:

✔ Container docker-compose-test-web-1  Stopped

要验证容器是否已停止,检查它们的状态:

docker compose ps

你应该会看到容器不再运行。

再次启动应用程序

要再次启动已停止的容器,运行:

docker compose start

你应该会看到表明容器正在启动的输出:

✔ Container docker-compose-test-web-1  Started

验证它们是否再次运行:

docker compose ps

停止并移除应用程序

当你完成对 Docker Compose 应用程序的使用后,可以使用一个命令停止并移除所有容器、网络和卷:

docker compose down

你应该会看到类似这样的输出:

✔ Container docker-compose-test-web-1  Removed
✔ Network docker-compose-test_default  Removed

这表明你的容器已停止并被移除,并且为它们创建的网络也已被移除。

解决 Docker Compose 常见问题

此步骤为可选步骤。如果你不想练习解决 Docker Compose 问题,可以跳过。

即使解决了 “docker-compose: 命令未找到” 错误,你在使用 Docker Compose 时仍可能遇到其他常见问题。让我们来探讨这些问题及其解决方案。

问题 1:与现有容器冲突

有时你可能会遇到类似这样的错误:

ERROR: for web  Cannot create container for service web: Conflict. The container name "/docker-compose-test-web-1" is already in use by container.

当存在同名容器时就会发生这种情况。让我们看看如何处理:

  1. 首先,检查是否有现有容器:
docker ps -a

此命令会列出所有容器,包括已停止的容器。

  1. 如果你看到有冲突名称的容器,可以将其移除:
docker rm -f docker-compose-test-web-1

docker-compose-test-web-1 替换为你输出中的实际容器名称。

问题 2:权限被拒绝错误

使用 Docker Compose 时,有时你可能会看到权限错误。这些错误通常是因为 Docker 命令通常需要 root 权限。如果你看到类似这样的错误:

ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

你可能需要在 Docker Compose 命令前使用 sudo,或者确保你的用户在 Docker 组中。要将你的用户添加到 Docker 组:

sudo usermod -aG docker $USER

注意:这需要注销并重新登录才能生效。对于本实验,如果需要,我们可以在命令前使用 sudo

问题 3:端口冲突

如果你看到类似这样的错误:

ERROR: for web  Cannot start service web: driver failed programming external connectivity on endpoint: Bind for 0.0.0.0:8080 failed: port is already allocated

这意味着另一个服务已经在使用端口 8080。要解决此问题:

  1. 找出正在使用端口 8080 的服务:
sudo lsof -i :8080
  1. 要么停止该服务,要么修改你的 docker-compose.yml 以使用不同的端口:
nano docker-compose.yml

将端口映射从 "8080:80" 改为类似 "8081:80",然后保存并退出。

  1. 再次启动你的 Docker Compose 应用程序:
docker compose up -d

让我们练习解决端口冲突

让我们故意制造一个端口冲突并解决它:

  1. 使用相同端口创建一个新的 Docker Compose 项目:
mkdir -p ~/project/another-test
cd ~/project/another-test
nano docker-compose.yml
  1. 添加以下内容:
version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"

保存并退出。

  1. 启动新服务:
docker compose up -d
  1. 现在,回到你原来的项目并尝试启动它:
cd ~/project/docker-compose-test
docker compose up -d

你应该会看到一个端口冲突错误。

  1. 修改你原来的 docker-compose.yml 以使用端口 8081 代替:
nano docker-compose.yml

"8080:80" 改为 "8081:80",保存并退出。

  1. 再次尝试启动它:
docker compose up -d

现在两个服务都应该在运行,一个在端口 8080,另一个在端口 8081。

  1. 通过停止并移除两个项目来清理:
docker compose down
cd ~/project/another-test
docker compose down

总结

恭喜你完成了这个关于解决 “docker-compose: 命令未找到” 错误的实验。你已经成功地:

  1. 验证了 Docker 和 Docker Compose 的安装状态
  2. 使用不同方法安装了 Docker Compose
  3. 创建并运行了一个简单的 Docker Compose 应用程序
  4. 学习了用于管理应用程序的基本 Docker Compose 命令
  5. 探讨了常见的 Docker Compose 问题及其解决方案

在你未来处理多容器 Docker 应用程序时,这些技能将非常有用。你所学的故障排除技术可以应用于许多其他与 Docker 相关的问题,使你的开发工作流程更加顺畅和高效。