Docker - Rust 設定



Rust 是一種通用程式語言,提供記憶體安全、併發性和高效能。記憶體安全保證所有引用始終指向有效記憶體;但是,此記憶體沒有垃圾回收器。為了同時強制執行記憶體安全並防止資料競爭,它的“借用檢查器”在編譯期間跟蹤程式中所有引用的物件生命週期。

Docker 另一方面,是一個用於在容器中開發、交付和執行應用程式的平臺。它提供了一種將應用程式及其依賴項打包到一個單元中的方法。這保證了在不同環境中執行應用程式的一致性。

為什麼要將 Rust 應用程式 Docker 化?

  • 可移植性 - 它允許您將 Rust 應用程式及其依賴項打包到一個容器中,從而使其易於在不同的系統上部署和執行。
  • 隔離 - 容器提供沙盒環境以避免不同應用程式之間的衝突。
  • 可重複性 - 使用相同的 Docker 映象,您可以輕鬆地複製和擴充套件應用程式例項及其環境配置。
  • 效率 - 由於 Docker 容器可以非常快速地啟動和關閉,因此它們在微服務架構中非常有用。

Docker 化 Rust 的先決條件

在開始之前,請確保您已安裝以下內容 -

  • Rust - 您可以從 https://www.rust-lang.org/ 下載並安裝 Rust 編譯器。
  • Docker - 您可以從 https://www.docker.com/ 下載並安裝 Docker Desktop 或 Docker Engine。
  • 程式碼編輯器 - 您可以選擇自己喜歡的程式碼編輯器,例如 Visual Studio Code、IntelliJ IDEA 或 Vim。

設定 Rust 核心專案

  • 啟動您的終端或命令提示符。
  • 導航到所需的目錄。
  • 使用 cargo new 命令建立一個新的 Rust 專案。
$ cargo new my-rust-app
Setting up a Rust Core Project

執行此命令時,它將建立一個名為 my-rust-app 的新目錄,其中包含基本的 Rust 專案結構。

專案結構

此專案目錄將具有以下結構 -

my-rust-app/

├── Cargo.toml

└── src

    └── main.rs

Cargo.toml - 此檔案包含有關您的專案的資訊,包括依賴項和版本資訊。

src/main.rs - 這是您將在其中編寫 Rust 程式碼的主要原始檔。

新增基本的 Rust 程式

讓我們為演示目的建立一個基本的 Rust 程式。您可以開啟 src/main.rs 檔案並將內容替換為以下程式碼 -

fn main() {

   println!("Hello, world!");

}

當我們執行這個簡單的程式時,它只是將“Hello, world!”列印到控制檯。

在本地執行 Rust 專案

要在本地執行專案,您可以導航到專案目錄並執行以下命令 -

$ cargo run
Running the Rust Project Locally

執行上述命令後,它將編譯 Rust 程式碼並執行可執行檔案。您可以在終端中看到輸出“Hello, world!”。

建立 Dockerfile

正如我們在前幾章中討論的那樣,Dockerfile 是一個文字檔案,其中包含構建 Docker 映象的說明。在這裡,我們定義基本映象、依賴項以及建立可執行容器所需的所有命令。

建立新的 Dockerfile

在 Rust 專案的根目錄中建立一個名為 Dockerfile 的新檔案。

定義基本映象

對於 Rust 應用程式,一個流行的選擇是 rust:alpine 映象。它提供了一個輕量級的 Alpine Linux 環境,其中包含 Rust 編譯器和標準庫。

將基本映象新增到您的 Dockerfile 中 -

FROM rust:alpine

複製專案檔案

下一個指令是將專案目錄的內容複製到容器中 -

COPY . /app

此指令將複製整個專案,包括 Cargo.toml 檔案和 src 目錄,到容器內的 /app 目錄。

設定工作目錄

將工作目錄設定為 /app 目錄 -

WORKDIR /app

構建 Rust 應用程式

下一個指令是執行 cargo build 命令來構建您的 Rust 應用程式

RUN cargo build --release

此指令將幫助您以釋出模式編譯 Rust 程式碼,從而最佳化其效能。

公開埠(可選)

如果您的應用程式偵聽特定埠,您可以公開它 -

