DockerでSpring Bootアプリケーションを実行する方法

DockerでSpring Bootアプリケーションを実行する方法

ここ数日、dockerでSpring Bootアプリケーションを実行する方法を勉強してきました。以前は、src/mainにdockerフォルダと新しいDockerfileファイルを直接作成できるMavenプラグインがありました。コンパイルしてパッケージ化した後、dockerプラグインを直接実行できます。これは、 docker build .現在のアプリケーションを直接ミラーにビルドしてから実行するため、非常に便利です。ただし、個人的にテストした後、このプラグインは安定しておらず、dockerフォルダが毎回ターゲットフォルダに配置されない場合があるため、このプラグインは実行時にあまり役に立ちません。

そのため、後で Spring Boot アプリケーションをミラーにビルドするときに、提供されている docker maven プラグインは使用せず、現在のプロジェクトのルート ディレクトリに新しい Dockerfile ファイルを作成しました。アプリケーションが記述された後、次のようにコマンドを手動で実行して、アプリケーションをミラーにビルドしました。

Springbootアプリケーション

ドキュメント

ここでの pom.xml では、次のように複数のリポジトリを指定し、複数のプラグインを提供する必要があります。

<プロジェクト xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <モデルバージョン>4.0.0</モデルバージョン>

 <groupId>cn.com</groupId>
 <artifactId>springbootweb</artifactId>
 <バージョン>1.0-SNAPSHOT</バージョン>
 <packaging>jar</packaging>

 <name>spring :: boot :: web</name>

 <親>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <バージョン>1.4.1.RELEASE</バージョン>
  <相対パス/>
 </親>

 <プロパティ>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <docker.image.prefix>springio</docker.image.prefix>
  0.3.8 をリリースしました。
  <java.version>1.8</java.version>
 </プロパティ>

 <依存関係>
  <依存関係>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
  </依存関係>
 </依存関係>



 <リポジトリ>
  <リポジトリ>
   <id>春のスナップショット</id>
   <url>http://repo.spring.io/snapshot</url>
   <スナップショット>
    <enabled>有効</enabled>
   </スナップショット>
  </リポジトリ>
  <リポジトリ>
   <id>春の節目</id>
   <url>http://repo.spring.io/milestone</url>
   <スナップショット>
    <enabled>有効</enabled>
   </スナップショット>
  </リポジトリ>
 </リポジトリ>

 <プラグインリポジトリ>
  <プラグインリポジトリ>
   <id>春のスナップショット</id>
   <url>http://repo.spring.io/snapshot</url>
  </プラグインリポジトリ>
  <プラグインリポジトリ>
   <id>春の節目</id>
   <url>http://repo.spring.io/milestone</url>
  </プラグインリポジトリ>
 </プラグインリポジトリ>


 <ビルド>
  <プラグイン>
   <プラグイン>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <バージョン>3.2</バージョン>
    <構成>
     <compilerArgument>-パラメータ</compilerArgument>
     <ソース>1.8</ソース>
     <target>1.8</target>
     <encoding>UTF-8</encoding>
    </構成>
   </プラグイン>
   <プラグイン>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <バージョン>2.18.1</バージョン>
    <構成>
     <skipTests> 真</skipTests>
    </構成>
   </プラグイン>

   <プラグイン>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <バージョン>2.6</バージョン>
    <構成>
     <encoding>UTF-8</encoding>
    </構成>
   </プラグイン>
   <プラグイン>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <!--<バージョン>${spring.boot.version}</バージョン>-->
    <構成>
     <mainClass>cn.com.SpringBootWebアプリケーション</mainClass>
     <layout>郵便番号</layout>
    </構成>
    <処刑>
     <実行>
      <目標>
       <目標>
        再パッケージ
       </目標>
      </目標>
     </実行>
    </処刑>
   </プラグイン>
  </プラグイン>
 </ビルド>

 <プロフィール>
  <プロフィール>
   <id>JDK1.8</id>
   <アクティベーション>
    <activeByDefault> 真</activeByDefault>
   </アクティベーション>
   <プロパティ>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <encoding>UTF-8</encoding>
   </プロパティ>
  </プロフィール>
 </プロフィール>
</プロジェクト>

