建置您的 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 檔案。然後說明如何建置映像檔。最後,說明如何標記映像檔和列出所有映像檔。

相關資訊

後續步驟

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