目次
1.小さなベース画像を使用します
2。別々の段階でビルドして実行します(マルチステージビルド)
3。瓶自体を最適化します
4.クラスデータ共有を有効にする(CD)
5.コンテナのJVM設定をチューニングします
6.極端な最適化のために、ネイティブ画像(graalvm)を検討してください
利益の概要
ホームページ Java &#&チュートリアル より小さなサイズとより速いスタートアップのためにJava Docker画像を最適化する

より小さなサイズとより速いスタートアップのためにJava Docker画像を最適化する

Jul 29, 2025 am 12:27 AM
java docker

Eclipse-Temurin:17-Jre-alpineまたは-slimなどの小さな基本画像を使用して、体積を減らします。 2。マルチステージ構造を使用してコンピレーションを分離し、環境を実行して、ビルドツールとソースコードを最終画像に投げないようにします。 3. JARパッケージ自体を最適化し、役に立たない依存関係を削除し、圧縮を有効にし、Spring Boot Hierarchical JARを検討します。 4.クラスデータ共有(CD)を有効にして、起動時間とメモリの使用量を削減します。 5. -XX:USECONTAINERSUPPORTおよび-XX:MAXRAMPERCENTAGEなどのJVMコンテナ化パラメーターを調整して、コンテナリソースの制限に適応します。 6. GRAALVMネイティブミラーリングは、非常に高いスタートアップ速度要件を備えたシナリオで使用できます。これにより、パフォーマンスが大幅に向上しますが、建設の複雑さが向上します。最初の5つのアイテムを組み合わせた使用は、低い複雑さで優れた最適化結果を達成でき、ネイティブミラーリングは、コールドスタートに敏感なクラウドネイティブアプリケーションに適しています。

より小さなサイズとより速いスタートアップのためにJava Docker画像を最適化する

Java Docker画像の最適化は、ファイルサイズを縮小するだけではありません。特にクラウドやサーバーレス環境での展開の速度、攻撃面の削減、起動時刻の速さです。 Java Docker Imagesの貸し手をより効率的にする方法は次のとおりです。

より小さなサイズとより速いスタートアップのためにJava Docker画像を最適化する

1.小さなベース画像を使用します

選択したベース画像は、サイズに大きな影響を与えます。従来のopenjdk:17-jdkまたはopenjdk:17画像は、Debianなどの完全なLinux分布に基づいており、500MBを超える可能性があります。

より良いオプション:

より小さなサイズとより速いスタートアップのためにJava Docker画像を最適化する
  • eclipse-temurin:17-jre-alpine - Alpine Linuxは小さく(〜5MBベース)、JREのみがフットプリントを削減します。
  • eclipse-temurin:17-jre-slim - Debianベースですが、剥がれました。 Alpineよりも互換性があり、完全なJDKよりもはるかに小さい。
 # の代わりに:
#openjdkから:17
# 使用:
Eclipse-Temurinから:17-jre-alpine

⚠️注:Alpineはglibcの代わりにmuslを使用しています。これにより、一部のネイティブライブラリと互換性の問題が発生する可能性があります。問題が発生した場合は、代わりに-slimを使用してください。


2。別々の段階でビルドして実行します(マルチステージビルド)

ビルドツール、ソースコード、依存関係を最終画像にバンドリングしないでください。

より小さなサイズとより速いスタートアップのためにJava Docker画像を最適化する
 #マルチステージ:フルJDKでビルドし、JREで実行します
Eclipse-Temurinから:ビルダーとしての17-jdk-alpine
workdir /app
コピー 。 。
./gradlew build -xテストを実行します

Eclipse-Temurinから:17-jre-alpine
workdir /app
コピー -  f -fuilder /app/build/libs/app.jar app.jar
cmd ["java"、 "-jar"、 "app.jar"]]

これにより、ランタイムイメージが最小限に抑えられます。グレーダー、ソースファイル、開発ツールはありません。


3。瓶自体を最適化します

含まれるすべての依存関係を備えた脂肪瓶(Uber-jar)は便利ですが、肥大化することができます。

