Docker イメージ構築のパフォーマンスを向上させ、効率を 2 倍にする 2 つのヒント!

Docker イメージ構築のパフォーマンスを向上させ、効率を 2 倍にする 2 つのヒント!

ほとんどの企業と同様に、当社では製品で使用するすべてのコンポーネントに対して Docker イメージを構築しています。時間が経つにつれて、これらのイメージの一部はどんどん大きくなり、継続的インテグレーション (CI) ビルドはどんどん長くなりました。私の目標は、CI ビルドにかかる時間を 5 分以内にすることです。

生産性が低下する理由は次のとおりです。

  • 開発者はビルドが完了するのを待って時間を無駄にします。
  • 開発者は新しいタスクの作業を開始し、後で戻る必要があります。これにはより多くのコンテキスト切り替えが必要となり、一般的に非効率的です。

この記事では、ビルド時間を大幅に改善する 2 つの小さな改善を適用しました。 2 つの改善点を導入する前に、まず次のような Dockerfile の作成に関するベスト プラクティスに従っていることを確認してください。

  • レイヤーの数を最小限に抑える
  • マルチステージビルドの使用
  • 最小限のベースイメージを使用する

Buildkit と Buildx

Buildkit と Buildx について説明します。これら 2 つの用語は互換的に使用されることが多いですが、まったく同じではありません。この記事を書く前は、私もこの2つの違いを完全に理解していませんでした。

ビルドキット

Buildkit は、従来の Docker ビルダーに代わる改良されたバックエンドです。 2018 年から Docker にパッケージ化され、Docker Engine 23.0 のデフォルト ビルダーになりました。

Buildkit は多くの便利な機能を提供します:

  • キャッシュ機能の改善
  • 異なるレイヤーの同時構築
  • ベースイメージの遅延プル (Buildkit 0.9 以上)

Buildkit を使用すると、docker build コマンドの出力がよりクリーンで構造化されていることに気づくはずです。

Docker バージョン 23.0 より前のバージョンの場合、Buildkit を使用する一般的な方法は、Buildkit パラメータを次のように設定することです。

 `--build-arg BUILDKIT_INLINE_CACHE=1`

これにより、インライン キャッシュが有効になり、ビルド プロセスが大幅に高速化されます。ただし、これは Docker バージョン 23.0 未満では使用できません。

 DOCKER_BUILDKIT=1 docker build --platform linux/amd64 . -t someImage:someVersion DOCKER_BUILDKIT=1 docker push someImage:someVersion

ビルドx

Buildx は Docker のプラグインであり、これを使用すると Docker で Buildkit の機能を最大限に活用できます。これは、Buildkit が多くの新しい構成オプションをサポートしており、そのすべてを下位互換性のある方法で docker build コマンドに統合できないために作成されました。

Buildx はイメージのビルドに加えて、複数のビルダーの管理もサポートしています。これは、共有 Docker デーモンを変更しないため、継続的インテグレーションにおいて、さまざまな構成を持つ適切にスコープ設定された環境を定義する場合に非常に役立ちます。

次の手順に従って Buildx の使用を開始できます。

 docker buildx create --bootstrap --name builder docker buildx use builder

1. リモートキャッシュのメリット

ビルドを高速化する最初の方法は、イメージをリモート レジストリにキャッシュすることです。この方法では、ビルドが異なるマシンで実行される場合でも (CI では一般的)、ビルド キャッシュのメリットを享受できます。ほとんどの人は、イメージの新しいバージョンをビルドする前に、イメージの最新バージョンを取得します。これには、変更されていないレイヤーをキャッシュするという利点がありますが、最初に完全なイメージを取得するという犠牲が伴います。完全なイメージを取得するには時間がかかる場合があり、レイヤーが再利用できる保証はありません。説明には次のコマンドを使用します。

 docker pull someImage:latest || true docker build --platform linux/amd64 . \ -t someImage:someVersion \ -f Dockerfile \ --cache-from someImage:latest

Buildx を使用すると、キャッシュ情報をリモートの場所 (コンテナー レジストリ、BLOB ストレージなど) に保存できます。ビルダーは、指定されたレイヤーがすでに存在するかどうかを確認し、存在する場合は、そのレイヤーを再作成するのではなく再利用します。この機能は、レイヤーをローカルにプルしなくても実行できます。以下のように表示されます。

 docker buildx build --platform linux/amd64 . \ -t someImage:someVersion - push \ --cache-to type=registry,ref=someCachedImage:someVersion,mode=max --cache-from type=registry,ref=someCachedImage:someVersion

モード「max」は、レイヤーが最終イメージで使用されていない場合でも (たとえば、マルチステージ ビルドを使用する場合)、各レイヤーのビルド情報を保存することを意味します。デフォルトでは、最終イメージに存在するレイヤーに関するビルド情報のみを保存するモード「min」が使用されます。