ここでは、いくつかのウェアハウス アドレスが提供されています。その理由は、この記事で Springboot アプリケーションを Docker に入れるときに、ソース コードを直接入れ、コンパイルしてパッケージ化して実行するためです。jar パッケージをダウンロードするためにウェアハウス アドレスが提供されていない場合、依存関係は中央ウェアハウスからプルされますが、これは非常に遅くなり、プル タイムアウトが発生し、アプリケーションが使用できなくなります。そのため、依存関係をダウンロードするために、他のいくつかのウェアハウス アドレスが提供されています。また、ここにはプラグインがあります。このプラグインを使用すると、mvn spring-boot:run の形式でアプリケーションを直接実行できるため、java -jar xxx.jar を使用してアプリケーションを実行することはしませんでした。

アプリケーションとコントローラー

この SpringBoot アプリケーションは非常にシンプルで、次のように Hello World に似たインターフェースを備えたシンプルなコントローラーを提供します。

パッケージ cn.com.controllers;

org.springframework.web.bind.annotation.RequestMapping をインポートします。
org.springframework.web.bind.annotation.RestController をインポートします。

java.util.HashMap をインポートします。
java.util.Map をインポートします。

/**
 * xiaxuan によって 16/11/27 に作成されました。
 */
@レストコントローラ
パブリッククラス IndexController {

  @RequestMapping(値 = "/index", 結果 = "application/json;charset=utf-8")
  パブリックオブジェクトインデックス() {
    Map<String, Object> 結果 = 新しい HashMap<String, Object>();
    result.put("msg", "hello world");
    結果を返します。
  }
}

シンプルなhelloworldメソッドを提供します。

以下はアプリケーションの起動クラスです。

パッケージcn.com;

org.springframework.boot.SpringApplication をインポートします。
org.springframework.boot.autoconfigure.SpringBootApplication をインポートします。

/**
 * xiaxuan によって 16/11/27 に作成されました。
 */
@SpringBootアプリケーション
パブリッククラスSpringBootWebApplication {

  パブリック静的voidメイン(String[] args) {
    SpringApplication.run(SpringBootWebApplication.class、引数);
  }
}

通常の Spring Boot の起動では、非常に簡単です。SpringBootWebApplication 起動クラスを起動するだけです。ただし、Docker コンテナで実行すると、それほど簡単ではありません。以下の Dockerfile ファイルをご覧ください。

Dockerファイル

Dockerfile ファイルも次のように比較的シンプルです。

# ベースイメージ
java:8より

# メンテナー
メンテナー bingwenwuhen [email protected]

# パッケージを更新し、Maven をインストールします

走る \
 エクスポート DEBIAN_FRONTEND=非対話型 && \
 sed -i 's/# \(.*multiverse$\)/\1/g' /etc/apt/sources.list && \
 apt-get update && \
 apt-get -y アップグレード && \
 apt-get install -y vim wget curl maven

# ボリュームをアタッチする
巻 /vol/開発


# 作業ディレクトリを作成
mkdir -p /vol/development を実行します。
mkdir -p /vol/development/src を実行します。
ワークディレクトリ /vol/development

コピー ./src /vol/development/src/
コピー ./pom.xml /vol/development/

# maven 実行
CMD ["mvn", "clean", "install", "spring-boot:run"]

dockerfile は java8 をベースイメージとして使用し、ベースイメージに Maven を別途インストールする必要があります。dockerfile ファイルでは、ソースコード全体がイメージに入力され、ここでは生成された jar のみがイメージに入力されないためです。したがって、これは、pom.xml でウェアハウスを指定する必要があることを前に述べたことです。ウェアハウスが指定されていない場合、イメージ内の依存関係をプルするときに、依存関係は中央ウェアハウスからプルされるため、非常に遅くなります。以前に何度か試しましたが、基本的なプルプロセスがタイムアウトして失敗したため、ここでウェアハウスを指定して依存関係をプルします。

イメージを構築する

次に、ディレクトリ内でコマンドdocker build -t="bingwenwuhen/springboot01" .次のようにイメージをビルドします。

ミラーリング後、実行
docker run -d --name springboot01 -p 8080:8080 bingwenwuhe/spingboot01
上記のコマンドは、イメージを実行するためのコンテナを生成し、ポート 8080 と名前 springboot01 をマッピングします。

次に、 docker logs xxxxxコンテナ ログを表示します。

コンテナが実行中です。

リクエストインターフェース

インターフェースを要求する前に、Docker 仮想マシンの IP アドレスを確認する必要があります。このマシンの IP アドレスは 192.168.99.100 です。インターフェースを要求するコマンドは次のとおりです。

