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モバイル端末に最適な適応ソリューションについての簡単な説明

序文: 最近の医療モバイル プロジェクトに基づいて、Vue はさまざまな画面のさまざまな画面サイズに...

CSS疑似クラス名を数字で始めないでください

初心者が div+css を開発する場合、.ggg、#ccc などの形式の CSS 疑似クラス名を付...

MySQL での置換例の詳細な説明

MySQL での置換例の詳細な説明replace into は insert と似ていますが、rep...

Ubuntu 16.04 で Python 3 を使用して Django プロジェクトを作成し、実行する方法

ステップ1: Djangoプロジェクトを作成するターミナルを開き、書き込みたいプロジェクトのアドレス...

H5 WeChatパブリックアカウント認証を実装するための簡単な手順

序文昨日、h5 WeChat認証の実装が必要なプロジェクトがありました。したがって、この機能を完了す...

Linux システムを起動時に自動的にスクリプトを実行するように設定する方法の例

序文みなさんこんにちは。私は梁旭です。職場では、システムの起動後にスクリプトやサービスを自動的に開始...

MySQL マスタースレーブレプリケーションと読み取り書き込み分離の詳細な説明

記事マインドマップマスター/スレーブ レプリケーションと読み取り/書き込み分離を使用する理由は何です...

MySQL 文字セットの変更に関する実践的なチュートリアル

序文: MySQL では、システムが多くの文字セットをサポートしており、異なる文字セット間にはわずか...

最適なウェブページ幅とその互換性のある実装方法

1. Web ページをデザインするときに、幅を決定するのは非常に面倒な作業です。 jb51.net ...

Vue 父子価値移転、兄弟価値移転、子父価値移転の詳細な説明

目次1. 親コンポーネントが子コンポーネントに値を渡す1. 親コンポーネント.vue 2. サブコン...

Navicateを使用してAlibaba Cloud Server上のMySQLに接続する

1. まず、サーバーの mysql にアクセスして権限を変更します。 GRANT オプション付きで、...

CSS3 のディスプレイのグリッドレイアウトとフレックスレイアウトの詳細な説明

Gird レイアウトは Flex レイアウトといくつかの類似点があり、どちらもコンテナーの内部項目を...

MySql における特殊演算子の使用の概要

序文MySQL には次の 4 種類の演算子があります。算術演算子比較演算子論理演算子ビット演算子これ...

Dockerコンテナとホストマシン間の8時間の差の問題を解決する

デプロイに docker-compose を使用すると、出力ログと関連イベントが検証されて出力される...