如何使用 docker compose create 命令构建和创建容器

DockerDockerBeginner
立即练习

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

简介

在本实验中,你将学习如何高效使用 docker compose create 命令,基于 docker-compose.yml 文件构建和创建容器。我们将从准备一个简单的 docker-compose.yml 文件开始,包括在 LabEx 环境中安装 Docker Compose 的必要步骤。

完成环境配置后,你将探索 docker compose create 的基本用法,然后深入了解它的各种选项。这包括使用 --force-recreate 强制重建容器、通过 --no-build 在不重新构建镜像的情况下创建容器,以及使用 --pull always 确保拉取最新镜像。通过本实验,你将扎实掌握如何利用 docker compose create 来管理你的多容器应用。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555076{{"如何使用 docker compose create 命令构建和创建容器"}} docker/ps -.-> lab-555076{{"如何使用 docker compose create 命令构建和创建容器"}} docker/rm -.-> lab-555076{{"如何使用 docker compose create 命令构建和创建容器"}} docker/create -.-> lab-555076{{"如何使用 docker compose create 命令构建和创建容器"}} docker/pull -.-> lab-555076{{"如何使用 docker compose create 命令构建和创建容器"}} end

准备一个简单的 docker-compose.yml 文件

在这一步中,我们将准备一个简单的 docker-compose.yml 文件。开始之前,我们需要先安装 Docker Compose。由于 LabEx 的虚拟机环境没有预装 Docker Compose,我们需要手动安装。我们将下载 Docker Compose 二进制文件并赋予可执行权限。

首先,使用 curl 下载 Docker Compose 二进制文件。我们将下载 1.29.2 版本,该版本与已安装的 Docker 版本兼容。

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

这条命令从 GitHub 官方发布页面下载 Docker Compose 二进制文件,并保存到 /usr/local/bin/docker-compose$(uname -s)$(uname -m) 会自动检测你的操作系统和架构,确保下载正确的二进制文件。

接下来,我们需要为下载的二进制文件添加可执行权限。

sudo chmod +x /usr/local/bin/docker-compose

这条命令为 docker-compose 文件添加执行权限,使其可以作为命令运行。

现在,我们通过检查版本来验证 Docker Compose 是否安装成功。

docker-compose --version

你应该会看到类似 docker-compose version 1.29.2, build 5becea4c 的输出,这表示 Docker Compose 已安装并可以使用了。

现在,我们在你的 ~/project 目录下创建一个简单的 docker-compose.yml 文件。该文件将使用 nginx 镜像定义一个服务。

nano ~/project/docker-compose.yml

这条命令会打开 nano 文本编辑器来创建和编辑 docker-compose.yml 文件。将以下内容粘贴到编辑器中:

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

让我们分解一下这个 docker-compose.yml 文件:

  • version: '3.8' 指定了 Docker Compose 文件格式的版本。
  • services: 定义了你想运行的服务(容器)。
  • web: 是我们的服务名称,你可以随意命名。
  • image: nginx:latest 指定了该服务使用的 Docker 镜像。这里我们使用了官方 Nginx 镜像的最新版本。
  • ports: 映射主机和容器之间的端口。"80:80" 将主机的 80 端口映射到容器的 80 端口。这意味着你可以通过访问 http://localhost(或虚拟机的 IP 地址)来访问容器内运行的 Nginx 网页服务器。

Ctrl + O 保存文件,然后按 Enter,最后按 Ctrl + X 退出编辑器。

现在,你已经成功创建了一个简单的 docker-compose.yml 文件,该文件使用 Nginx 镜像定义了一个 web 服务。在接下来的步骤中,我们将使用这个文件来创建和管理容器。

使用 docker compose create 创建容器

在本步骤中,我们将使用 docker-compose create 命令基于上一步准备的 docker-compose.yml 文件创建容器。docker-compose create 命令会创建容器但不会启动它们,这在你想配置容器环境但不需要立即运行服务时非常有用。

在创建容器前,我们先确认本地是否已有 nginx 镜像。如果没有,Docker Compose 会在创建过程中自动拉取该镜像。不过,了解你正在使用的镜像是个好习惯。你可以使用 docker pull 命令手动拉取镜像:

docker pull nginx:latest

该命令会从 Docker Hub 下载 nginx:latest 镜像到本地。你将看到显示下载进度和完成的输出信息。

现在,请切换到包含 docker-compose.yml 文件的目录。在我们的案例中,这是 ~/project 目录。

cd ~/project

然后运行 docker-compose create 命令:

docker-compose create

该命令会读取当前目录下的 docker-compose.yml 文件,并创建其中定义的容器。你将看到输出信息显示正在为 web 服务创建容器。

命令执行完成后,你可以使用 docker ps -a 命令查看已创建容器的状态。

docker ps -a

docker ps -a 的输出会显示所有容器,包括未运行的容器。你应该能看到一个名为 project_web_1 的容器(名称是基于目录名和服务名生成的),其状态为 Created。这确认了容器已成功创建但尚未启动。