カール http://192.168.99.100:8080/index

応答は次のとおりです。

{
  "メッセージ":"こんにちは世界"
}

リクエストは成功しました。Springboot アプリケーションは Docker で正常に実行されました。

質問

  • ソースコードをイメージに入れて mvn clean install をコンパイルして実行すると、jar パッケージが大量にダウンロードされ、待ち時間が長くなりすぎて中断が発生しやすくなります。そのため、この操作方法は推奨されません。
  • 本質的にはソース コードをイメージに含める必要はなく、実行中の jar パッケージのみをイメージに含める必要があります。

ソースコード

ソースコードをgithubにアップロードしましたので、必要な場合はダウンロードできます。

ソースコードのダウンロード

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • dockercompose を使用して springboot-mysql-nginx アプリケーションをビルドする
  • DockerへのSpring Bootアプリケーション公開の実装
  • Spring Boot アプリケーションを Docker 化する詳細な手順
  • Dockerコンテナ化されたSpring Bootアプリケーションの詳細な説明
  • Docker を使用して Spring Boot アプリケーションをデプロイする例
  • Spring BootアプリケーションはDockerを使用してプロセスを構築、実行、リリースします。
  • Docker を使用して Spring Boot Maven アプリケーションをデプロイする方法
  • DockerコンテナでSpring Bootアプリケーションを実行する方法の詳細な説明

<<:  vuex で履歴を実装するためのサンプルコード

>>:  Spark RDD をデータフレームに変換し、それを MySQL に書き込む例

推薦する

アイデアがWebプロジェクトを公開した後、Tomcatサーバーがプロジェクトとそのソリューションを見つけることができません

概要プロジェクトは正常に作成され、正常にデプロイされましたが、以下に示すように、Tomcat サーバ...

Vue+tsx のスロット使用の問題が置き換えられない

目次序文問題を見つける解決する追記序文最近、 UIコンポーネントを作成する予定で、 vue 2.xと...

JavaScriptにおけるPromiseの使い方と注意点について(推奨)

1. 約束の説明Promise は、非同期操作の最終状態 (失敗または正常完了) とその結果の値を...

MySQLシリーズ15 MySQL共通設定とパフォーマンスストレステスト

1. 一般的なMySQLの設定以下のすべての構成パラメータは、32G のメモリを搭載したサーバーに基...

ApacheとTomcatによるクラスタ環境構築プロセスの分析

実際、Apacheクラスタを構築するのは難しくありません。私もインターネットで情報を見つけて自分で設...

ウェブページをデザインするには?ウェブページを作成するには?

Web デザインの理解に関しては、多くの人がまだ Web ページ制作のレベルにとどまっているようで...

Tomcatのサーバーオプションの詳細な説明

1. 構成デフォルトでは、最初の 2 つはチェックされていないので、チェックする必要があります。 (...

CSS3を使用してプログレスバー効果を実現し、動的にパーセンテージを追加する

プロジェクト中、プログレスバーを実装するために js の requestAnimationFrame...

ボックスモデルのサイズの詳細な説明は、パディング、マージン、境界の値によって異なります。

ボックス モデルは、要素ボックスの幅と高さ、パディング、境界線、余白のサイズを指定します。境界線の内...

CSSは、入力ボックスのフローティングテキスト効果を実現するために、placeholder-shown疑似クラスを使用します。

この記事では、:placeholder-shown 疑似クラスを使用して、純粋な CSS で浮動疑問...

MYSQL での Truncate の使用法の詳細な説明

この記事のガイド: テーブル内のデータを削除するには、削除と切り捨ての 2 つの方法があります。TR...

簡単な手順で純粋な CSS3 で 3D 反転効果を実現

フロントエンド開発者の必須科目であるCSS3は、多くの基本的なアニメーション効果を実現するのに役立ち...

XHTML におけるタイトルタグと段落タグの使用に関する詳細な説明

XHTML 見出しの概要Word 文書を作成するときは、「第 1 章」、「1.2.1」などのタイトル...

CSS3で実装された炎のアニメーション

成果を達成する実装コードhtml <div class="コンテナ">...

Ubuntu 20.04 に Python 3 仮想環境をインストールする詳細なチュートリアル

以下はすべて仮想マシン上で実行されます1. pip3をインストールするsudo apt で pyth...