ヒント:

  • 未使用の依存関係を削除します-依存関係チェックや手動のレビューなどのツールを使用します。
  • Spring Boot's Shin Jar(該当する場合)を使用します- 共有レイヤーへのオフロード依存関係。
  • JAR圧縮を有効にする- ほとんどのビルドツールはデフォルトでこれを行いますが、検証します。

プロのヒント:スプリングブートを使用する場合は、より良いDockerレイヤーキャッシングのためにJARコンテンツをレイヤー化するコンテナ画像サポートを備えたスプリングブート3.2を検討してください。


4.クラスデータ共有を有効にする(CD)

クラスのデータ共有により、JVMはプリロードおよびメモリマップコアクラスを使用して、スタートアップの時間とメモリの使用量を削減できます。

画像ビルド中にCDSアーカイブを生成します。

 Eclipse-Temurinから:17-jre-alpine
app.jar /app.jarをコピーします

#CDSアーカイブを生成します
Java -xshareを実行する:dump -xx:archiveclassesatexit = /app.jsa -jar /app.jar
#またはメインクラスを知っている場合:
#Java -CP app.jar -xshare:dump -xx:archiveclassesatexit =/app.jsa com.example.mainを実行します

#実行時にCDを使用します
EntryPoint ["Java"、 "-xshare:auto"、 "-xx:sharedarchivefile =/app.jsa"、 "-jar"、 "app.jar"]]

これにより、特に多くの依存関係を持つアプリでは、起動時間を10〜30%削減できます。


5.コンテナのJVM設定をチューニングします

デフォルトでは、JVMはコンテナメモリの制限を尊重しない場合があります。

これらのフラグを追加します:

 EntryPoint ["Java"、\
  "-xx:usecontainersupport"、\
  "-xx:maxrampercentage = 75.0"、\
  "-xshowsettings:vm"、\
  "-jar"、 "app.jar"]]
  • UseContainerSupport JVMがコンテナの制限を検出できます。
  • MaxRAMPercentage 、ヒープのオーバーアロークを回避します。

これにより、OOMが殺害を防ぎ、スタートアップの予測を改善します。


6.極端な最適化のために、ネイティブ画像(graalvm)を検討してください

最速のスタートアップと最小のフットプリントについては、 GraalVMネイティブ画像を使用してJavaアプリをネイティブバイナリにコンパイルします。

長所:

  • 100万秒のスタートアップ。
  • より小さなメモリフットプリント。
  • より小さな画像(JVMは必要ありません)。

短所:

  • より長いビルド時間。
  • 限られた反射/動的クラスロード(設定が必要)。
  • より大きなビルド画像。

例:

 #graalvmでステージを構築します
ghcr.io/graalvm/graalvm-jdk:17からビルダーとして
GUインストールネイティブイメージを実行します
コピー 。 。
ネイティブイメージ-jar app.jarを実行します

#最終段階
Alpineから:最新
コピー -  From = Builder App /App
EntryPoint ["./App"]

高速スタートアップが重要なマイクロサービス、サーバーレス、またはCLIツールに最適です。


利益の概要

最適化 サイズの削減 スタートアップの改善
アルパイン/JREベース 30〜50% マイナー
マルチステージビルド 20–40% なし
CD 最小限 10–30%
ネイティブ画像 50–80% 80〜95%速い

ニーズに基づいて適切なコンボを選択してください。ほとんどのアプリでは、スリムベースのマルチステージCDSは、複雑さなしに優れた結果をもたらします。クラウドネイティブサービスの場合、 Graalvmネイティブは投資する価値があります。

基本的に、1つの瓶を実行するためだけにデータセンターのJDK相当のJDKを出荷しないでください。

以上がより小さなサイズとより速いスタートアップのためにJava Docker画像を最適化するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ホットトピック

JavaのWebSocketを介してメッセージを送信および受信する方法 JavaのWebSocketを介してメッセージを送信および受信する方法 Aug 16, 2025 am 10:36 AM

