Docker イメージの最適化 (1.16GB から 22.4MB)

Docker イメージの最適化 (1.16GB から 22.4MB)

Docker は、ソフトウェア開発者やシステム管理者がコンテナを使用してアプリケーションを構築、実行、共有するためのプラットフォームです。コンテナは、Docker イメージを使用して構築された独自のファイル システム上の分離された環境で実行されるプロセスです。イメージには、アプリケーションを実行するために必要なものすべて (コンパイルされたコード、依存関係、ライブラリなど) が含まれています。イメージは Dockerfile ファイルを使用して定義されます。

Docker コンテナを作成するプロセスを定義するために、Docker 化またはコンテナ化という用語はよく使用されます。

コンテナが人気なのは、次のような利点があるためです。

  • 柔軟性: 最も複雑なアプリケーションでもコンテナ化できます。
  • 軽量: コンテナはホストカーネルを共有するため、仮想マシンよりもはるかに効率的です。
  • 移植性: ローカルでコンパイルしてどこでも実行できます。
  • 疎結合: コンテナは自己カプセル化されており、1 つのコンテナを置き換えたりアップグレードしたりしても、他のコンテナは中断されません。
  • セキュリティ: コンテナーは、ユーザーによる構成を必要とせずにプロセスを厳密に制限および分離します。

この記事では、Docker イメージを最適化して軽量化する方法に焦点を当てます。

まず、React アプリケーションを構築してコンテナ化する例から始めましょう。 npx コマンドを実行して Dockerfile を作成すると、図 1 に示すファイル構造が得られます。

npx create-react-app アプリ --template typescript 

写真

図1: ファイル構造

基本的な Dockerfile (以下を参照) をビルドすると、1.16 GB のイメージが作成されます。

ノード:10から
WORKDIR /appCOPY app /appRUN npm install -g webserver.localRUN npm install && npm run build
EXPOSE 3000CMD webserver.local -d ./build 

写真

図2: 画像の初期サイズは1.16GBです

最適化の第一歩: 軽量ベースイメージの使用

Docker Hub (パブリック Docker リポジトリ) には、それぞれ特性とサイズが異なる複数のイメージがダウンロード可能です。

通常、Alpine または BusyBox に基づくイメージは、他の Linux ディストリビューション (Ubuntu など) に基づくイメージに比べて非常に小さくなります。これは、Alpine イメージや同様のイメージが、必要最小限のパッケージのみを含むように最適化されているためです。下の画像では、Ubuntu、Alpine、Node、および Alpine ベースの Node イメージのサイズ比較を確認できます。

写真

図3: ベースイメージの異なるサイズ

Dockerfile を変更し、Alpine をベースイメージとして使用すると、イメージのサイズは 330 MB になります。

ノード:10-alpineから
WORKDIR /appCOPY app /appRUN npm install -g webserver.localRUN npm install && npm run build
EXPOSE 3000CMD webserver.local -d ./build 

写真

図4: 最適化の最初のステップの後、画像サイズは330MBになります

第2段階の最適化:多段階構築

マルチステージ ビルドでは、Dockerfile で複数のベース イメージを使用し、コンパイルされた製品や構成ファイルなどをあるステージから別のステージにコピーできるため、不要なものを破棄できます。

この場合、React アプリケーションをデプロイするにはコンパイルされたコードが必要です。ソース ファイル、node_modules ディレクトリ、package.json ファイルなどは必要ありません。公開アカウント Nifengqibi をフォローし、pdf に返信して、必要な学習教材をすべてダウンロードしてください。

Dockerfile を次の内容に変更すると、最終的にイメージ サイズは 91.5 MB になります。最初のステージ (1 行目から 4 行目) のイメージは自動的に削除されず、Docker によってキャッシュに保持されるので、別のイメージ ビルド プロセスで同じステージを実行すると、イメージ ビルドが高速化されることに注意してください。したがって、最初のステージのイメージを手動で削除する必要があります。​​​​​​​​

node:10-alpine AS buildWORKDIR /appCOPY app /appRUN npm install && npm run build から
node:10-alpineWORKDIR /appRUN から npm install -g webserver.localCOPY --from=build /app/build ./buildEXPOSE 3000CMD webserver.local -d ./build 

写真

図5: 最適化の2番目のステップ後の画像サイズは91.5MBです

