简介
本教程将指导你在 LabEx 云虚拟机(VM)上使用带有主机网络配置的 Docker Compose。Docker Compose 是一个帮助你管理多个容器的工具——可以把容器想象成运行像 Web 服务器这样应用程序的轻量级、隔离环境。通常情况下,Docker 会将容器的网络与主机(即你正在使用的虚拟机)隔离开来,但主机网络选项允许容器直接共享主机的网络。当你的应用程序需要表现得就像直接在主机上运行一样时,这会很有用,例如无需额外设置即可访问主机的端口。最后,你将设置 Docker Compose,使用主机网络创建、部署并测试一个简单的 Web 服务。Docker 已预先安装在你的 LabEx 环境中,但我们也会确保 Docker Compose 也已准备就绪。
本实验需要联网学习,因此只有 Pro 用户可以启动虚拟机。将你的账户升级为 Pro。
设置 Docker Compose
在深入配置之前,让我们确保你的 LabEx 云虚拟机上已经安装了 Docker Compose。虽然 Docker 是预先安装好的,但 Docker Compose(一个用于管理多容器设置的独立工具)可能还没有安装。我们将使用终端快速安装它。
在你的 LabEx 虚拟机中打开终端。提示符应该显示为 /home/labex/project —— 这是你的默认工作目录。逐个运行以下命令:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

