943MBから6.34kBへ、コンテナサイズを縮小する課題

943MBから6.34kBへ、コンテナサイズを縮小する課題

コンテナは私たちの生活に大きな利便性をもたらし、誰もがコンテナを気に入っています。ただし、コンテナも大量のスペースを消費し、数百メガバイトになることが多く、G を超えるイメージも一般的です。この記事では、コンテナの合理化の事例について学びます。一連の操作により、最終的に画像のサイズを 943 MB から 6.32 k に削減できます。

[[396110]]

概要

コンテナは、オペレーティング ソフトウェアのバージョンとパッケージの依存関係に関連するすべての問題を解決する実用的な方法です。誰もがコンテナを好みますが、コンテナを使用すると、さまざまな大きくて乱雑な画像に直面することになります。スペースが限られている場合は、すぐにいっぱいになります。実際、画像サイズを縮小するためにいくつかの効果的な戦略を使用できます。

基本的な手順

指定されたポートを通じて Web サービスを提供できる HTTP アプリケーション コンテナー。

ボリュームのマウントは実行されません。

当初の計画

ベースライン画像サイズを取得するには、node.js を使用して、index.js へのアクセスのみを提供するシンプルなサーバーを作成します。

index.js コード:

  1. 定数fs = require ("fs");
  2. 定数http = require ('http');
  3. const server = http .createServer((req, res) = > {
  4. res.writeHead(200, { 'コンテンツタイプ': 'text/html' })
  5. fs.createReadStream('index.html').pipe(res)
  6. })
  7. server.listen(ポート, ホスト名, () = > {
  8. console.log(`サーバー: http://0.0.0.0:8080/`);
  9. });

このファイルは、公式の Node ベースイメージに基づいてイメージに組み込まれます。

  1. ノード:14から
  2. コピー 。 。
  3. コマンド ["ノード", "index.js"]

コンパイル

  1. docker build -t cchttp:01 ./

画像サイズは943MBです

合理化されたベースイメージ

画像をスリム化するための最も一般的で、最も単純で、最も明白な戦略の 1 つは、小さいベース画像を使用することです。 Node イメージには、スリム バリアント (Debian ベースですが、プリインストールされた依存関係が少ない) と Alpine Linux ベースの alpine バリアントがあります。

2 つのベース イメージは node:14-slim と node:14-alpine であり、イメージ サイズはそれぞれ 167 MB と 116 MB に削減されます。

Docker イメージは階層化されているため、node.js は多くのレイヤーのイメージに依存する必要があります。現時点では、ソリューションを簡素化する以外にサイズを縮小する方法はありません。

言語を変更

さらに最適化するには、実行時の依存関係が少ないコンパイル言語が必要です。このとき、まず思い浮かぶのは間違いなく静的にコンパイルされる言語である Golang であり、これは一般的で良い選択肢です。 Golang での基本的な Web サービス コードは次のとおりです。

