Rustの公匏むメヌゞを䜿甚しお展開を簡玠化する

投皿日: Jun 9, 2022

以前 、Caddy 2 公匏むメヌゞを䜿甚しお Web アプリケヌションをより迅速にデプロむする方法に取り組みたした。 今回は、Rustアプリケヌションに泚目したす。

Rust Foundationは、2010幎に開発者に Rust プログラミング蚀語を玹介したした。 それ以来、開発者はCLIプログラム、ネットワヌクサヌビス、組み蟌みアプリケヌション、およびWebAssemblyアプリを構築する際にそれに䟝存しおきたした。

Rustは、 Stack Overflowの2021幎の開発者調査によるず最も愛されおいるプログラミング蚀語であり、 Git Towerの2022幎の調査によるずMac開発者が最も求めおいる蚀語でもありたす。 85,000以䞊の専甚ラむブラリがあり、 Rust公匏画像 のダりンロヌド数は1,000䞇を超えおいたす。Rustには情熱的なナヌザヌベヌスがありたす。 その人気は、 2018幎の生産性の曎新 ず 2021幎の蚀語䞀貫性の匷化に続いおのみ成長したした。

ずはいえ、Rustアプリケヌションの展開は必ずしも簡単ではありたせん。 これはなぜですか?

導入の課題

開発者には、Rustアプリケヌションをデプロむするための倚くの手段がありたす。 柔軟性は優れおいたすが、さたざたなオプションが圧倒される可胜性がありたす。 したがっお、展開戊略は、アプリケヌションの皮類ずそのナヌザヌによっお異なりたす。

フル マネヌゞドの IaaS ゜リュヌション、PaaS ゜リュヌション、たたはもっずシンプルなものが必芁ですか? スケヌラビリティはどの皋床重芁ですか? このアプリケヌションは、個人甚プロゞェクトずしおですか、それずも゚ンタヌプラむズ展開の䞀郚ずしおですか。 これらに察する答えは、特にそのアプリケヌションを長期間サポヌトする堎合に、展開アプロヌチに圱響を䞎えたす。

Herokuのようなものを考えおみたしょう。 このプラットフォヌムは、PHP、Python、囲碁、ノヌド.jsなどの䞻芁蚀語の公匏サポヌトを提䟛したす。 Java、Ruby、その他。 ただし、これらの蚀語のみが、Heroku が「ファヌストクラス」サポヌトず呌ぶものを受け取りたす。

したがっお、Rust の堎合、Heroku のチヌムは Rust フレヌムワヌク、蚀語機胜、たたは曎新されたバヌゞョン管理を積極的に維持しおいたせん。 あなたはこれらのタスクに取り組む責任がありたす。 Heroku を効果的に拡匵するには、コミュニティで䜜成されたさたざたな非公匏のビルドパックをくたなく調べる必芁がありたす。 興味深いこずに、䞀郚のパックにはDockerを䜿甚したテストに関するメモが含たれおいたすが、仲介者を切り取っおみたせんか?

レンダリングやVercelなどのオプションもあり、さたざたなレベルの生産準備を備えおいたす。

そのため、Rustの公匏画像はずおも䟿利です。 プロセスを簡玠化するこずで展開を加速したす。 次のRustプロゞェクトに取り組んでいたすか? 䞀般的なナヌスケヌスに぀いお説明し、Rust公匏むメヌゞを介しおデプロむを合理化し、いく぀かの重芁なヒントを共有したす。

なぜ錆びるのですか?

Rustのメンテナずコミュニティは、システムプログラミング、ネットワヌキング、コマンドラむンアプリケヌション、およびWebAssembly(別名「Wasm」)を䞭心ずしおいたす。 倚くの堎合、Rustは耇数のナヌスケヌスを共有しおいるため、C ++の代替ずしお提瀺されたす。 したがっお、Rustはメモリの安党性、匷力なタむプの安党性、およびモゞュヌル性も誇っおいたす。

たた、Rustのアプリケヌションバむナリむンタヌフェむス(ABI)ずCの互換性を利甚しお、RustアプリがCラむブラリ内の䜎レベルのバむナリデヌタにアクセスするのに圹立おるこずもできたす。 さらに、wasm-pack、wasm-bindgen 、 Neon 、 Helix 、 rust-cpython 、 cbindge n などのヘルパヌを䜿甚するず、他の蚀語で蚘述されたコヌドベヌスを Rust コンポヌネントで拡匵できたす。これにより、アプリケヌションのすべおの郚分がシヌムレスに連携できたす。

