web-dev-qa-db-ja.com

古典的なdbベースのWebアプリケーションのDocker化-単一または複数のコンテナー?

私は古典的な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の経験がありませんので、各アプローチからどのような落とし穴を予想できますか?

私が見逃している他のアプローチはありますか?

7
radai

私が見た推奨事項は、オールインワンコンテナーを持つことです Docker Misconceptions

誤解:Dockerコンテナごとに1つのプロセスのみが必要です!

Dockerをデプロイ可能な単一目的のプロセスではなく、役割ベースの仮想マシンとして見ると、Dockerの管理がはるかに簡単になることを理解することが重要です。たとえば、 'app'によく似た 'app'コンテナを作成しますVMあなたはその中にinit、cron、sshなどのプロセスとともに作成します。ドンssh、cron、アプリ、Webサーバーなどの個別のコンテナーを使用して、独自のコンテナー内のすべてのプロセスをキャプチャしようとしないでください。

それについて考える1つの方法は、他の部品なしで1つの部品を実行する必要があるかどうかを自問することです。たぶん、アプリサーバーなしでDBを実行したいと思うかもしれませんが、どのくらいの頻度ですか?

7
Rob Crawford

Dockerかどうかに関係なく、webappとdbサーバーの両方を同じコンテナーに配置しないでください。最初は動作するかもしれませんが、アプリケーションが大きくなると、フロントエンドとデータベースを個別にスケーリングする必要があります。最初から異なるコンテナがあると、コンテナの移動、個別の複製などが簡単になります。

9
Brimstedt