docker-compose create 命令非常适合用于容器的预配置。在接下来的步骤中,我们将探索如何启动和管理这些容器。

使用 --force-recreate 强制重建容器

在本步骤中,我们将学习如何使用 docker-compose create --force-recreate 命令强制重建容器。--force-recreate 标志用于强制重建容器,即使其配置没有发生变化。这在需要刷新容器实例的场景下非常有用,例如当底层镜像发生变化而 Docker Compose 可能无法自动检测到时。

首先,请确保你位于包含 docker-compose.yml 文件的 ~/project 目录中。

cd ~/project

现在,运行带有 --force-recreate 标志的 docker-compose create 命令:

docker-compose create --force-recreate

由于我们在上一步已经创建过容器,Docker Compose 会检测到现有容器。由于使用了 --force-recreate 标志,它将移除现有容器并使用相同配置创建一个新容器。你将看到输出信息显示正在移除现有容器并创建新容器。

让我们再次使用 docker ps -a 验证容器状态。

docker ps -a

你仍然会看到一个名为 project_web_1 且状态为 Created 的容器。虽然名称和配置相同,但由于 --force-recreate 标志的作用,这是一个新建的容器实例。

当你需要确保获得全新的容器实例时(无论 docker-compose.yml 文件中的配置是否发生变化),--force-recreate 标志都是一个强大的选项。

使用 --no-build 选项创建容器(不执行构建)

在本步骤中,我们将探讨 docker-compose create --no-build 选项的使用。当你的 docker-compose.yml 文件包含需要通过 Dockerfile 构建的服务(使用 build 指令)时,这个标志特别有用——它允许你只创建容器而不重新构建镜像。由于我们当前的 docker-compose.yml 文件仅使用预构建的镜像(nginx:latest),在这个特定案例中 --no-build 标志不会对镜像构建过程产生可见影响。但理解其用途对将来处理需要构建的服务非常重要。

首先,请确保你位于 ~/project 目录中。

cd ~/project

现在,让我们运行带有 --no-build 标志的 docker-compose create 命令。由于前几步已存在 project_web_1 容器,我们将同时使用 --force-recreate 标志确保创建新容器。

docker-compose create --no-build --force-recreate

如果你的 docker-compose.yml 中定义了使用 build 指令的服务,运行此命令会使用现有镜像(如果可用)或拉取镜像来创建容器,但会跳过 Dockerfile 中定义的镜像构建过程。在当前案例中,由于我们使用的是预构建镜像,输出结果将与上一步类似,显示旧容器被移除和新容器被创建。

让我们再次验证容器状态。

docker ps -a

你仍会看到状态为 Createdproject_web_1 容器。--no-build 标志主要影响基于 Dockerfile 构建的服务,它会在容器创建过程中跳过构建流程。

使用 --pull always 创建容器并拉取镜像

在本步骤中,我们将使用 docker-compose create --pull always 命令。--pull always 标志会指示 Docker Compose 在创建容器前始终拉取最新版本的镜像,即使本地已存在该镜像的副本。这能确保你始终使用服务的最新镜像。

首先,请确认你位于 ~/project 目录中。

cd ~/project

现在运行带有 --pull always 标志的 docker-compose create 命令。由于 project_web_1 容器已存在,我们将同时使用 --force-recreate 标志来基于可能已更新的镜像创建新容器。

docker-compose create --pull always --force-recreate

执行此命令时,Docker Compose 会首先检查 Docker Hub 上 nginx:latest 镜像的更新。如果有新版本可用,将会拉取该镜像。随后,系统会移除现有的 project_web_1 容器,并使用拉取的镜像创建新容器。你将看到显示拉取过程(如果有新镜像可用)的输出,接着是容器的移除和创建过程。

让我们最后确认一次容器状态。

docker ps -a

你仍会看到状态为 Createdproject_web_1 容器。这里的关键区别在于,Docker Compose 在创建这个容器实例前主动检查并可能拉取了更新的镜像。

--pull always 标志对于保持服务部署与最新镜像版本同步非常重要,这能确保你获得最新的功能、错误修复和安全更新。

总结

在本实验中,我们学习了如何使用 docker compose create 命令基于 docker-compose.yml 文件构建和创建容器。我们首先准备了一个定义 Nginx 服务的简单 docker-compose.yml 文件,这包括在 LabEx 环境中通过下载二进制文件并赋予可执行权限来手动安装 Docker Compose,随后我们验证了安装结果。

准备工作完成后,我们探索了 docker compose create 命令的多种选项。我们学习了如何使用基础命令创建容器,如何通过 --force-recreate 标志强制重建现有容器,如何使用 --no-build 标志在不重新构建镜像的情况下创建容器,以及如何通过 --pull always 标志确保在创建前拉取最新镜像。这些步骤展示了 docker compose create 在管理容器生命周期方面提供的灵活性和控制力。