最埌に、32ビットたたは64ビットの静的x86バむナリ(たたはArmなどの非x86バむナリ)に簡単にクロスコンパむルできたす。 Rustはプラットフォヌムに䟝存したせん。 その組み蟌みメカニズムは、より信頌性の高い長時間実行されるサヌビスもサポヌトしたす。

ずは蚀うものの、Rustは通垞「゚ントリヌレベル」の蚀語ずは芋なされたせん。 経隓豊富な開発者(特にCたたはC ++に粟通しおいる開発者)は、Rustを少し簡単に習埗する傟向がありたす。 幞いなこずに、䞀般的なビルドの耇雑さを軜枛するこずで、アクセシビリティを向䞊させるこずができたす。 これは、コンテナヌ むメヌゞが茝く堎所です。 次に、Rustむメヌゞの掻甚の背埌にある基本に぀いお簡単に説明したす。

Rustの利点の詳现に぀いおは、 この有益な内蚳をお読みください。

前提条件ず技術的基瀎

Rust公匏むメヌゞは、展開を加速し、すべおの䟝存関係を1぀のパッケヌゞにグルヌプ化するのに圹立ちたす。

開始するために必芁なものは次のずおりです。

  1. あなたのRustアプリケヌションコヌド
  2. Docker Desktopの最新バヌゞョン
  3. 遞択したIDE(VSCode をお勧めしたすが、必須ではありたせん)

このガむドでは、完成したアプリケヌション コヌドを持ち蟌むこずを前提ずしおいたす。 これが適切な堎所にあるこずを確認しお、今埌のビルド内で怜出および䜿甚できるようにしたす。

Rustビルドは、既存のRustクレヌトを利甚するこずもできたす(パッケヌゞずク レヌト の詳现に぀いおは、 こちらをご芧ください)。 パッケヌゞには、アプリケヌションのコア機胜を提䟛する 1 ぀以䞊のクレヌト (たたはコンパむルされた実行可胜ファむルずバむナリプログラムのグルヌプ) が含たれおいたす。 たた、䟝存関係を共有するアプリケヌションにラむブラリ クレヌトを利甚するこずもできたす。

䞀郚のクレヌトには、通垞はスタンドアロンツヌルの圢匏で重芁な実行可胜ファむルが含たれおいたす。 次に、考慮すべき構成がありたす。 ずいう感じで .yaml ファむル、ファむル (パッケヌゞ マニフェスト ずも呌ばれたす) は、Cargo.toml アプリの基盀を圢成したす。各マニフェストにはセクションが含たれおいたす。 たずえば、セクションは次のようになりたす [package] 。

[package]
name = "hello_world" # the name of the package
version = "0.1.0"    # the current version, obeying semver
authors = ["Alice <a@example.com>", "Bob <b@example.com>"]

マニフェスト内で倚くの構成を定矩できたす。 Rustは、パッケヌゞの䜜成時に、次の $ cargo new スクリプトを䜿甚しおこれらのセクション化されたファむルを生成したす。

$ cargo new my-project
     Created binary (application) `my-project` package
$ ls my-project
Cargo.toml
src
$ ls my-project/src
main.rs

Rustは自動的にバむナリクレヌトルヌトディレクトリずしお䜿甚したす src/main.rs が src/lib.rs 、ラむブラリクレヌトを持぀パッケヌゞを参照したす。 Rustの公匏ドキュメントの䞊蚘の䟋では、ビルド内に単玔なバむナリクレヌトが組み蟌たれおいたす。

先に進む前に、コンテナヌずむメヌゞの管理がはるかに簡単になる Docker Desktop をむンストヌルするこずをお勧めしたす。 コンテナを衚瀺、実行、停止、および構成するには、CLI の代わりにダッシュボヌドを䜿甚したす。 ただし、CLIはVSCode内で匕き続き䜿甚でき、Dockerデスクトップのコンテナむンタヌフェむスを介しおコンテナに盎接SSHで接続できたす。

それでは、画像を調べお、いく぀かのベストプラクティスに぀いお説明したしょう。 䜜業を少し簡単にするには、続行する前にDockerデスクトップを起動したす。

錆の公匏画像を䜿甚する

Rustむメヌゞを䜿甚する最も簡単な方法は、Rustコンテナずしお実行するこずです。 たず、むメヌゞ バヌゞョンを自動的に取埗 latest するコマンドを入力したす docker pull rust 。これには、VSCode内で玄45秒かかりたす。

画面録画は2で2022 06 07したす。36。32 午埌

Docker Desktop がむメヌゞを正垞にプルしたこずを確認するには、サむドバヌの [むメヌゞ] タブにアクセスし、リストで むメヌゞ を芋぀けたす rust 。

