より小さなコンテナを構築する方法

より小さなコンテナを構築する方法

コンテナの操作は、多くのユーザーや開発者にとって日常的なタスクです。コンテナ開発者は、コンテナイメージを頻繁に(再)ビルドする必要があることがよくあります。コンテナを開発する場合、イメージのサイズを縮小することを考えたことはありますか?画像を小さくすると、いくつかの利点があります。ダウンロード時に必要な帯域幅が少なくなり、クラウド環境で実行する場合のコストが節約されます。また、Fedora CoreOS、IoT、Silverblue ではコンテナ ワークフローに大きく依存しているため、より小さなコンテナ イメージを使用すると、システム全体のパフォーマンスが向上します。この記事では、コンテナ イメージのサイズを縮小するためのヒントをいくつか紹介します。

[[399243]]

道具

以下の例で使用されるホスト オペレーティング システムは Fedora Linux 33 です。例では、Podman 3.1.0 と Buildah 1.2.0 を使用します。 Podman と Buildah は、ほとんどの Fedora Linux バリアントにプリインストールされています。 Podman と Buildah がインストールされていない場合は、次のコマンドを使用してインストールできます。

  1. $ sudo dnf install -y podman buildah

タスク

基本的な例から始めましょう。次の要件を満たす Web コンテナーを構築します。

  • コンテナはFedora Linuxをベースにしている必要があります
  • Apache httpd Webサーバーの使用
  • カスタムウェブサイトを含む
  • 容器は小さい方が良い

次の手順は、より複雑な画像にも適用されます。

設定

まず、プロジェクト ディレクトリを作成します。このディレクトリには、Web サイトとコンテナ ファイルが含まれます。

  1. $ mkdir 小さいコンテナ
  2. $ cd 小さいコンテナ
  3. $ mkdirファイル
  4. $ タッチファイル/index.html

シンプルなログインページを作成します。このデモでは、次の HTML を index.html ファイルにコピーできます。

  1. <!doctype html >  
  2. < html   lang = "de" >  
  3. <ヘッド>  
  4. < title >コンテナ ページ</ title >  
  5. </ヘッド>  
  6. <本文>  
  7. <ヘッダー>  
  8. < h1 >コンテナページ</ h1 >  
  9. </ヘッダー>  
  10. <メイン>  
  11. < h2 >フェドラ</ h2 >  
  12. < ul >  
  13. < li > < a   href = "https://getfedora.org" > Fedora プロジェクト</ a > </ li >  
  14. < li > < a   href = "https://docs.fedoraproject.org/" > Fedora ドキュメント</ a > </ li >  
  15. < li > < a   href = "https://fedoramagazine.org" >フェドラマガジン</ a > </ li >  
  16. < li > < a   href = "https://communityblog.fedoraproject.org/" > Fedora コミュニティ ブログ</ a > </ li >  
  17. </ ul >  
  18. < h2 >ポッドマン</ h2 >  
  19. < ul >  
  20. < li > < a   href = "https://podman.io" >ポッドマン</ a > </ li >  
  21. < li > < a   href = "https://docs.podman.io/" > Podman ドキュメント</ a > </ li >  
  22. < li > < a   href = "https://github.com/containers/podman" > Podman コード</ a > </ li >  
  23. < li > < a   href = "https://podman.io/blogs/" >ポッドマンブログ</ a > </ li >  
  24. </ ul >  
  25. < h2 >ビルダ</ h2 >  
  26. < ul >  
  27. < li > < a   href = "https://buildah.io" > Buildah </ a > </ li >  
  28. < li > < a   href = "https://github.com/containers/buildah" > Buildah コード</ a > </ li >  
  29. < li > < a   href = "https://buildah.io/blogs/" > Buildah ブログ</ a > </ li >  
  30. </ ul >  
  31. < h2 >スコピオ</ h2 >  
  32. < ul >  
  33. < li > < a   href = "https://github.com/containers/skopeo" > skopeo コード</ a > </ li >  
  34. </ ul >  
  35. < h2 >クリオ</ h2 >  
  36. < ul >  
  37. < li > < a   href = "https://cri-o.io/" > CRI-O </ a > </ li >  
  38. < li > < a   href = "https://github.com/cri-o/cri-o" > CRI-O コード</ a > </ li >  
  39. < li > < a   href = "https://medium.com/cri-o" > CRI-O ブログ</ a > </ li >  
  40. </ ul >  
  41. </メイン>  
  42. </本文>  
  43. </html>  