EXPOSE 8080

您可以將 8080 替換為您的應用程式使用的實際埠。

定義入口點

您現在可以指定容器啟動時要執行的命令 -

ENTRYPOINT ["target/release/your-app-name"]

請將 your-app-name 替換為您編譯的 Rust 可執行檔案的實際名稱。

完整的 Dockerfile 示例

FROM rust:alpine
COPY . /app
WORKDIR /app
RUN cargo build --release
EXPOSE 8080
ENTRYPOINT ["target/release/my-rust-app"]

將上面的內容複製到您的 Dockerfile 中。

構建 Rust Docker 映象

既然您已經建立了 Dockerfile,就可以構建 Rust Docker 映象了。

構建映象

啟動您的終端或 cmd 並導航到您的專案目錄。

執行以下 docker build 命令 -

$ docker build -t my-rust-app .

"-t my-rust-app" - 命令的這部分指定了 Docker 映象的標籤。您可以將 my-rust-app 替換為您想要的任何名稱。

".": 這個點表示 Dockerfile 位於當前目錄中。

Building the Rust Docker Image

驗證映象

如果您想驗證映象是否已成功構建,可以透過執行以下命令列出所有 Docker 映象 -

$ docker images
Verifying the Image

您可以在列表中看到我們新建立的 my-rust-app 映象。

將映象推送到倉庫(可選)

如果您想與他人共享 Docker 映象或將其部署到生產環境,可以輕鬆地將其推送到 Docker 倉庫(如 Docker Hub、Amazon ECR 或 Google Container Registry)。

例如,要將您的映象推送到 Docker Hub,您需要建立一個 Docker Hub 帳戶並登入 -

$ docker login

然後,您可以將映象推送到您的 Docker Hub 倉庫 -

$ docker push your-docker-hub-username/my-rust-app

您可以將 your-docker-hub-username 替換為您實際的 Docker Hub 使用者名稱。

執行 Rust Docker 容器

現在您已經準備好 Rust 應用程式的 Docker 映象,可以將其作為容器運行了。

執行容器

$ docker run -p 8080:8080 my-rust-app

-p 8080:8080 - 此標誌可幫助您將主機上的 8080 埠對映到容器內的 8080 埠。

my-rust-app - 它指定了 Docker 映象的名稱。

Running the Container

其他命令

列出正在執行的容器

docker ps

停止容器

docker stop <container_id>

刪除容器

docker rm <container_id>

刪除映象

docker rmi <image_id>

按照這些步驟操作後,您已成功將 Rust 應用程式 Docker 化,現在可以將其部署到不同的環境中。

結論

在本章中,我們學習瞭如何將 Rust 應用程式 Docker 化。首先,我們在 Rust 中建立了一個簡單的專案,然後建立了一個 Dockerfile 來定義其中包含的內容以及映象的配置方式。然後,構建 Docker 映象並最終在 Docker 容器中執行它。

作為您開發旅程的下一步,您可以學習高階 Docker 主題,例如多階段構建、Docker Compose 和其他容器編排工具(如 Kubernetes)。

關於 Docker 化 Rust 應用程式的常見問題

關於 Docker 化 Rust 應用程式,有一些非常常見的問題 (FAQ),本節嘗試簡要回答它們。

1. 如何在 Docker 化的 Rust 應用程式中處理依賴項?

使用 cargo 管理 Rust 專案的依賴項。cargo.lock 檔案將依賴項鎖定到特定版本,這將確保構建的一致性。建立 Docker 映象時,cargo 命令將自行解析依賴項並下載它們。

2. Docker 化 Rust 應用程式的最佳實踐是什麼?

首先是使用應用程式所需的最小基本映象,透過傳遞環境變數最佳化構建過程,以及利用多階段構建。出於安全考慮,請考慮使用非 root 使用者,並使用 .dockerignore 檔案排除不必要的檔案。

3. 如何提高 Docker 化的 Rust 應用程式的效能?

透過最佳化基本映象和編譯應用程式的釋出二進位制檔案,使 Docker 化的 Rust 應用程式非常快速。對其進行分析以揭示應用程式的瓶頸。除此之外,還可以嘗試不同的 Docker 映象層和構建快取方法。

廣告