だから、私はDockerが初めてです。質問の背景を説明させてください。
10〜20個のSpring Bootマイクロサービスアプリケーションがあり、それぞれローカルマシンの異なるポートで実行されています。
しかし、Dockerに移行するには、私の学習に基づいて、各サービスが異なるDockerコンテナーに存在している必要があります。これにより、迅速にデプロイまたはコピーを作成できます。
Dockerコンテナーごとに、新しいDockerイメージを作成する必要があります。
Spring Bootアプリケーションを実行するには、各DockerイメージにJREが含まれている必要があります。最大で約200MBです。つまり、各ドッカーイメージは、たとえば最大350MBです。一方、ローカルPCには200MBのJREが1つしかなく、各アプリケーションは数MBのスペースしか必要としません。
これに基づいて、ローカルシステムに600MBが必要ですが、すべてのDockerイメージに7GBが必要です。
このアプローチは正しいですか? DockerHubの「OpenJDK」を各画像に追加する必要がありますか?
ターゲットPCにすでにJDKがある場合でも、イメージのサイズが大きいのはなぜですか?
他の答えはDockerの階層化をかなりよくカバーしているので、質問の詳細を追加したいだけです。
はい。画像にない場合、コンテナにはありません。ただし、できるだけ多くのレイヤーを再利用することで、ディスク容量を節約できます。したがって、Dockerfileを「変更の可能性が最も低い」から「変更の可能性が最も高い」に変更してください。したがって、イメージを作成するときは、「キャッシュの使用」が頻繁に表示されるほど効果的です。
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は黄金のハンマーではありません。試して、長所と短所を自分で評価し、長所があなたとあなたのチームの短所に値するかどうかを判断してください。
Lagomの答え は素晴らしいですが、Dockerコンテナーのサイズは、転送と保管を容易にするために、可能な限り小さくする必要があることを付け加えます。
そのため、 Alpine Linux ディストリビューションに基づいたコンテナが多数ありますが、これらは非常に小さいものです。可能であればそれらを使用してみてください。
さらに、考えられるすべてのツールをコンテナーに追加しないでください。あなたはしばしばwgetなしで行うことができます...