如何使用 docker compose up 命令管理容器

DockerDockerBeginner
立即练习

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

简介

在本实验中,你将学习如何使用 docker compose up 命令高效管理容器。我们将涵盖 docker compose up 的基础用法,包括如何通过 docker-compose.yml 文件启动服务,以及在前台和 detached(后台)模式下运行服务。

此外,你还将探索 docker compose up 的高级选项,例如使用 force-recreate 强制重建容器、通过 no-recreate 避免不必要的重建,以及在启动容器前自动构建镜像。完成本实验后,你将能熟练运用 docker compose up 应对各种容器管理场景。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-555096{{"如何使用 docker compose up 命令管理容器"}} docker/ps -.-> lab-555096{{"如何使用 docker compose up 命令管理容器"}} docker/stop -.-> lab-555096{{"如何使用 docker compose up 命令管理容器"}} docker/rm -.-> lab-555096{{"如何使用 docker compose up 命令管理容器"}} docker/build -.-> lab-555096{{"如何使用 docker compose up 命令管理容器"}} end

使用 docker compose up 启动服务

在本步骤中,你将学习如何使用 docker compose up 命令启动 docker-compose.yml 文件中定义的服务。开始之前,我们需要先安装 Docker Compose,因为当前环境中并未预装该工具。

首先安装 Docker Compose。我们将下载最新稳定版本并赋予可执行权限:

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

安装完成后,我们将在 ~/project 目录下创建一个简单的 docker-compose.yml 文件来定义服务:

nano ~/project/docker-compose.yml

向文件中添加以下内容:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

docker-compose.yml 文件定义了一个名为 web 的服务,使用 nginx:latest 镜像,并将主机的 80 端口映射到容器的 80 端口。

现在使用 docker compose up 启动服务。进入 ~/project 目录并运行命令:

cd ~/project
docker compose up

你将看到输出信息显示 Docker Compose 正在创建并启动 web 容器。默认情况下,docker compose up 会以前台模式运行,显示服务的日志输出。

要验证 Nginx 容器是否正常运行,可以打开新终端或使用 curl 访问 web 服务器:

curl http://localhost

你应该能看到默认的 Nginx 欢迎页面 HTML 输出,这表示 web 服务已成功运行并可访问。

如需停止服务,在运行 docker compose up 的终端中按下 Ctrl+C,这将停止并移除容器。

在后台模式运行服务

在上一步中,你使用 docker compose up 以前台模式启动了服务。这种方式适合调试,但在生产环境或需要后台运行时,你应该使用 detached(后台)模式。

后台模式意味着 Docker Compose 会启动容器后立即退出,让容器在后台持续运行。这样你就可以继续使用终端执行其他任务。

要在后台模式运行服务,只需在 docker compose up 命令后添加 -d 参数。请确保当前位于存放 docker-compose.yml 文件的 ~/project 目录下:

cd ~/project
docker compose up -d

你将看到容器创建和启动的输出信息,但命令会在服务启动完成后立即返回终端提示符。

要验证容器是否在后台运行,可以使用 docker ps 命令查看运行中的容器列表:

docker ps

你应该能看到名为 project-web-1 的容器条目(容器名称通常遵循 [目录名]-[服务名]-[实例编号] 的格式)。

仍然可以使用 curl 访问 Nginx 服务器来确认服务正常运行:

curl http://localhost

你应该会再次看到默认的 Nginx 欢迎页面 HTML 输出。

要停止后台运行的服务,可以在 docker-compose.yml 文件所在目录执行 docker compose down 命令:

docker compose down

该命令会停止并移除由 docker compose up 创建的所有容器、网络和存储卷。

强制重建容器(force-recreate)

在上一步中,你学习了如何在后台模式运行服务。默认情况下,当你使用相同的 docker-compose.yml 文件再次运行 docker compose up 且容器已在运行时,Docker Compose 不会重建容器,除非服务定义发生变更(例如镜像或端口配置)。

有时你可能希望强制 Docker Compose 停止并重建容器,即使服务定义没有变化。这在需要应用不涉及修改 docker-compose.yml 文件的更新时很有用,或者只是为了让容器重新启动。

要强制重建容器,可以在 docker compose up 命令中添加 --force-recreate 参数。

首先确保你的 web 服务已按上一步骤在后台运行。如果没有,请执行:

cd ~/project
docker compose up -d

现在,让我们带上 --force-recreate 参数再次运行 docker compose up

cd ~/project
docker compose up -d --force-recreate