以下是这些命令的作用:
- **
curl**:从 Docker Compose 的官方 GitHub 发布页面下载二进制文件。URL 中使用$(uname -s)-$(uname -m)来匹配你的虚拟机系统(例如,Linux-x86_64)。版本 2.20.2 是稳定且广泛兼容的。 - **
-o /usr/local/bin/docker-compose**:将文件保存到/usr/local/bin,这是可执行工具的标准存放位置。sudo确保你有写入该位置的权限。 - **
chmod +x**:使文件可执行,这样你就可以将其作为命令运行。同样,sudo授予所需的权限。
要确认安装是否成功,请运行:
docker-compose --version
你应该会看到类似 Docker Compose version v2.20.2 的输出。如果你得到 "command not found",请仔细重新运行这些命令 —— 检查是否有拼写错误或网络问题(虚拟机需要网络访问才能下载)。这一步确保你可以在接下来的步骤中使用 docker-compose。
使用主机网络创建 Docker Compose 文件
既然 Docker Compose 已经准备就绪,让我们创建一个 docker-compose.yml 文件 —— 这是你使用主机网络运行 Web 服务的蓝图。我们将使用 nano,这是一个简单且对初学者友好的终端文本编辑器。
要创建并编辑该文件,请按照以下步骤操作:
在终端中,确保你位于项目目录:
cd /home/labex/project使用 nano 创建并打开文件:
nano docker-compose.yml在 nano 中输入或粘贴以下内容:
version: "3"
services:
web:
image: nginx:latest
network_mode: host
各部分含义如下:
- **
version: "3"**:设置 Docker Compose 文件格式。版本 3 是一个通用标准,就像选择一个模板。 - **
services**:列出要运行的容器(或“服务”),就像项目的工作进程。 - **
web**:为你的服务命名 —— 可以叫任何名字,但“web”适合 Web 服务器。 - **
image: nginx:latest**:指定软件 —— Nginx,一个流行的 Web 服务器,latest表示从 Docker Hub(一个容器镜像库)拉取最新版本。 - **
network_mode: host**:关键设置。通常,Docker 会为容器提供自己的专用网络,将它们与主机隔离。host模式让容器直接使用虚拟机的网络,这样 Nginx 就可以直接访问主机的端口(如 80),无需额外步骤。
- 要在 nano 中保存文件:
- 按
Ctrl + X退出 - 按
Y确认保存更改 - 按
Enter确认文件名
- 按
该文件现在已保存在 /home/labex/project 中,你可以准备进行下一步了。
部署 Docker Compose 应用程序
docker-compose.yml 文件设置好后,让我们来部署 Nginx 容器 —— 告诉 Docker 根据你的蓝图启动它。为此,请切换到终端。
在 /home/labex/project 目录的终端中,运行以下命令:
docker-compose up -d
下面是对该命令的详细解释:
- **
docker-compose**:这是一个读取docker-compose.yml文件并管理你的服务的工具。 - **
up**:启动文件中定义的web服务(即 Nginx)。 - **
-d**:让服务在后台运行(“分离”模式),这样你的终端就可以继续使用。
如果虚拟机上还没有 nginx:latest 镜像,Docker Compose 会从 Docker Hub 下载该镜像(你可能会看到下载信息),然后启动容器。使用以下命令检查容器是否正在运行:
docker ps
该命令会列出所有正在运行的容器。在“IMAGE”列中查找 nginx:latest,在“STATUS”列中查找“Up”(例如,“Up 5 seconds”)。你不会看到端口映射信息(如 0.0.0.0:80->80/tcp),因为 network_mode: host 直接使用主机的端口。如果没有显示任何内容,请确保你处于 /home/labex/project 目录(使用 pwd 命令检查),并重新运行 docker-compose up -d。
测试主机网络上的 Nginx 服务
既然容器已经使用主机网络运行起来了,让我们测试一下 Nginx 是否能在主机的 80 端口(标准 Web 端口)上提供网页服务。
在 /home/labex/project 目录的终端中,运行以下命令:
curl localhost:80
下面是命令的执行原理:
- **
curl**:从网页地址获取数据,类似于基于终端的浏览器。 - **
localhost:80**:连接到虚拟机自身(localhost)的 80 端口。由于使用了network_mode: host,容器中的 Nginx 使用主机的网络,因此其 80 端口就是主机的 80 端口。
你应该会看到以 <!DOCTYPE html> 开头的 HTML 内容 —— 这是 Nginx 的默认欢迎页面。通常情况下,Docker 会隔离容器网络,需要进行端口映射(例如,将主机的 80 端口映射到容器的 80 端口)。而主机模式跳过了这一步,允许 Nginx 直接绑定到虚拟机的 80 端口。
如果你收到“connection refused”的提示,请检查步骤 3,运行 docker ps 确认容器处于“Up”状态。如有需要,使用 docker-compose up -d 重新启动容器,或者使用 sudo service docker status 验证 Docker 的状态。这里不使用浏览器,因此 curl 是你的测试工具。
查看日志并清理资源
让我们查看容器的日志,了解其内部运行情况 —— 这是一项关键的故障排除技能,然后通过移除容器来清理资源。
查看日志
运行以下命令:
docker-compose logs web
- **
docker-compose logs**:显示服务的输出信息。 - **
web**:指定要查看的是docker-compose.yml中的web服务。
留意类似“nginx starting”或“listening on 0.0.0.0:80”这样的日志行。如果你使用过 curl 命令,可能会看到“GET /”的日志记录。如果 Nginx 停止运行,错误信息(例如“port 80 failed”)也会在这里显示,这在排查问题时非常有用。
清理资源
运行以下命令:
docker-compose down
- **
docker-compose down**:停止并移除容器,释放 80 端口并清理相关资源。
使用以下命令进行验证:
docker ps
如果输出中没有 nginx 相关的行,说明容器已被移除。如果容器仍然存在,请重新运行 docker-compose down 命令。docker-compose.yml 文件会保留,你之后可以使用 docker-compose up -d 命令重新启动服务。至此,我们完成了整个生命周期的操作:设置、部署、测试和移除。
故障排除与最佳实践
以下是处理问题和明智使用 Docker Compose 的方法。
故障排除提示
- 容器无法启动:如果
docker ps命令没有输出,检查docker-compose logs web以查看是否有“port in use”之类的错误信息。使用sudo lsof -i :80找出占用 80 端口的进程,并使用sudo kill <PID>终止该进程,然后运行docker-compose up -d。 curl无响应:确认容器正在运行(docker ps),并且 Docker 服务正在运行(sudo service docker status)。可以使用docker-compose up -d重新启动容器,或者使用sudo service docker restart重启 Docker 服务。- 文件问题:如果
docker-compose up命令找不到文件,请使用pwd确认你位于/home/labex/project目录下,并使用ls确认docker-compose.yml文件存在。
最佳实践
- 限制使用主机网络:主机网络模式虽然简单,但会跳过隔离机制,如果有其他服务运行,可能会带来安全风险。建议在实验环境中使用,除非必要,否则不要在生产环境中使用。
- 预先检查端口:使用
sudo netstat -tuln | grep :80检查端口使用情况,确保 80 端口未被占用。 - 保存文件:将
docker-compose.yml文件保存在/home/labex/project目录下,以便后续复用。 - 关注日志:定期查看日志,以便尽早发现问题。
养成这些习惯可以让你的 Docker 工作更加可靠,同时也能帮助你掌握核心技能。
总结
你已经完成了 Docker Compose 的安装,创建了一个使用主机网络的 docker-compose.yml 文件,部署了一个 Nginx 容器,对其进行了测试,查看了日志,并清理了资源。主机网络模式允许容器直接使用主机的网络,跳过了 Docker 的隔离机制,这是一个非常实用的技巧。这些步骤为你管理 Docker Compose 应用程序和进行故障排除奠定了基础,让你能够应对更大规模的项目。



