構建您的 Rust 映象

先決條件

  • 您已安裝最新版本的 Docker Desktop
  • 您有一個 git 客戶端。本節中的示例使用基於命令列的 git 客戶端,但您可以使用任何客戶端。

概述

本指南將引導您構建第一個 Rust 映象。映象包含執行應用程式所需的一切——程式碼或二進位制檔案、執行時、依賴項以及任何其他所需的檔案系統物件。

獲取示例應用程式

克隆示例應用程式以配合本指南使用。開啟終端,將目錄更改到您要工作的目錄,然後執行以下命令克隆儲存庫:

$ git clone https://github.com/docker/docker-rust-hello && cd 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
  • README.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 檔案。然後展示瞭如何構建映象。最後,展示瞭如何標記映象和列出所有映象。

相關資訊

後續步驟

在下一節中學習如何將您的映象作為容器執行。