この時点で、上記の index.html ファイルをブラウザでテストすることを選択できます。

  1. $ firefox ファイル/index.html

最後に、コンテナ ファイルを作成します。このファイルの名前は Dockerfile または Containerfile にすることができます。

  1. $ コンテナファイルに触れる

これで、次のファイル システム レイアウトを持つプロジェクト ディレクトリが作成されます。

  1. 小さいコンテナ/
  2. |- ファイル/
  3. | |- インデックス.html
  4. |
  5. |- コンテナファイル

建てる

次にイメージをビルドします。次の各段階では、画像のサイズを縮小するための改善レイヤーが追加されます。最終的にはイメージのコレクションが作成されますが、Containerfile は 1 つだけになります。

ステージ0: 基本的なコンテナイメージ

新しいイメージは非常にシンプルで、必須の手順のみが含まれます。 Containerfile に次の内容を追加します。

  1. # ベースイメージとして Fedora 33 を使用する
  2. registry.fedoraproject.org/fedora:33 より
  3. # httpdをインストールする
  4. dnf install -y httpd を実行します。
  5. # このサイトをコピー
  6. ファイルをコピー/* /var/www/html/
  7. # ポートを80/tcpに設定する
  8. エクスポーズ80
  9. # httpdを起動する

上記のファイルには、各行の機能を説明するコメントがいくつかあります。より詳細な手順:

  • FROM registry.fedoraproject.org/fedora:33 に基づいてビルドコンテナを作成します。
  • 次のコマンドを実行します: dnf install -y httpd
  • Containerfileに関連するファイルをコンテナにコピーします
  • EXPOSE 80を設定すると、どのポートが自動的に設定できるかを示すことができます。
  • このイメージからコンテナが作成された場合に何を実行するかを示すCMD命令を設定します。

次のコマンドを実行して、プロジェクト ディレクトリから新しいイメージを作成します。

  1. $ podman イメージビルド -f コンテナファイル -t localhost/web-base

イメージのプロパティを表示するには、次のコマンドを使用します。画像のサイズ(467 MB)に注意してください。

  1. $ podmanイメージls
  2. リポジトリ タグ イメージ ID 作成 サイズ
  3. localhost/web-base 最新 ac8c5ed73bb5 5 分前 467 MB
  4. registry.fedoraproject.org/fedora 33 9f2a56037643 3か月前 182 MB

上記の例に示されている画像は現在 467 MB のスペースを占有しています。残りの段階では画像のサイズが大幅に縮小されます。ただし、まずはイメージが期待どおりに動作することを確認してください。

コンテナを起動するには、次のコマンドを入力します。

  1. $ podman コンテナ実行 -d --name web-base -P localhost/web-base

コンテナを一覧表示するには、次のように入力します。

  1. $ podman コンテナ ls
  2. コンテナID イメージ コマンド 作成ステータス ポート名
  3. d24063487f9f localhost/web-base httpd -DFOREGROUN... 2 秒前 3 秒前0.0.0.0:46191->80/tcp web-base

上記のコンテナーは実行されており、ポート 46191 でリッスンしています。ホスト オペレーティング システムで実行されている Web ブラウザーから localhost:46191 にアクセスすると、Web ページがレンダリングされます。

  1. $ firefox ローカルホスト:46191

フェーズ1: キャッシュをクリアし、コンテナから残りのコンテンツを削除する

コンテナ イメージのサイズを最適化するには、まず「クリーンアップ」を実行する必要があります。これにより、インストールとパッケージの残りがすべて除去されます。このプロセスに具体的に何が含まれるかは、コンテナーによって異なります。上記の例では、Containerfile を編集して次の行を追加します。

  1. [...]
  2. # httpdをインストールする
  3. 実行dnf install -y httpd && \
  4. dnf クリーン オール -y
  5. [...]

変更された Containerfile をビルドして、イメージ サイズを大幅に削減します (この例では 237 MB)。

  1. $ podman イメージビルド -f コンテナファイル -t localhost/web-clean
  2. $ podmanイメージls
  3. リポジトリ タグ イメージ ID 作成 サイズ
  4. localhost/web-clean 最新 f0f62aece028 6 秒前 237 MB

フェーズ2: ドキュメントと不要な依存関係を削除する

インストール中に、いくつかの弱い依存関係やドキュメントを含む多くのパッケージを削除するよう提案されます。これらは通常、コンテナ内では必要ないので削除できます。 dnf コマンドには、弱い依存関係やドキュメントを含める必要がないことを示すオプションがあります。

Containerfile を再度編集し、dnf install 行にオプションを追加して、アーカイブと弱い依存関係を削除します。

  1. [...]
  2. # httpdをインストールする
  3. 実行 dnf install -y httpd --nodocs --setopt install_weak_deps = False && \
  4. dnf クリーン オール -y
  5. [...]

上記の変更された Containerfile をビルドすると、イメージが小さくなります (231 MB)。

  1. $ podman イメージビルド -f コンテナファイル -t localhost/web-docs
  2. $ podmanイメージls
  3. リポジトリ タグ イメージ ID 作成 サイズ
  4. localhost/web-docs 最新 8a76820cec2f 8 秒前 231 MB

フェーズ3: より小さなコンテナベースイメージの使用

前の段階を組み合わせることで、サンプル画像のサイズが半分に縮小されました。しかし、画像サイズをさらに縮小する方法はまだいくつかあります。ベースイメージ registry.fedoraproject.org/fedora:33 はユニバーサルです。これは、多くの人が Fedora Linux コンテナにプリインストールしたいと思うパッケージのセットを提供します。ただし、一般的な Fedora Linux ベース イメージで提供されるパッケージでは、通常、さらに多くのものが必要になります。 Fedora プロジェクトでは、基本パッケージのみから始めて、必要なものだけを追加して全体のイメージ サイズを小さくしたい人向けに fedora-minimal イメージも提供しています。

次のように、podman イメージ検索を使用して fedora-minimal イメージを見つけます。

  1. $ podman 画像検索 fedora-minimal
  2. インデックス 名前 説明 星 公式 自動化
  3. fedoraproject.org registry.fedoraproject.org/fedora-minimal

fedora-minimal ベースイメージには DNF が含まれておらず、Python を必要としない小さな microDNF が採用されています。

registry.fedoraproject.org/fedora:33 が registry.fedoraproject.org/fedora-minimal:33 に置き換えられる場合は、microdnf コマンドを使用して dnf を置き換える必要があります。

  1. # ベースイメージとして Fedora 最小 33 を使用する
  2. registry.fedoraproject.org/fedora-minimal:33 より
  3. # httpdをインストールする
  4. microdnf install -y httpd --nodocs --setopt install_weak_deps = 0 && \を実行します。
  5. microdnf クリーン すべて -y
  6. [...]

fedora-minimal を使用して再構築した後のイメージ サイズは次のとおりです (169 MB)。

  1. $ podman イメージビルド -f コンテナファイル -t localhost/web-docs
  2. $ podmanイメージls
  3. リポジトリ タグ イメージ ID 作成 サイズ
  4. localhost/web-minimal 最新 e1603bbb1097 7 分前 169 MB

初期イメージサイズは 467 MB です。上記の各段階で説明した方法を組み合わせて再構築すると、最終的な画像サイズは 169 MB になります。最終的な合計イメージ サイズは、元のベース イメージよりも 182 MB 小さくなります。

コンテナをゼロから構築する

前のコンテンツでは、コンテナ ファイルと Podman を使用して新しいイメージを構築します。最後にもう 1 つ、Buildah を使用してコンテナーを最初から構築する方法を紹介します。 Podman は Buildah と同じライブラリを使用してコンテナを構築します。しかし、Buildah は純粋なビルド ツールと見なされます。 Podman は Docker を置き換えるために設計されています。

Buildah を使用して最初から構築されたコンテナーは空であり、何も入っていません。すべてをコンテナの外部からインストールまたはコピーする必要があります。幸いなことに、Buildah の使用は非常に簡単です。以下は、イメージを最初から構築する小さな Bash スクリプトです。このスクリプトを実行するだけでなく、ターミナルでスクリプト内のコマンドを 1 つずつ実行して、各ステップで何が行われるかをよりよく理解することもできます。

  1. #!/usr/bin/env バッシュ
  2. -o errexit を設定する
  3. # コンテナを作成する
  4. CONTAINER =$(最初からbuildah)
  5. # コンテナファイルシステムをマウントする
  6. マウントポイント=$(buildah マウント $コンテナ)
  7. # 基本的なファイルシステムと最小限のパッケージとnginxをインストールします
  8. dnf install -y --installroot $MOUNTPOINT --releasever 33 glibc-minimal-langpack httpd --nodocs --setopt install_weak_deps = False  
  9. dnf clean all -y --installroot $MOUNTPOINT --releasever 33
  10. # クリア
  11. buildah は $CONTAINER をアンマウントします
  12. # ウェブサイトをコピーする
  13. buildah は $CONTAINER 'files/*' '/var/www/html/' をコピーします
  14. # ポートを80/tcpに設定する
  15. buildah config --port 80 $コンテナ
  16. # httpdを起動する
  17. buildah config --cmd "httpd -DFOREGROUND" $CONTAINER
  18. # コンテナを画像として保存する
  19. buildah コミット --squash $CONTAINER web-scratch

あるいは、上記のスクリプトを Buildah に渡してイメージをビルドすることもできます。ルート権限は必要ないことにご注意ください。

  1. $ buildah unshare bash web-scratch.sh
  2. $ podmanイメージls
  3. リポジトリ タグ イメージ ID 作成 サイズ
  4. localhost/web-scratch 最新 acca45fc9118 9秒前 155 MB

最終画像はわずか 155 MB です。攻撃対象領域も縮小されます。最終イメージには DNF (または microDNF) もインストールされません。

結論は

より小さなコンテナ イメージを構築することには多くの利点があります。必要な帯域幅、ディスク使用量、攻撃対象領域を削減すると、画像の品質が向上します。少し変更するだけで、画像のサイズを簡単に縮小できます。結果のイメージの機能を変えずに、多くの変更を加えることができます。

必要なバイナリと構成ファイルのみを保存することで、非常に小さなイメージを構築することも可能です。

<<:  Kafka のコアコンセプトを図解で解説しているので、一目で理解できます。

>>:  Kubernetesの起源と運用プロセス

推薦する

タオバオストアの購買転換率に影響を与える致命的なポイント

少し前、多くの淘宝網の販売業者が張立氏を見つけ、自分の店舗の状況を調べるのを手伝ってほしいと頼んだ。...

hostus-$6/6g メモリ/6gSwap/150g ハードディスク/5T トラフィック/3IPv4

Hostus は、月額 6 ドルで 6G のメモリ、150G のハード ドライブ、5T のトラフィッ...

クラウドって、何がそんなに高いんですか?

著者 |ヤン・ジェン制作 | 51CTO テクノロジースタック (WeChat ID: blog)会...

2024 年に統合データ ストレージを推進する 4 つの要因

現在の技術力の優れた環境において、企業は急速にクラウド コンピューティングへと移行しています。最新の...

ウェブサイトのユーザーの粘着性に関する簡単な説明

今日はウェブサイトの粘着性の問題についてお話ししましょう。インターネット業界で働く多くの人々は、We...

新人からウェブサイト運用・保守最適化スーパーバイザーに転身し、いくつかのテクニックを学びました

ご存知のとおり、インターネットの発展に伴い、あらゆる業界が熾烈な競争に直面しています。ウェブサイト最...

vmland: ロシアの VPS、33 元/KVM/1g メモリ/24g SSD/100M 帯域幅、無制限のトラフィック、PayPal をサポート

ロシアの商人である vmland の事業は、ロシアの VPS の提供のみです。ウェブマスターは公式の...

errantweb-10$ VPS/カリフォルニア州サンディエゴ

errantweb は 1 月に設立された VPS 販売業者です。低価格と豊富なリソースで、低コスト...

#推薦# テンセントの軽量アプリケーションサーバー、コスト効率の良い大手クラウドサーバー、非常に信頼性が高い

Tencent の軽量アプリケーション サーバー (Lighthouse) が正式にリリースされ、一...

ストレージ仮想化ソフトウェアのオプションに関する知識

ストレージ仮想化により、管理者は移行速度を向上させ、複数のアレイ タイプをホストし、コストをより予測...

bluevm-4g メモリ/100g ハードディスク/3T トラフィック/月額 3.3 ドル

Hostcat は、bluevm からもう 1 つの魔法のツールを見つけました。これは、最大 4G ...

BaiduとGoogleにあなたのウェブサイトを気に入ってもらいましょう

Baidu と Google に関しては、ほとんどのウェブマスターは、あなたたちを愛するのは簡単では...

マスターすべき「Kubernetes」、Service、Ingress

[[404005]]この記事はWeChatの公開アカウント「小蔡良基」から転載したもので、著者は蔡歩...

zji専用サーバーセール:香港アリババクラウド - 480元、香港連邦 750元、日本大阪 - 550元

zji の 7 月の専用サーバープロモーションのオファー: (1) 香港 Alibaba Cloud...