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

本实验需要联网进行学习,因此只有专业版用户可以启动虚拟机。将你的账户升级到专业版。
本实验提供了一份实用指南,用于解决 “docker-compose: 命令未找到” 错误,这是 Docker 用户经常遇到的一个常见问题。Docker Compose 是管理多容器 Docker 应用程序的重要工具,遇到此错误可能会阻碍你的工作流程。通过完成本实验,你将获得排查和修复此问题的技能,从而能够继续有效地开发和部署你的容器化应用程序。
本实验需要联网进行学习,因此只有专业版用户可以启动虚拟机。将你的账户升级到专业版。
Docker Compose 是一个帮助你定义和共享多容器应用程序的工具。使用 Compose,你可以创建一个 YAML 文件来配置应用程序的服务,然后通过一个命令启动所有服务。它简化了管理协同工作的多个容器的过程。
让我们首先检查 Docker Compose 是否已经安装在你的系统上。打开一个终端并运行:
docker-compose --version
你将会看到类似这样的输出:
docker-compose: 命令未找到
然而,如果你收到像 docker-compose: 命令未找到
这样的错误消息,这意味着 Docker Compose 没有安装,或者没有在你系统的路径中正确配置。
在我们安装 Docker Compose 之前,让我们验证 Docker 本身是否已正确安装。运行:
docker --version
你应该会看到类似这样的输出:
Docker 版本 20.10.21,构建版本 20.10.21-0ubuntu1~22.04.3
如果你没有看到这个输出,Docker 可能没有正确安装。不过,对于本实验,我们将专注于解决 Docker Compose 的问题。
由于我们确认 Docker Compose 未安装或无法访问,让我们来安装它。安装 Docker Compose 有几种不同的方法,但我们将重点介绍适用于 Ubuntu 系统的最直接的方法。
安装 Docker Compose 最简单的方法是通过 apt 包管理器。让我们来操作:
## 添加 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
你应该会看到显示更新过程的输出。
sudo apt install -y docker-compose-plugin
你会看到显示安装进度的输出。
docker compose version
注意:在较新的 Docker 安装中,命令是 docker compose
(有空格)而不是 docker-compose
(有连字符)。
你应该会看到类似这样的输出:
Docker Compose 版本 v2.33.1
如果你已经使用 apt 方法安装了 Docker Compose,可以跳过此方法。
如果 apt 方法不起作用,或者你需要特定版本,可以直接安装 Docker Compose:
mkdir -p ~/.docker/cli-plugins/
curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
文件下载时你会看到一个进度条。
chmod +x ~/.docker/cli-plugins/docker-compose
docker compose version
你应该会看到显示 Docker Compose 版本的输出。
既然我们已经成功安装了 Docker Compose,那就创建一个简单的 Docker Compose 项目来确保一切正常运行。
首先,为我们的 Docker Compose 项目创建一个目录:
mkdir -p ~/project/docker-compose-test
cd ~/project/docker-compose-test
现在,创建一个简单的 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
此配置定义了:
按下 Ctrl+O
然后 Enter
保存文件,再按下 Ctrl+X
退出 nano。
创建 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 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 应用程序,那就来学习如何使用各种 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 时仍可能遇到其他常见问题。让我们来探讨这些问题及其解决方案。
有时你可能会遇到类似这样的错误:
ERROR: for web Cannot create container for service web: Conflict. The container name "/docker-compose-test-web-1" is already in use by container.
当存在同名容器时就会发生这种情况。让我们看看如何处理:
docker ps -a
此命令会列出所有容器,包括已停止的容器。
docker rm -f docker-compose-test-web-1
将 docker-compose-test-web-1
替换为你输出中的实际容器名称。
使用 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
。
如果你看到类似这样的错误:
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。要解决此问题:
sudo lsof -i :8080
docker-compose.yml
以使用不同的端口:nano docker-compose.yml
将端口映射从 "8080:80"
改为类似 "8081:80"
,然后保存并退出。
docker compose up -d
让我们故意制造一个端口冲突并解决它:
mkdir -p ~/project/another-test
cd ~/project/another-test
nano docker-compose.yml
version: "3"
services:
web:
image: nginx:latest
ports:
- "8080:80"
保存并退出。
docker compose up -d
cd ~/project/docker-compose-test
docker compose up -d
你应该会看到一个端口冲突错误。
docker-compose.yml
以使用端口 8081 代替:nano docker-compose.yml
将 "8080:80"
改为 "8081:80"
,保存并退出。
docker compose up -d
现在两个服务都应该在运行,一个在端口 8080,另一个在端口 8081。
docker compose down
cd ~/project/another-test
docker compose down
恭喜你完成了这个关于解决 “docker-compose: 命令未找到” 错误的实验。你已经成功地:
在你未来处理多容器 Docker 应用程序时,这些技能将非常有用。你所学的故障排除技术可以应用于许多其他与 Docker 相关的问题,使你的开发工作流程更加顺畅和高效。