これで、2 つのステージを持つ Dockerfile ができました。最初のステージではプロジェクトをコンパイルし、2 番目のステージではアプリケーションを Web サーバーにデプロイします。ただし、Node コンテナーは Web ページ (HTML、CSS、JavaScript ファイル、画像など) を提供するのに最適な選択肢ではありません。最適なオプションは、Nginx や Apache などのサービスを使用することです。この例では、Nginx を使用します。

Dockerfile を以下のように変更すると、イメージのサイズは 22.4MB になります。このコンテナを実行すると、Web ページが問題なく正常に動作することがわかります (図 7)。

node:10-alpine AS buildWORKDIR /appCOPY app /appRUN npm install && npm run build から

nginx:stable-alpine から --from=build /app/build /usr/share/nginx/htmlEXPOSE 80CMD ["nginx", "-g", "daemon off;"] にコピーします。 

写真

図6: 最適化の3番目のステップ後の画像サイズは22.4MBです

写真

図7: 最終的なコンテナ実行結果

Docker イメージの最適化 (1.16GB から 22.4MB へ) に関する記事はこれで終わりです。より関連性の高い Docker イメージの最適化コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Dockerイメージの圧縮と最適化操作
  • Dockerイメージサイズを最適化する一般的な方法

<<:  制限を使用すると、MySQL のページングがどんどん遅くなるのはなぜですか?

>>:  スケルトン スクリーンの読み込みプレースホルダー アニメーション効果を実装するための CSS + HTML (アニメーション付き)

推薦する

小さなページングデザイン

ユーザーが目的のものを探すために前進するか後退するかを選択できるようにします。たとえば、Taobao...

HTMLにおける絶対パスと相対パスの違いの分析

図に示すように: 1 つのページには多数のファイルが接続されているため、ファイルを参照するときには、...

Mysqlトランザクション操作の失敗を解決する方法

Mysqlトランザクション操作の失敗を解決する方法トランザクションの原子性: トランザクションは、デ...

JavaScript Proxyオブジェクトの詳細な説明

目次1. プロキシとは何ですか? 2. 使い方は? 1. プロキシを使用する簡単な例2. 対象オブジ...

MySQLクエリ結果をCSVにエクスポートする方法

MySQL クエリ結果をcsvにエクスポートするには、通常、php を使用して mysql に接続し...

nginx で gzip 圧縮を実装してウェブサイトの速度を向上させる方法

目次gzip 圧縮を使用する理由は何ですか? nginxはgzipを実装するgzip処理nginx ...

HTML におけるスクリプトの配置に関する簡単な説明

以前は、スクリプトは HTML 内のどこにでも配置できると思っていましたが、今日、要件に取り組んでい...

動的なデジタル時計を実装するJavaScript

この記事では、JavaScriptで動的なデジタル時計を実装するための具体的なコードを参考までに紹介...

ページに間隔を空けてグリッドレイアウトを完璧に実装する方法

典型的なレイアウト例上の写真のように、正方形の真ん中に一定の隙間があり、その隙間は固定されています。...

Node.js コード実行をバイパスするためのヒントのまとめ

目次1. 子プロセス2. nodejsでのコマンド実行2.1 16進数エンコード2.2 ユニコードエ...

親ページの更新を制御するために HTML で iframe を実装するためのアイデアとコード

1. 応用シナリオ親ページ a.jspサブページ b.jsp (ページ a に埋め込まれた ifra...

MySQL の NOT IN 充填ピットの NULL 列の問題の解決方法

以前、会社で小さな機能に取り組んでいたとき、特定の状況でデータがいくつあるかを数えてから問題を修正し...

win10 での mysql5.7.21 の詳細なインストール手順

この記事では、MySQL 5.7.21のインストールとインストール中に発生した問題を参考までに紹介し...

Windows 64 ビット版 MySQL 5.7 以降の解凍パッケージにデータディレクトリと my-default.ini がなく、サービスが起動できない問題の簡単な解決方法 (問題概要)

私は SQL の初心者で、オープンソースのインストールは非常に簡単だと思っていましたが、その過程でい...

JavaScript 関数のコンテキストのルールは何ですか?

目次1. ルール 1: Object.Method() 1.1 ケース1 1.2 ケース2 1.3 ...