キャッシュの特殊なケースは、キャッシュされたデータを「インライン」で保存することです。つまり、イメージと一緒にキャッシュされるということです。このオプションは、Buildx なしで Buildkit を使用する場合にもサポートされます。これは、マルチステージ ビルドを使用する場合にはさらに困難であり、ビルド成果物の出力とキャッシュを明確に区別しません。キャッシュ データを「インライン」で保存するコマンドは次のとおりです。

 docker buildx build - platform linux/amd64 . \ -t someImage:someVersion --push \ --cache-to type=inline,mode=max \ --cache-from someImage:somePreviousVersion

2. 画像にファイルを追加する新しい方法

Docker は Dockerfile 構文の新しいバージョン、#syntax=docker/dockerfile:1.4 を導入しました。 COPY および ADD コマンドの追加のリンク オプションをサポートします。

以前は、COPY または ADD コマンドを使用すると、ビルダーは新しいスナップショットを作成し、新しいファイルを既存のファイル システムにマージしていました。そのため、この操作を実行する前に親レベルが存在している必要があります。そうでない場合、ターゲット ディレクトリがまだ存在しない可能性があります。最終イメージ (ビルド コマンドの結果) は、対応するスナップショット間の差異を含む各レイヤーの tarball で構成されます。

 FROM baseImage:version COPY binary /opt/

リンク オプションを使用すると、新しいファイルは独自のスナップショットに配置され、前のレイヤーに依存しなくなります。リンクされたファイルは独自の tarball に保存され、次の図に示すように、既存のファイル システムに依存せずに異なる tarball がリンクされます。

 # syntax=docker/dockerfile:1.4 FROM baseImage:version COPY [--chown=<user>:<group>] [--chmod=<perms>] --link binary /opt/

主な利点は、ファイルが以前のレイヤーに依存しなくなることです。ファイルが変更されていない限り、親レイヤーが変更されてもレイヤーを再利用できます。

これにより、複数レイヤーのデータコピーを並行して実行できるようになるため、ビルド速度も向上します。

結論は

上記2つの方法により、画像構築速度が1倍に向上しました。

<<:  クラウドとジェネレーティブ AI の今後の動向

>>:  エッジコンピューティングはデータストレージをどのように変えるのでしょうか?

推薦する

「中学高」が打ち砕いたのは、ネットセレブ経済のバブルだった

暑い夏には、アイスクリームやアイスキャンディーの売り上げが急増しました。ネットセレブの商品が複数、安...

一部の淡黄色のアプリケーションは失敗するのに、他のアプリケーションはリストされるのはなぜですか?

【夜の読書】快博秘境が次々とトラブルに。当初は「突然閉鎖されたウェブサイトは人々の間で最も人気がある...

マイクロサービスに移行し、新機能を迅速にリリース

顧客のニーズ安全なデジタルソリューションの開発からサウジアラビアのスマート物流国家への発展まで、Ta...

タオバオの顧客になる前に考えるべきことと準備

今日のオンライン金儲け業界では、タオバオアフィリエイトプロジェクトの競争が非常に激しいです。どの段階...

2020 年のクラウド コンピューティング開発における 5 つの主要トレンド

それぞれの時代には独自のインターネット技術があり、この時代を代表する技術は間違いなくクラウドコンピュ...

クラウド ポータビリティに関する 3 つの考慮事項: イベント駆動型アーキテクチャ (EDA) とサーバーレス コンピューティング

このシリーズの記事では、アーキテクチャや設計、クラウドのポータビリティに関して考慮すべき具体的な詳細...

「1つのクラウド、複数のコア」、Kylin Securityがクラウドデスクトップを作成

2020年、情報化・イノベーション産業の爆発的な発展は産業変革の春を迎え、デジタル化・アップグレード...

最近の百度アルゴリズム調整の3つのルールを分析

1. キーワードの密度。私はクライアントがホストしているウェブサイトを持っています。それは超人気のキ...

クラウドを超えた持続可能なコンピューティング

翻訳者 |トゥ・チェンイエ工業情報化部が「2022年中国コンピューティングパワー大会」で明らかにした...

大規模なロングテールキーワードデータベースを構築する方法

ウェブサイトの中期におけるロングテールキーワードの運用は、私たちがやらなければならないことです。トラ...

エンタープライズ SMS サービスの品質とユーザー エクスペリエンスを監視するにはどうすればよいでしょうか? Bonree Net SMS モニタリングが登場!

モバイル インターネットの時代において、企業の SMS は、正確な配信、制御可能な量、便利なやり取り...

SDN と 5G が出会うと、どのような火花が散るでしょうか?

SDN は、従来の IP ネットワークに大きな変化をもたらします。これは、3 つの側面で IP ネッ...

地元のバドミントンフォーラムの人気を高めるいくつかの方法

過去数か月間、著者はバドミントンフォーラムを注意深く観察してきました。しかし、当時のフォーラムはあま...

Python プログラミング言語クイック スタート チュートリアル

この記事は、SEO 担当者向けの Python プログラミング言語の入門チュートリアルです。プログラ...

ハイブリッドクラウドを使用する際に考慮すべき3つのこと

パブリック クラウドに一夜にして移行することはできません。そのため、ハイブリッド クラウドは企業にと...