构建您的 Rust 镜像

先决条件

  • 您已安装最新版本的 Docker Desktop
  • 你有一个 git 客户端。本节中的示例使用基于命令行的 git 客户端,但您可以使用任何客户端。

概述

本指南将引导您构建您的第一个 Rust 镜像。映像包含运行应用程序所需的一切 - 代码或二进制文件、运行时、依赖项以及所需的任何其他文件系统对象。

获取示例应用程序

克隆示例应用程序以与本指南一起使用。打开终端,将目录更改为您想要工作的目录,然后运行以下命令来克隆存储库:

$ git clone https://github.com/docker/docker-rust-hello

为 Rust 创建 Dockerfile

现在您已经有了一个应用程序,您可以docker init为其创建一个 Dockerfile。在目录中docker-rust-hello,运行docker init命令。docker init提供了一些默认配置,但您需要回答一些有关您的应用程序的问题。请参阅以下示例来回答提示,docker init并对提示使用相同的答案。

$ docker init
Welcome to the Docker Init CLI!

This utility will walk you through creating the following files with sensible defaults for your project:
  - .dockerignore
  - Dockerfile
  - compose.yaml
  - README.Docker.md

Let's get started!

? What application platform does your project use? Rust
? What version of Rust do you want to use? 1.70.0
? What port does your server listen on? 8000

docker-rust-hello 您的目录中现在应该有以下新文件:

  • Dockerfile
  • .dockerignore
  • compose.yaml
  • 自述文件.Docker.md

为了构建镜像,只需要 Dockerfile。在您最喜欢的 IDE 或文本编辑器中打开 Dockerfile 并查看它包含的内容。要了解有关 Dockerfile 的更多信息,请参阅 Dockerfile 参考

.dockerignore 文件

当您运行时docker init,它还会创建一个 .dockerignore文件。使用该.dockerignore文件指定您不想复制到图像中的模式和路径,以使图像尽可能小。在您最喜欢的 IDE 或文本编辑器中打开该.dockerignore文件,看看里面有什么。

构建图像

现在您已经创建了 Dockerfile,您可以构建映像了。为此,请使用该docker build命令。该docker build命令从 Dockerfile 和上下文构建 Docker 映像。构建的上下文是位于指定 PATH 或 URL 中的文件集。 Docker 构建过程可以访问位于此上下文中的任何文件。

构建命令可以选择使用一个--tag标志。该标签设置图像的名称和格式中的可选标签name:tag。如果您不传递标签,Docker 将使用“latest”作为其默认标签。

构建 Docker 镜像。

$ docker build --tag docker-rust-image .

您应该看到如下所示的输出。

[+] Building 62.6s (14/14) FINISHED
 => [internal] load .dockerignore                                                                                                    0.1s
 => => transferring context: 2B                                                                                                      0.0s 
 => [internal] load build definition from Dockerfile                                                                                 0.1s
 => => transferring dockerfile: 2.70kB                                                                                               0.0s 
 => resolve image config for docker.io/docker/dockerfile:1                                                                           2.3s
 => CACHED docker-image://docker.io/docker/dockerfile:1@sha256:39b85bbfa7536a5feceb7372a0817649ecb2724562a38360f4d6a7782a409b14      0.0s
 => [internal] load metadata for docker.io/library/debian:bullseye-slim                                                              1.9s
 => [internal] load metadata for docker.io/library/rust:1.70.0-slim-bullseye                                                         1.7s 
 => [build 1/3] FROM docker.io/library/rust:1.70.0-slim-bullseye@sha256:585eeddab1ec712dade54381e115f676bba239b1c79198832ddda397c1f  0.0s
 => [internal] load build context                                                                                                    0.0s 
 => => transferring context: 35.29kB                                                                                                 0.0s 
 => [final 1/3] FROM docker.io/library/debian:bullseye-slim@sha256:7606bef5684b393434f06a50a3d1a09808fee5a0240d37da5d181b1b121e7637  0.0s 
 => CACHED [build 2/3] WORKDIR /app                                                                                                  0.0s
 => [build 3/3] RUN --mount=type=bind,source=src,target=src     --mount=type=bind,source=Cargo.toml,target=Cargo.toml     --mount=  57.7s 
 => CACHED [final 2/3] RUN adduser     --disabled-password     --gecos ""     --home "/nonexistent"     --shell "/sbin/nologin"      0.0s
 => CACHED [final 3/3] COPY --from=build /bin/server /bin/                                                                           0.0s
 => exporting to image                                                                                                               0.0s
 => => exporting layers                                                                                                              0.0s
 => => writing image sha256:f1aa4a9f58d2ecf73b0c2b7f28a6646d9849b32c3921e42adc3ab75e12a3de14                                         0.0s
 => => naming to docker.io/library/docker-rust-image

查看本地图片

要查看本地计算机上的映像列表,您有两种选择。一种是使用 Docker CLI,另一种是使用 Docker Desktop。由于您已经在终端中工作,请查看使用 CLI 列出图像。

要列出图像,请运行docker images命令。

$ docker images
REPOSITORY                TAG               IMAGE ID       CREATED         SIZE
docker-rust-image         latest            8cae92a8fbd6   3 minutes ago   123MB

您应该看到至少列出了一张图像,包括您刚刚构建的图像docker-rust-image:latest

标记图像

如前所述,图像名称由斜杠分隔的名称组件组成。名称组件可以包含小写字母、数字和分隔符。分隔符可以包括句点、一个或两个下划线、或者一个或多个破折号。名称组件不能以分隔符开头或结尾。

图像由清单和层列表组成。此时不要太担心清单和层,除了“标签”指向这些工件的组合之外。一张图片可以有多个标签。为您构建的图像创建第二个标签并查看其图层。

要为您构建的映像创建新标签,请运行以下命令。

$ docker tag docker-rust-image:latest docker-rust-image:v1.0.0

docker tag命令为图像创建一个新标签。它不会创建新图像。标签指向同一张图像,只是引用图像的另一种方式。

现在,运行docker images命令以查看本地映像的列表。

$ docker images
REPOSITORY                TAG               IMAGE ID       CREATED         SIZE
docker-rust-image         latest            8cae92a8fbd6   4 minutes ago   123MB
docker-rust-image         v1.0.0            8cae92a8fbd6   4 minutes ago   123MB
rust                      latest            be5d294735c6   4 minutes ago   113MB

您可以看到两个图像以 开头docker-rust-image。您知道它们是相同的图像,因为如果您查看该IMAGE ID列,您可以看到两个图像的值相同。

删除您刚刚创建的标签。为此,请使用该rmi命令。该rmi命令代表删除图像。

$ docker rmi docker-rust-image:v1.0.0
Untagged: docker-rust-image:v1.0.0

请注意,Docker 的响应告诉您 Docker 并未删除该映像,而只是“取消标记”它。您可以通过运行docker images命令来检查这一点。

$ docker images
REPOSITORY               TAG               IMAGE ID       CREATED         SIZE
docker-rust-image        latest            8cae92a8fbd6   6 minutes ago   123MB
rust                     latest            be5d294735c6   6 minutes ago   113MB

Docker 删除了标记为 的映像:v1.0.0,但该docker-rust-image:latest标记在您的计算机上可用。

概括

本节展示了如何docker init为 Rust 应用程序创建 Dockerfile 和 .dockerignore 文件。然后它向您展示了如何构建图像。最后,它向您展示了如何标记图像并列出所有图像。

相关信息:

下一步

在下一节中,了解如何将映像作为容器运行。