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

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

コンテナの操作は、多くのユーザーや開発者にとって日常的なタスクです。コンテナ開発者は、コンテナイメージを頻繁に(再)ビルドする必要があることがよくあります。コンテナを開発する場合、イメージのサイズを縮小することを考えたことはありますか?画像を小さくすると、いくつかの利点があります。ダウンロード時に必要な帯域幅が少なくなり、クラウド環境で実行する場合のコストが節約されます。また、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の起源と運用プロセス

推薦する

失敗したWeiboマーケティングキャンペーンから学んだ教訓

最近、Weiboマーケティングに注目しています。ある人によると、1万人のファンは雑誌に相当し、10万...

クラウド ネイティブとは何かについてお話ししましょう。

[[380736]]この記事はWeChatの公開アカウント「Full-Stack Coder Por...

SEO Baiduウェブマスタープラットフォームとの直接対話が再開

改良された Baidu Webmaster プラットフォームがリリースされました。インターフェースの...

クラウドサービスはすでに広く利用されているが、クラウドセキュリティの改善が必要

現在までに、クラウド サービスは 10 年以上の開発の歴史を持っています。当初の IT サービス モ...

MySQL を使用して分散ロックを実装することを聞いたことがありますか?

概要以前、在庫管理システムに参加したことがあります。ビジネスの複雑さのため、それをサポートするために...

ウェブサイトデータ分析は将来のSEO担当者にとって必須科目になる

友人から、SEO を始めるにはどうしたらいいかとよく聞かれます。私は通常、外部リンクを投稿したり、友...

Dianpingのオープンプラットフォームに対する開発者の見解:歓迎するが拒否も

数か月にわたる準備を経て、Dianping はプラットフォーム (developer.dianpin...

servercheap: 月額 2 ドル、無制限トラフィック VPS、KVM/1G メモリ/1 コア/30g SSD/シカゴ、ロサンゼルス

2009年から運営しているアメリカのVPS業者servercheapが、シカゴデータセンター(cor...

SEOウェブサイトをより魅力的にするために基本に戻る

近年、SEO ウェブサイトの発展の勢いは非常に速く、さまざまな新しい SEO ウェブサイトが目まぐる...

Honghuが集まり、クラウドネイティブの開発動向を探る

[51CTO.comより]最近、中国機械プレス華章公司、51CTO、Neusoftは共同で「紅湖クラ...

痕跡を残さずにオリジナル記事のキーワードを最適化する方法

ウェブサイトが成功したいのであれば、当然、充実したコンテンツが欠かせません。eコマースプロジェクトを...

半年でWeChatの公開アカウントのフォロワーを5万人増やすにはどうしたらいいでしょうか?

【1】パブリックプラットフォームの名前は、WeChatアカウントの位置付けに関連しています。まず、起...

ハイブリッドクラウドのセキュリティに関する8つの重要な考慮事項

[[228664]]ハイブリッド クラウドを導入すると、組織のセキュリティ体制が弱まるのではなく、強...

感情マーケティングとソーシャルメディアマーケティングを組み合わせた新しいモデルについての簡単な議論

この世に愛とは何でしょう?それは、生死を問わず人々を結びつけるものです!すべては「愛」という言葉から...

マルチアクセス エッジ コンピューティング – パート 1: マルチアクセス エッジ コンピューティングはどのように機能しますか?

マルチアクセス エッジ コンピューティング (MEC) は、モバイル エッジ コンピューティングとも...