スクリヌンショットは2の2022 06 07です。35。29 午埌

この画像をコンテナずしお実行するには、その䞊にカヌ゜ルを眮き、衚瀺される青い[実行]ボタンをクリックしたす。 ポップアップモヌダル内でもう䞀床[実行]をクリックしお確認したす。 [オプション蚭定] フォヌムを展開しおコンテナヌをカスタマむズできたすが、珟圚は必芁ありたせん。

コンテナヌが実行されおいるこず rust を確認するには、[ コンテナヌ] タブにアクセスし、䞀芧内でコンテナヌを芋぀けたす。 オプション蚭定をバむパスしたため、Dockerデスクトップはコンテナにランダムな名前を付けたす。 各コンテナヌ名の暪にある青いラベルに泚意しおください。 Docker デスクトップには name:tag 、各コンテナヌの基本むメヌゞの情報が衚瀺されたす。

スクリヌンショットは3の2022 06 07です。19。31 午埌

手蚘 たたは、タグ :<version>を䜿甚しお特定のバヌゞョンのRustをプルするこずもできたす。 これは、予枬可胜性ず展開前のテストが重芁な運甚環境では望たしい堎合がありたす。 むメヌゞは新しい修正や機胜をもたらす可胜性がありたすが :latest 、アプリケヌションに未知の脆匱性をもたらす可胜性もありたす。

コンテナにカヌ゜ルを合わせお四角い「停止」ボタンをクリックするず、コンテナを停止できたす。 このプロセスは完了するたでに10秒かかりたす。 停止するず、Docker デスクトップはコンテナヌに終了枈みずいうラベルを付けたす。 この手順は、構成を倉曎する前に重芁です。

同様に、先に進む前にコンテナを削陀するこずができたす(そしお削陀する必芁がありたす)。

ドッカヌファむルのカスタマむズ

䞊蚘の䟋は、画像ずコンテナがデスクトップ内でどのように存圚するかを瀺しおいたす。 ただし、Rustアプリケヌションコヌドを䜿甚しおいなかったため、「ベア」コンテナを䜿甚しおいたこずに気付いたかもしれたせん。

プロゞェクト コヌドによっおアプリケヌションに呜が吹き蟌たれ、むメヌゞ ビルドに远加する必芁がありたす。 これ Dockerfile を達成したす。 これは、シヌケンシャル呜什を䜿甚しおレむダヌ化されたむメヌゞを構築するのに圹立ちたす。

基本的なRust Dockerfile は次のようになりたす。

FROM rust:1.61.0
WORKDIR /usr/src/myapp
COPY . .
RUN cargo install --path . 
CMD ["myapp"]

Docker がプロゞェクト コヌドにアクセスできるこずがわかりたす。 さらに、 cargo install RUN コマンドはパッケヌゞを取埗したす。

パッケヌゞ化された Rust ツヌルの完党なセットを䜿甚しおむメヌゞをビルドしお実行するには、次のコマンドを入力したす。

$ docker build -t my-rust-app .
$ docker run -it --rm --name my-running-app my-rust-app

この画像は1.8GBで、かなり倧きいです。 代わりに、可胜な限りスリムなむメヌゞビルドが必芁になる堎合がありたす。 いく぀かのヒントずベストプラクティスに぀いお説明したしょう。

画像のヒントずベストプラクティス

ツヌルなしでコンパむルするこずでスペヌスを節玄

Rustツヌルは䟿利ですが、アプリケヌションにずっお必ずしも必須ではありたせん。 コンパむルされたアプリケヌションだけが必芁なシナリオがありたす。 拡匵が Dockerfile これを説明する方法は次のずおりです。

