Docker - Rust 设置



Rust 是一种通用编程语言,提供内存安全、并发性和高性能。内存安全保证所有引用始终指向有效内存;但是,此内存没有垃圾回收器。为了同时强制执行内存安全并防止数据竞争,它的“借用检查器”在编译期间跟踪程序中所有引用的对象生命周期。

Docker 另一方面,是一个用于在容器中开发、交付和运行应用程序的平台。它提供了一种将应用程序及其依赖项打包到一个单元中的方法。这保证了在不同环境中运行应用程序的一致性。

为什么要将 Rust 应用程序 Docker 化?

  • 可移植性 - 它允许您将 Rust 应用程序及其依赖项打包到一个容器中,从而使其易于在不同的系统上部署和运行。
  • 隔离 - 容器提供沙盒环境以避免不同应用程序之间的冲突。
  • 可重复性 - 使用相同的 Docker 镜像,您可以轻松地复制和扩展应用程序实例及其环境配置。
  • 效率 - 由于 Docker 容器可以非常快速地启动和关闭,因此它们在微服务架构中非常有用。

Docker 化 Rust 的先决条件

在开始之前,请确保您已安装以下内容 -

  • Rust - 您可以从 https://www.rust-lang.net.cn/ 下载并安装 Rust 编译器。
  • Docker - 您可以从 https://www.docker.net.cn/ 下载并安装 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 镜像层和构建缓存方法。

广告