你将看到输出信息显示 Docker Compose 正在停止并重建 web 容器。即使 docker-compose.yml 文件没有变化,--force-recreate 参数也会指示 Docker Compose 拆除现有容器,并根据当前配置创建新容器。

可以通过 docker ps 检查容器 ID 来验证容器是否已重建。新的容器 ID 应该与执行带 --force-recreate 参数命令前看到的 ID 不同。

docker ps

注意输出中的容器 ID。

清理时,停止运行中的服务:

cd ~/project
docker compose down

使用 no-recreate 防止容器重建

在上一步中,你学习了如何使用 --force-recreate 参数强制重建容器。现在,我们来看相反的场景:防止容器重建。

如前所述,默认情况下,当容器已在运行且 docker-compose.yml 文件中的配置未更改时,docker compose up 不会重建容器。但有些情况下,你可能需要明确确保现有容器不会被重建,即使存在可能触发重建的微小改动。

要防止容器重建,可以在 docker compose up 命令中使用 --no-recreate 参数。

首先确保你的 web 服务已停止。如果正在运行,请使用以下命令停止:

cd ~/project
docker compose down

现在,让我们使用 docker compose up -d 启动服务:

cd ~/project
docker compose up -d

验证容器是否正在运行:

docker ps

记录下容器 ID。

现在,让我们带上 --no-recreate 参数再次运行 docker compose up

cd ~/project
docker compose up -d --no-recreate

你将看到输出信息显示服务已是最新状态,且容器未被重建。如果再次检查 docker ps,会发现容器 ID 与之前相同:

docker ps

这证明 --no-recreate 参数成功阻止了 Docker Compose 重建现有容器。

清理时,停止运行中的服务:

cd ~/project
docker compose down

启动容器前构建镜像

在前面的步骤中,我们使用了 Docker Hub 上预构建的镜像(如 nginx:latest)。但实际开发中,你经常需要为应用程序构建自定义的 Docker 镜像。

Docker Compose 可以在启动服务前自动构建 docker-compose.yml 文件中定义的镜像。这通常通过为服务指定 build 上下文而非 image 名称来实现。

让我们修改 docker-compose.yml 文件来构建一个简单的自定义 Nginx 镜像。

首先,在 ~/project 目录下创建名为 nginx_custom 的新目录:

cd ~/project
mkdir nginx_custom

接着,在 nginx_custom 目录中创建 Dockerfile

nano ~/project/nginx_custom/Dockerfile

将以下内容添加到 Dockerfile

FROM nginx:latest
RUN echo '<h1>Hello from Custom Nginx!</h1>' > /usr/share/nginx/html/index.html

这个 Dockerfile 基于官方的 nginx:latest 镜像,然后将默认的 index.html 文件替换为自定义内容。

接下来,修改 ~/project/docker-compose.yml 文件,让 web 服务使用这个 Dockerfile 构建镜像。打开文件进行编辑:

nano ~/project/docker-compose.yml

web 服务的定义从 image 改为 build

version: "3.8"
services:
  web:
    build: ./nginx_custom
    ports:
      - "80:80"

现在当你运行 docker compose up 时,Docker Compose 会先构建 ./nginx_custom 目录中 Dockerfile 定义的镜像,然后使用新构建的镜像启动容器。

确保当前位于 ~/project 目录并运行:

cd ~/project
docker compose up -d

你将看到输出显示 Docker Compose 正在构建镜像,然后创建并启动容器。

使用 curl 验证是否成功提供了自定义 Nginx 页面:

curl http://localhost

你应该会看到输出 <h1>Hello from Custom Nginx!</h1>,这确认了镜像已成功构建且容器正在运行自定义内容。

清理时停止运行中的服务:

cd ~/project
docker compose down

总结

在本实验中,你学习了如何使用 docker compose up 命令管理容器。首先安装了 Docker Compose 并创建了一个简单的 docker-compose.yml 文件,定义了使用 Nginx 镜像的 web 服务。随后使用 docker compose up 启动服务,观察到默认情况下它会以前台模式运行并显示容器日志。你通过访问 Nginx 欢迎页面验证了服务正常运行。

实验还介绍了使用 -d 参数以分离模式运行服务,使命令退出后容器仍能在后台继续运行。你学习了如何通过 --force-recreate 参数强制重建容器(即使配置未更改),以及如何使用 --no-recreate 参数防止重建现有容器。最后,你探索了 --build 参数在启动容器前构建或重新构建镜像的功能,确保使用最新的镜像。