web-dev-qa-db-ja.com

DockerイメージにWARファイルをデプロイする正しい方法

Javaプロジェクトをdockerコンテナにデプロイするdockerの方法は何ですか?

戦争をwebappsにコピーしますか:

FROM jetty:9.2.10
MAINTAINER Me "[email protected]"
ADD ./target/*.war /var/lib/jetty/webapps/ROOT.war

または爆発した戦争ファイルを取りますか:

FROM jetty:9.2.10
MAINTAINER Me "[email protected]"
ADD ./target/app-0.1.0.BUILD-SNAPSHOT /var/lib/jetty/webapps/ROOT

通常、封印された戦争ファイルが通常のコンテナである場合は展開しますが、Dockerでは、小さな変更を加えるたびに10〜20MBのファイルをプッシュしますが、爆発した戦争を追加すると差分のみがプッシュされます-.classファイル変更されました。

戦争ファイルの代わりに爆発戦争を展開することの欠点はありますか?

24

画像をどのように使用しているのでしょうか。イメージの構築中に20MBのファイルを追加すると、ほとんど瞬時に処理されるはずです。 AWSがDockerfileを提供するときのように、デプロイ中に何らかの形でイメージを構築するかもしれません。

いずれにせよ、それはどのように展開しているかに依存すると思います。画像を自分の周りに移動する場合、.warファイルの追加と展開されたWARディレクトリの追加に大きな違いはありません。私はあなたにとって便利なことをするでしょう。ただし、アプリをDockerから実行する場合と、.war(Dockerの一部を見逃す場合があります)から実行する場合は、常に.warを使用することもできます。

DockerfileまたはDockerrun.aws.jsonファイルが必要なAWS Elastic Beanstalk(リポジトリからイメージをプルするもの)にデプロイする場合、実際にデプロイするものからイメージを分離するのは理にかなっています(またはこれまでのところ私には理にかなっています)。これにより、コンテナを同じ状態に保つことができますが、アプリの更新では.jar/.warファイルを適切な場所にコピーするだけです(Dockerのポイントの一部を見逃す可能性があります;)。

私がやっていることは、Docker Hubでベースイメージを作成し、Dockerrun.aws.jsonファイルを使用してアプリにマッピングすることです。そうすれば、AWSはイメージを作成する必要がなく、プルするだけです。それははるかに高速で低コスト($)です。ただし、アプリをイメージから分離するため、状況によっては展開が複雑になる場合があります。ただし、イメージは非常に安定しているため、通常は.jarファイル、Dockerrun.aws.jsonファイル、およびシェルスクリプトを.Zipにバンドルし、AWSにアップロードします。とても簡単だと思います。

私のDockerfileは非常にシンプルで、Spring Bootアプリに本当に必要なものすべてです。

FROM Java:8
VOLUME /tmp
VOLUME /app
EXPOSE 8080
ENTRYPOINT ["sh","/app/app.sh"]

同様のことを実行し、-vオプションなどを使用して、ボリュームをアプリにマップしたり、環境設定などを行うことができます。ところで、Docker Hubでは この画像 を使用できます。

6
objectuser

実際には、展開された.warを常にデプロイする必要があります。

ここで考える速度の2つの要素があります。

  1. イメージをコンテナリポジトリにプッシュアップできる速度はどれくらいですか?

    そして

  2. コンテナの新しいインスタンスがリクエストの処理を開始できるのはどのくらいですか? (弾性スケーリング環境で重要)

両方の答えは同じです。コンテナを作成するときは、.warファイルをコピーせずに、.warファイルを展開する方が良いでしょう。

これには、次の2つの非常に良い効果があります。

  1. コンテナのバージョン間の違いがはるかに小さくなるため、アップロード時間が短くなります。
  2. つまり、アプリケーションの需要に合わせて動的にスケーリングする場合、新しいコンテナインスタンスは、リクエストへの応答を開始する前に.warファイルを解凍する必要がありません。

低速なアップロード接続に悩まされている私たちにとって、CIサーバーまたはクラウドでホストされたVM=を使用して、Dockerイメージをdockerhubまたは別のコンテナーレジストリにプッシュすることも素晴らしいアイデアです。そうすれば、ギガビット規模のアップロード速度を活用できます。

8
Ryan Kimber

これは私がそれを行う方法です:

FROM Tomcat:8.0
MAINTAINER David Ford <[email protected]>
ENV DB_Host mySqlServer
ENV DB_USER joeBlow
ENV DB_PASSWORD bla bla bla
EXPOSE 8080
RUN rm -fr /usr/local/Tomcat/webapps/ROOT
COPY target/webapp /usr/local/Tomcat/webapps/ROOT

私のToDoリスト:WEB_INF/libディレクトリーを独自のコンテナーに分離します。

6
Dave Ford

これを試すことができます:COPYを使用してwarファイルをコンテナにコピーし、COPYを使用してjettyランナーjarをコンテナにコピーし、CMDを使用して次のように実行します。 path/to/app.war "]

http://www.Eclipse.org/jetty/documentation/current/runner.html

注:コンテナにJavaをインストールする必要があります。

1
Yogesh_D