私は古典的なJava webappを持っています。これはデータベース(PostgreSQL)、サーブレットコンテナ(Tomcat)、および私のコード(* .warファイルとしてTomcatにデプロイされています)で構成されています。
Dockerを使用して(主に今のところテスト用に)パッケージ化/デプロイしたいのですが、「マッピング」するための最良の方法が何なのかわかりません。
私の最初のアイデアは、app-in-a-boxを用意することでした-Java、Postgres、Tomcatを含むコンテナーを定義し、httpポートのみを公開しました。
Dockerドキュメントをさらに読むと、これは可能ですが(単一のフォアグラウンドプロセスとしてスーパーバイザーをインストールして実行し、PostgresとTomcatの両方を起動する場合)、おそらく意図した使用法ではないことがわかります。チュートリアルの精神に従うと、おそらくPostgres用のコンテナ、Tomcat用のコンテナ、およびアプリケーションコード(my * .war)とデータベースファイルを保持するためのデータコンテナを作成する必要があります。これは、3つ以上のコンテナーを意味します(dbファイルと* .warは同じデータコンテナーを共有する必要がありますか?)
ここでの一般的な方法は何ですか?
私はDockerの経験がありませんので、各アプローチからどのような落とし穴を予想できますか?
私が見逃している他のアプローチはありますか?
私が見た推奨事項は、オールインワンコンテナーを持つことです Docker Misconceptions :
誤解:Dockerコンテナごとに1つのプロセスのみが必要です!
Dockerをデプロイ可能な単一目的のプロセスではなく、役割ベースの仮想マシンとして見ると、Dockerの管理がはるかに簡単になることを理解することが重要です。たとえば、 'app'によく似た 'app'コンテナを作成しますVMあなたはその中にinit、cron、sshなどのプロセスとともに作成します。ドンssh、cron、アプリ、Webサーバーなどの個別のコンテナーを使用して、独自のコンテナー内のすべてのプロセスをキャプチャしようとしないでください。
それについて考える1つの方法は、他の部品なしで1つの部品を実行する必要があるかどうかを自問することです。たぶん、アプリサーバーなしでDBを実行したいと思うかもしれませんが、どのくらいの頻度ですか?
Dockerかどうかに関係なく、webappとdbサーバーの両方を同じコンテナーに配置しないでください。最初は動作するかもしれませんが、アプリケーションが大きくなると、フロントエンドとデータベースを個別にスケーリングする必要があります。最初から異なるコンテナがあると、コンテナの移動、個別の複製などが簡単になります。