構建你的 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
  • 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 檔案。然後展示瞭如何構建映象。最後,展示瞭如何標記映象和列出所有映象。

相關資訊

下一步

在下一節中,瞭解如何將您的映象作為容器執行。