@ServerEndPointを使用してパスを定義するWebSocketサーバーエンドポイントを作成し、 @Onopen、 @Onmessage、 @Onclose、 @Onerrorを介して接続、メッセージ受信、閉鎖、エラーを処理します。 2. Javax.Websocket-API依存関係が展開中に導入され、コンテナによって自動的に登録されることを確認してください。 3. Javaクライアントは、ContainerProviderを介してWebSocketContainerを取得し、ConnectToServerを呼び出してサーバーに接続し、@ClientEndPoint Annotationクラスを使用してメッセージを受信します。 4。セッションGetBasicreを使用します

Dockerを始める方法 Dockerを始める方法 Aug 16, 2025 pm 01:46 PM

dockerisaplatformpackaging、出荷、andrunningapplicationsinightionsingweight、隔離されたnostoskernel、virtualmachines.2.installdockerdesktoponwindowsormacos、oruseetecurlcommandinux、thentestestestwithdockerurunhello

Javaアプリケーションを展開する方法 Javaアプリケーションを展開する方法 Aug 17, 2025 am 12:56 AM

PrepareyourapplicationbyusingMavenorGradletobuildaJARorWARfile,externalizingconfiguration.2.Chooseadeploymentenvironment:runonbaremetal/VMwithjava-jarandsystemd,deployWARonTomcat,containerizewithDocker,orusecloudplatformslikeHeroku.3.Optionally,setup

phpmyAdminセキュリティベストプラクティス phpmyAdminセキュリティベストプラクティス Aug 17, 2025 am 01:56 AM

phpMyAdminを効果的に保護するには、複数のセキュリティ対策を採用する必要があります。 1. IPを介してアクセスを制限すると、信頼できるIP接続のみが許可されます。 2.デフォルトのURLパスを推測が容易ではない名前に変更します。 3.強力なパスワードを使用して、最小限の権限を備えた専用のMySQLユーザーを作成すると、2要素認証を有効にすることをお勧めします。 4.既知の脆弱性を修正するには、phpmyAdminバージョンを維持します。 5. WebサーバーとPHP構成を強化し、危険な機能を無効にし、ファイルの実行を制限します。 6。信任状の漏れを防ぐために、HTTPSに通信を暗号化するように強制します。 7. HTTP基本認証を使用していない場合、または使用していない場合はPHPMyAdminを無効にします。 8.ログを定期的に監視し、fail2banを構成して、ブルートフォースの亀裂から防御します。 9。セットアップを削除します

現在、NVIDIA GPUに接続されたディスプレイを使用していません[修正] 現在、NVIDIA GPUに接続されたディスプレイを使用していません[修正] Aug 19, 2025 am 12:12 AM

ifyousee "youarenotusing adisplayatchedtoannvidiagpu、" surseyourmonitoristuntedtothenvidiagpuport、configuredisissettingsintingsintingsintinginstingsintingduandcleaninstall、およびsettheprimarysodiscutodiscreteinbios/ueftereed

JavaのAssertキーワードは何ですか? JavaのAssertキーワードは何ですか? Aug 17, 2025 am 12:52 AM

theasertkeywordinjavaisusedtoeas sumptionsduringDevelopment、throwinganassertionerroriftheconditionispalse.2

XSLTパラメーターを使用して、動的変換を作成します XSLTパラメーターを使用して、動的変換を作成します Aug 17, 2025 am 09:16 AM

XSLTパラメーターは、外部の通過値を介した動的変換の重要なメカニズムです。 1.宣言されたパラメーターを使用し、デフォルト値を設定します。 2。XSLTarGumentListなどのインターフェイスにアプリケーションコード(C#など)から実際の値を渡します。 3.テンプレート内の$ paramName参照パラメーターを介して、条件付き処理、ローカリゼーション、データフィルタリング、または出力形式を制御します。 4.ベストプラクティスには、意味のある名前の使用、デフォルト値の提供、関連するパラメーターのグループ化、および値の検証が含まれます。パラメーターを合理的に使用すると、XSLTスタイルのシートが非常に再利用可能で保守可能になり、同じスタイルシートが異なる入力に基づいて多様な出力結果を生成できます。

PSオイルペイントフィルターグレーアウト修正 PSオイルペイントフィルターグレーアウト修正 Aug 18, 2025 am 01:25 AM

The oilpaintfilterinphotoshopisgreedouturedutivesuredivedocumentmodeorlayertype

See all articles