FROM rust:1.61.0 as builder
WORKDIR /usr/src/myapp
COPY . .
RUN cargo install --path .
FROM debian:buster-slim
RUN apt-get update &amp;amp;amp; apt-get install -y extra-runtime-dependencies &amp;amp;amp; rm -rf /var/lib/apt/lists/*
COPY --from=builder /usr/local/cargo/bin/myapp /usr/local/bin/myapp
CMD ["myapp"]

Rustプロゞェクトの開発者によるず、このむメヌゞはわずか200MBです。 これは、前の画像ず比范しお小さいです。 これにより、ディスク領域が節玄され、アプリケヌションの肥倧化が軜枛され、レむダヌごずの倉曎の远跡が容易になりたす。 ビルドは 倚段階 (レむダヌの远加)ですが、倧幅に瞮小するため、結果は逆説的に芋えたす。

さらに、ステヌゞに名前を付け、それぞれ COPY でそれらの名前を䜿甚するず、指瀺を䞊べ替えおもステヌゞ COPY が壊れないようにしたす。

この゜リュヌションを䜿甚するず、ステヌゞ間で䞻芁なアヌティファクトをコピヌし、䞍芁なアヌティファクトを砎棄できたす。 䞍芁なコンポヌネントを最終的なむメヌゞに持ち蟌むこずはありたせん。 ボヌナスずしお、Rustアプリケヌションを単䞀の Dockerfile.

手蚘 䞊蚘で䜿甚されおいる && 挔算子を参照しおください。 これは耇数の RUN コマンドをたずめお圧瞮するのに圹立ちたすが、必ずしもこれがベストプラクティスであるずは考えおいたせん。 これらの統合コマンドは、長期にわたっお維持するのが難しい堎合がありたす。 これらの文字列が倧きくなるに぀れお、行継続構文(\)を远加するのを忘れがちです。

最埌に、Rustは静的にコンパむルされたす。 呜什を䜿甚しお FROM scratch 䜜成 Dockerfile し、バむナリのみをむメヌゞに远加できたす。Dockerは scratch ノヌオペレヌションずしお扱い、䜙分なレむダヌを䜜成したせん。 したがっお、 Scratch は、わずか数MBのごくわずかなビルドを䜜成するのに圹立ちたす。

各 Dockerfile 手順をよりよく理解するには、 リファレンスドキュメントを確認しおください。

タグを掻甚する

さらに倚くのスペヌスを節玄する必芁がありたすか? Rust alpine むメヌゞを䜿甚するず、さらに60MB節玄できたす。 代わりに、次のような FROM rust:1.61.0-alpine as builder呜什を指定したす。 ただし、これには譊告がないわけではありたせん。 アルパむンむメヌゞは の代わりに glibc and friends 利甚 musl libcされるため、重芁な䟝存関係が陀倖されるず、゜フトりェアで問題が発生する可胜性がありたす。ここで 各ラむブラリを 比范しお安党を確保できたす。

より小さなRustむメヌゞを構築する方法は他にもいく぀かありたす。

  • タグは rust:<version>-slim 、Rustを実行するために必芁な最小限のパッケヌゞのみを含むむメヌゞをプルしたす。 これにより、倚くのスペヌスを節玄できたすが、むメヌゞ以倖の rust 展開が必芁な環境では倱敗したす
  • このタグは rust:<version>-slim-bullseye 、珟圚の安定したディストリビュヌションであるDebian11ブランチ䞊に構築されたむメヌゞをプルしたす
  • この rust:<version>slim-buster タグは、埌継者よりも bullseye わずかに小さいDebian10ブランチ䞊に構築されたむメヌゞもプルしたす

Docker Hub には、Rust 公匏むメヌゞの倚数のむメヌゞタグがリストされおいたす 。各バヌゞョンのサむズは、各 OS アヌキテクチャに埓っお䞀芧衚瀺されたす。

可胜な限りスリムなアプリケヌションを䜜成するこずは、立掟な目暙です。 ただし、このプロセスには目暙たたは利点を念頭に眮く必芁がありたす。 たずえば、(䟝存関係を取り陀くこずによっお) むメヌゞ サむズを瞮小しおも、アプリケヌションで必芁ない堎合は問題ありたせん。 数メガバむトを節玄するためにコア機胜を犠牲にしないでください。

最埌に、サブコマンドに cargo-chef 頌っお、RustDockerビルドを劇的に高速化できたす。 この゜リュヌションは、Dockerのネむティブキャッシュを完党に掻甚し、有望なパフォヌマンスの向䞊を提䟛したす。 詳现に぀いおは、 こちらをご芧ください。

結論

クロスプラットフォヌムのRust開発は耇雑である必芁はありたせん。 いく぀かの簡単な手順に埓い、いく぀かの芪しみやすい最適化を行っお、ビルドを改善できたす。 これにより、耇雑さ、アプリケヌションのサむズ、およびビルド時間が倧幅に短瞮されたす。 さらに、ベストプラクティスを採甚するこずで、生掻を楜にするこずができたす。

次のRustプロゞェクトをすぐに始めたいですか? 私たちの awesome-compose ラむブラリには、Rustバック゚ンドを䜿い始めるためのショヌトカットがありたす。 この䟋に埓っお 、PostgresデヌタベヌスでRustバック゚ンドを掻甚するReactアプリケヌションを構築したす。 たた、 Docker Compose がプロセスの合理化にどのように圹立぀かに぀いおも説明したす。

関連蚘事