ウェブゴー:

  1. パッケージメイン
  2. 輸入 (
  3. 「fmt」
  4. "ログ"
  5. 「ネット/http」
  6. 関数main() {
  7. ファイルサーバー: = http .FileServer(http.Dir("./"))
  8. http.Handle("/", ファイルサーバー)
  9. fmt.Printf("ポート 8080 でサーバーを起動しています\n")
  10. エラーの場合: = http .ListenAndServe(":8080", nil);エラー != ゼロ {
  11. ログ.致命的(エラー)
  12. }
  13. }

次に、golang の公式ベースイメージを使用して、それをイメージにパッケージ化します。

  1. golang:1.14より
  2. コピー 。 。
  3. go build -o server を実行します。
  4. CMD ["./server"]

Golang ベースのソリューションのイメージ サイズは 818 MB で、それでもまだ非常に大きいです。

分析により、golang 基本イメージに多くの依存パッケージがインストールされていることがわかりました。これらの依存パッケージは、Go ソフトウェアを構築するときに便利ですが、すべてのランタイムに必要なわけではないので、ここで最適化を開始できます。

多段階ビルド

Docker は、必要なすべての依存関係を備えた環境でコードを簡単にビルドし、生成された実行可能パッケージを他のイメージに直接パッケージ化して使用できるようにするマルチステージ ビルド メカニズムをサポートしています。これにより、コンパイル時にはツールとパッケージが必要になるが、実行時にはパッケージは必要なくなるという問題が解決され、イメージ サイズを大幅に削減できます。

注: Docker マルチステージ ビルド メカニズムは、Docker 17.05 で導入された新しい機能です。この機能を使用したい場合は、Docker バージョンを Docker 17.05 以上にアップグレードする必要があります。

マルチステージビルド Dockerfile へ:

  1. ###コンパイル###
  2. golang:1.14-alpine AS ビルダーから
  3. コピー 。 。
  4. go build -o server を実行します。
  5. ###走る###
  6. アルパインより:3.12
  7. コピー--from = builder /go/server ./server
  8. コピー index.html index.html
  9. CMD ["./server"]

  1. Docker イメージ

(⊙o⊙)おお、この戦略は効果的で、生成された画像はわずか13.2MBです。

スクラッチベースイメージと組み合わせた静的コンパイル

13M の画像はすでに非常に優れていますが、他の最適化手法もあります。 Docker の世界には、いくつかのベース イメージが存在します。これは 0 から始まるベース イメージです。このイメージには依存関係がなく、完全に 0 から始まるため、サイズも 0 から始まります。Linux には LFS と呼ばれるディストリビューションがあり、その正式名称は Linux From Scratch で、完全な OS をゼロからコンパイルすることを意味します。このスクラッチベース画像もこれを意味します。

スクラッチ ベース イメージで web.go の実行をサポートするには、コンパイルされたイメージに静的コンパイル フラグを追加して、すべての依存関係を実行中のイメージにパッケージ化できるようにする必要があります。

  1. ### コンパイル ###
  2. golang:1.14 からビルダーとして
  3. コピー 。 。
  4. go build -o server を実行する \
  5. -ldflags "-linkmode 外部 -extldflags -static" \
  6. -ウェブゴー
  7. ###走る###
  8. ゼロから
  9. コピー--from = builder /go/server ./server
  10. コピー index.html index.html
  11. CMD ["./server"]

上記のビルド プロセスでは、コード リンク プロセス中にモードが外部に設定され、-static によって外部リンカーがリンクされます。

最適化後の画像サイズは 8.65MB になります。

究極のキラー - アセンブリ言語

Golang で書かれたプログラムは少なくとも M 程度のサイズがあり、10 MB のイメージは合理化できる限界に達しているはずです。ただし、サイズを大幅に削減するために使用できる他のトリックはありますが、究極のキラーであるアセンブリ言語を使用する必要があります。最終的な解決策は、アセンブリで記述されたフル機能の http サーバー assmttpd を使用することです。そのソース コードは GitHub (github/nemasu/asmttpd) でホストされています。

また、マルチステージコンパイルアプローチを使用して、Ubuntu ベースイメージで依存関係をコンパイルし、それらを Scratch ベースイメージにパッケージ化して実行します。

  1. ###コンパイル###
  2. ubuntu:18.04 からビルダーとして
  3. apt updateを実行する
  4. apt install -y make yasm as31 nasm binutilsを実行します。
  5. コピー 。 。
  6. RUN メイクリリース
  7. ###走る###
  8. ゼロから
  9. コピー--from = builder /asmttpd /asmttpd
  10. コピー /web_root/index.html /web_root/index.html
  11. コマンド ["/asmttpd", "/web_root", "8080"]

結果の画像サイズはわずか 6.34kB です。

次に、このイメージを使用してコンテナを実行します。

  1. docker run -it -p 10080:8080 cchttp:07

curl を使用してアクセスします。

  1. カール -vv 127.0.0.1:10080

要約する

この記事では、コンテナを簡素化するためのさまざまな方法と試みについて説明しました。もちろん、コンテナの機能は単純なので、これらの戦略を実際に直接使用することはできないかもしれませんが、コンテナのチューニングのアイデアの参考として使用できます。

<<:  5 つの主要な分散トランザクションについてどれくらい知っていますか?

>>:  分散オフィス化で4つの大きな変化、3大分析機関が8つの対策を公表

推薦する

クラウドテクノロジー|ハイブリッドクラウド管理プラットフォームのマルチリージョンアーキテクチャ

日本の矢口史明監督はかつて、世界中で突然停電が発生し、すべての電気機器が機能しなくなったときに生き残...

商品検索ランキングの基本的な枠組みには7つの主要な要素があります

関連性市場ルールと上場廃止時期の不正製品の品質 製品の人気 販売者のサービス品質ü 総合ランキングス...

陸松松のウェブサイトの宣伝の控えめな表現の裏には何が隠されているのでしょうか?

陸松松はブログ記事「2011年の独立ブログ活動のまとめ」で、2011年の自身のブログの宣伝方法を「軽...

万家ショッピング、1兆ドル規模の「リベート市場」に関わる反ダンピングで閉鎖の可能性

買い物中にお金を節約できると主張するキャッシュバックウェブサイトはかつては非常に人気があったが、現在...

クラウドコンピューティングとは何ですか?今知っておくべきことすべて

クラウド コンピューティングは、コンピューティング、ストレージ、ネットワーク インフラストラクチャを...

タオバオ村が特許戦争に直面:競争により近隣関係が緊張

李喬沙麟鎮は遂寧県東部、江蘇省、安徽省、山東省の境界に位置し、総面積66平方キロメートル、行政村17...

Ketian Cloud: 企業が顧客と直接対面できるコラボレーション3.0の時代が到来

(11月28日、北京)シスコとTCLの合弁会社シスコクラウドが北京で発表イベントを開催した。 Ket...

ヘルスケア分野ではパブリッククラウドの導入が拡大し続けている

Forrester の 2023 年ヘルスケア クラウドの現状レポートによると、ヘルスケアにおけるパ...

ウェブサイトの包含を改善する方法

ウェブサイトの組み込みは、検索エンジンのキーワードランキングの基礎です。組み込まれていないウェブペー...

仕事の初日に、DingTalkとWeChat for Workが共同で「崩壊」しました...

今日は春節休暇後の最初の営業日です。多くの企業は、2月3日から7日まで、従業員が自宅からリモートワー...

SEO トレーニングの知識: ユーザーの視点から Web サイトのコンテンツを真にレイアウトするにはどうすればよいでしょうか?

月収10万元の起業の夢を実現するミニプログラム起業支援プラン検索エンジンは常に「ユーザーエクスペリエ...

ftech: 月額 20 ドル、ベトナム VPS、1Gbps 帯域幅、無制限トラフィック、4G メモリ/2 コア/25g SSD、Windows/Linux

ftechはベトナム企業で、2009年に設立され、2009年から運営されています。主な事業は、仮想ホ...

2023 年のクラウド コンピューティング イノベーションの予測

クラウド コンピューティングはますます利用が進み、爆発的な成長が目前に迫っていますが、来年はどのよう...

新浪と騰訊微博がコメント機能を停止

本日、Sina Weibo と Tencent Weibo にログインすると、近い将来 Weibo ...

cometvps-2.5USD/VPS/1GB RAM/100GB HDD/1TB Flow/シカゴ/ニューヨーク

Cometvps が初めて私の前に現れたのは、おそらく昨年のブラックフライデーだったと思います。Co...