コンテナは私たちの生活に大きな利便性をもたらし、誰もがコンテナを気に入っています。ただし、コンテナも大量のスペースを消費し、数百メガバイトになることが多く、G を超えるイメージも一般的です。この記事では、コンテナの合理化の事例について学びます。一連の操作により、最終的に画像のサイズを 943 MB から 6.32 k に削減できます。
概要コンテナは、オペレーティング ソフトウェアのバージョンとパッケージの依存関係に関連するすべての問題を解決する実用的な方法です。誰もがコンテナを好みますが、コンテナを使用すると、さまざまな大きくて乱雑な画像に直面することになります。スペースが限られている場合は、すぐにいっぱいになります。実際、画像サイズを縮小するためにいくつかの効果的な戦略を使用できます。 基本的な手順指定されたポートを通じて Web サービスを提供できる HTTP アプリケーション コンテナー。 ボリュームのマウントは実行されません。 当初の計画ベースライン画像サイズを取得するには、node.js を使用して、index.js へのアクセスのみを提供するシンプルなサーバーを作成します。 index.js コード:
このファイルは、公式の Node ベースイメージに基づいてイメージに組み込まれます。
コンパイル
画像サイズは943MBです 合理化されたベースイメージ画像をスリム化するための最も一般的で、最も単純で、最も明白な戦略の 1 つは、小さいベース画像を使用することです。 Node イメージには、スリム バリアント (Debian ベースですが、プリインストールされた依存関係が少ない) と Alpine Linux ベースの alpine バリアントがあります。 2 つのベース イメージは node:14-slim と node:14-alpine であり、イメージ サイズはそれぞれ 167 MB と 116 MB に削減されます。 Docker イメージは階層化されているため、node.js は多くのレイヤーのイメージに依存する必要があります。現時点では、ソリューションを簡素化する以外にサイズを縮小する方法はありません。 言語を変更さらに最適化するには、実行時の依存関係が少ないコンパイル言語が必要です。このとき、まず思い浮かぶのは間違いなく静的にコンパイルされる言語である Golang であり、これは一般的で良い選択肢です。 Golang での基本的な Web サービス コードは次のとおりです。 ウェブゴー:
次に、golang の公式ベースイメージを使用して、それをイメージにパッケージ化します。
Golang ベースのソリューションのイメージ サイズは 818 MB で、それでもまだ非常に大きいです。 分析により、golang 基本イメージに多くの依存パッケージがインストールされていることがわかりました。これらの依存パッケージは、Go ソフトウェアを構築するときに便利ですが、すべてのランタイムに必要なわけではないので、ここで最適化を開始できます。 多段階ビルドDocker は、必要なすべての依存関係を備えた環境でコードを簡単にビルドし、生成された実行可能パッケージを他のイメージに直接パッケージ化して使用できるようにするマルチステージ ビルド メカニズムをサポートしています。これにより、コンパイル時にはツールとパッケージが必要になるが、実行時にはパッケージは必要なくなるという問題が解決され、イメージ サイズを大幅に削減できます。 注: Docker マルチステージ ビルド メカニズムは、Docker 17.05 で導入された新しい機能です。この機能を使用したい場合は、Docker バージョンを Docker 17.05 以上にアップグレードする必要があります。 マルチステージビルド Dockerfile へ:
(⊙o⊙)おお、この戦略は効果的で、生成された画像はわずか13.2MBです。 スクラッチベースイメージと組み合わせた静的コンパイル13M の画像はすでに非常に優れていますが、他の最適化手法もあります。 Docker の世界には、いくつかのベース イメージが存在します。これは 0 から始まるベース イメージです。このイメージには依存関係がなく、完全に 0 から始まるため、サイズも 0 から始まります。Linux には LFS と呼ばれるディストリビューションがあり、その正式名称は Linux From Scratch で、完全な OS をゼロからコンパイルすることを意味します。このスクラッチベース画像もこれを意味します。 スクラッチ ベース イメージで web.go の実行をサポートするには、コンパイルされたイメージに静的コンパイル フラグを追加して、すべての依存関係を実行中のイメージにパッケージ化できるようにする必要があります。
上記のビルド プロセスでは、コード リンク プロセス中にモードが外部に設定され、-static によって外部リンカーがリンクされます。 最適化後の画像サイズは 8.65MB になります。 究極のキラー - アセンブリ言語Golang で書かれたプログラムは少なくとも M 程度のサイズがあり、10 MB のイメージは合理化できる限界に達しているはずです。ただし、サイズを大幅に削減するために使用できる他のトリックはありますが、究極のキラーであるアセンブリ言語を使用する必要があります。最終的な解決策は、アセンブリで記述されたフル機能の http サーバー assmttpd を使用することです。そのソース コードは GitHub (github/nemasu/asmttpd) でホストされています。 また、マルチステージコンパイルアプローチを使用して、Ubuntu ベースイメージで依存関係をコンパイルし、それらを Scratch ベースイメージにパッケージ化して実行します。
結果の画像サイズはわずか 6.34kB です。 次に、このイメージを使用してコンテナを実行します。
curl を使用してアクセスします。
要約するこの記事では、コンテナを簡素化するためのさまざまな方法と試みについて説明しました。もちろん、コンテナの機能は単純なので、これらの戦略を実際に直接使用することはできないかもしれませんが、コンテナのチューニングのアイデアの参考として使用できます。 |
<<: 5 つの主要な分散トランザクションについてどれくらい知っていますか?
>>: 分散オフィス化で4つの大きな変化、3大分析機関が8つの対策を公表
raksmartは、米国の老舗データセンターとしてよく知られているはずです。同社は、CN2 ONLY...
多くのウェブマスターは、ウェブサイトのコアキーワードを決定し始めるときに、Baidu Indexを注...
SEO は検索エンジン最適化の略で、最適化手法を使用してウェブサイトを検索エンジンに好まれるようにし...
OpenStack レビューOpenStack は、2010 年 7 月に NASA と Racks...
[[409074]]前回の記事「Ceph 分散ストレージ システム アーキテクチャ研究のレビュー」で...
検索エンジンの変更はウェブマスターに直接影響します。結局のところ、ほとんどのウェブマスターは検索エン...
3月6日、江蘇省党委メンバーで江蘇省工業情報化部の副部長である池宇氏とその代表団が調査と研究のため華...
原題: 鉄道省が12306チケット予約システム入札に関する質問に回答入札プロセスは公開されており、費...
spinservers のダラス データ センターには、最新の CPU モデル (支払い完了後 15...
誰もが天冀の競馬の話を聞いたことがあるでしょう。彼は自分の劣勢の馬で相手の優勢の馬と競争し、優勢の馬...
2007 年に Baidu のアルゴリズムが変更されたことは誰もが目撃したと思います。 。初心者が個...
Vultr は米国西海岸のユーザーが多すぎて、全体的な使用効果があまり理想的ではないと感じていません...
欧州からの新しいデータ規制は、クラウド コンピューティングを使用する企業にいくつかの問題を引き起こす...
Linode の公式フォーラムから衝撃的なニュースが出てきました。Linode は KVM 仮想 V...
Smarthost (1996 年に仮想ホストとして開始し、1998 年に正式に設立) は現在、すべ...