web-dev-qa-db-ja.com

各DockerイメージにはJDKを含める必要がありますか?

だから、私はDockerが初めてです。質問の背景を説明させてください。

  1. 10〜20個のSpring Bootマイクロサービスアプリケーションがあり、それぞれローカルマシンの異なるポートで実行されています。

  2. しかし、Dockerに移行するには、私の学習に基づいて、各サービスが異なるDockerコンテナーに存在している必要があります。これにより、迅速にデプロイまたはコピーを作成できます。

  3. Dockerコンテナーごとに、新しいDockerイメージを作成する必要があります。

  4. Spring Bootアプリケーションを実行するには、各DockerイメージにJREが含まれている必要があります。最大で約200MBです。つまり、各ドッカーイメージは、たとえば最大350MBです。一方、ローカルPCには200MBのJREが1つしかなく、各アプリケーションは数MBのスペースしか必要としません。

  5. これに基づいて、ローカルシステムに600MBが必要ですが、すべてのDockerイメージに7GBが必要です。

このアプローチは正しいですか? DockerHubの「OpenJDK」を各画像に追加する必要がありますか?

ターゲットPCにすでにJDKがある場合でも、イメージのサイズが大きいのはなぜですか?

18
SamwellTarly

あなたの理解は正しくありません。

Dockerイメージはレイヤーで形成されます。次の図を参照してください。

イメージにJREをインストールするときに、そのチェックサムが91e54dfb1179次の図では、実際にディスクを占有します。

しかし、すべてのコンテナが同じ画像に基づいており、異なるマイクロサービスアプリケーションをシンR/Wレイヤーに追加すると、すべてのコンテナが91e54dfb1179なので、n * mの関係にはなりません。

すべてのJavaアプリケーションに同じベースイメージをできるだけ使用することに注意し、シンR/Wレイヤーに異なるものを追加する必要があります。

Enter image description here

27
atline

他の答えはDockerの階層化をかなりよくカバーしているので、質問の詳細を追加したいだけです。

このアプローチは正しいですか? DockerHubの「OpenJDK」を各画像に追加する必要がありますか?

はい。画像にない場合、コンテナにはありません。ただし、できるだけ多くのレイヤーを再利用することで、ディスク容量を節約できます。したがって、Dockerfileを「変更の可能性が最も低い」から「変更の可能性が最も高い」に変更してください。したがって、イメージを作成するときは、「キャッシュの使用」が頻繁に表示されるほど効果的です。

ターゲットPCにすでにJDKがある場合でも、イメージのサイズが大きいのはなぜですか?

Dockerは、ホストとの関係をできる限り少なくしたいと考えています。 Dockerはホストに対処したくさえありません。最初に行うことは、非表示にするためにVMを作成します。ホストが提供するものは、空のRAM、ディスク、およびCPUだけであると想定します。したがって、各Dockerイメージには、 OS /カーネル(最初のFROMが行っていることで、使用するベースOSイメージを選択します)したがって、最終的なイメージサイズは、実際にはOS +ツール+アプリです。レイヤー。画像全体で再利用されます。

(実装済み)各アプリ/マイクロサービスを独自のコンテナに入れる必要がありますか?

はい、そうです。アプリを分離されたモジュールに変換することで、そのモジュールの置き換え/負荷分散が容易になります。

実際には、そうではありません(あなたにとって)。 Spring Bootは軽いフレームワークではありません。実際、コードをモジュール化するためのフレームワークです(モジュール制御システム内でモジュール制御システムを効果的に実行する)。そして、あなたはそれらの10-20をホストしたいですか?これはおそらく、単一のサーバー上で実行できないでしょう。 DockerはSpringブートを強制的にメモリにロードしますアプリごと;オブジェクトはモジュール間で再利用できないため、それらもマルチインスタンス化する必要があります!また、1つの実稼働サーバーに制限されている場合、水平スケーリングはオプションではありません。 (Spring Bootごとに1GBまでのHEAP(RAM)が必要になります。マイレージはコードベースに基づいています)。また、10〜20個のアプリの場合、Docker展開用にアプリを軽量化するためのリファクタリングは、実現不可能/予算内に収まらない場合があります。言うまでもなく、テスト用に最小限のセットアップをローカルで実行できない場合(RAMが不足している場合)、開発作業により多くの「楽しい」ことができます。

Dockerは黄金のハンマーではありません。試して、長所と短所を自分で評価し、長所があなたとあなたのチームの短所に値するかどうかを判断してください。

4
Tezra

Lagomの答え は素晴らしいですが、Dockerコンテナーのサイズは、転送と保管を容易にするために、可能な限り小さくする必要があることを付け加えます。

そのため、 Alpine Linux ディストリビューションに基づいたコンテナが多数ありますが、これらは非常に小さいものです。可能であればそれらを使用してみてください。

さらに、考えられるすべてのツールをコンテナーに追加しないでください。あなたはしばしばwgetなしで行うことができます...

2
Christian Sauer