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 に書き込む例

推薦する

Vueにおけるキーの役割と原理の詳細な説明

目次1. 結論から始めましょう2. キーの役割2.1 例2.2 上記の例を修正する2.3 例を再度修...

Kubernetes ポッドオーケストレーションとライフサイクルの詳細な説明

目次K8Sマスター基本アーキテクチャポッドオーケストレーションコンセプトPod オブジェクトのプロパ...

MySQL テーブルを返すとインデックスが無効になるケースの説明

導入MySQL InnoDB エンジンがレコードをクエリし、インデックス カバレッジを使用できない場...

私が良いと思うクールなデザインサイトをいくつかまとめてみました。

ウェブサイトをデザインするにはインスピレーションが必要です。良いインスピレーションを得るには、より多...

GET POSTの違い

1. Get はサーバーからデータを取得するために使用され、Post はサーバーにデータを渡すために...

jsでの位置計算を徹底的に理解するのに役立つ記事

目次導入スクロール要素.スクロール()要素.scrollHeight/scrollWidth要素.s...

Mysqlの日付と時刻関数を扱う記事

目次序文1. 現在の時刻を取得する1.1 現在の日付と時刻を返す1.2 現在の日付を取得する1.3 ...

JSで画面録画機能を作成する

OBS studioかっこいいですが、 JavaScriptもっとかっこいいです。では、 JavaS...

ウェブページ読み込み時に左右にジャンプする原因の分析と解決

最近、ウェブサイトを設計するときにこの問題に遭遇しています。メンバーセンターを設計し、コンテンツを ...

Docker での Redis の最も詳細なインストールと構成 (画像とテキスト付き)

1. Dockerに適したRedisのバージョンを見つけるdocker hubで見つけることができ...

HTML割引価格計算の実装原理とスクリプトコード

コードをコピーコードは次のとおりです。 <!DOCTYPE HTML PUBLIC "...

Hadoop 2.x と 3.x の 22 ポイントの比較、Hadoop 3.x の 2.x に対する改善点

質問ガイド1. Hadoop 3.x はどのようにして障害を許容するのでしょうか? 2. Hadoo...

イメージのアップロードとダウンロードに docker をプロキシするためのプライベート ライブラリとして nexus を使用する

1. Nexusの設定1. Dockerプロキシを作成する外部ネットワーク ウェアハウスからローカル...

Vueエンジニアがカプセル化しなければならない埋め込み命令の知識のまとめ

目次序文指導の基本フック機能フック関数のパラメータ文章使い方とアイデア成し遂げる汎用性を高める要約す...

ウェブ画像形式としてPNG、JPG、GIFを選択して使用する方法

では、GIF、PNG、JPG のどの形式を候補形式として選択すればよいのでしょうか。また、どの画像形...