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

推薦する

CSS スタイルの優先順位はどれくらい複雑ですか?

昨晩、面接の質問を見ていたら、CSS スタイルの優先順位について特に明確に説明していない人が何人かい...

JavaベースのMySQLバックアップテーブル操作

コアはmysqldumpとランタイムです操作は実際にはそれほど難しくありません。バックアップ操作を実...

2 つの MySQL ユーザー削除ステートメント (delete user と drop user) の違い

ヒント: MySQL では、ユーザーの作成と削除が頻繁に必要になります。ユーザーを作成するときは、通...

WeChat アプレットのカスタム タブバー コンポーネント

この記事では、WeChatアプレットのカスタムタブバーコンポーネントの具体的なコードを参考までに紹介...

MySQLコマンドが中国語で入力できない問題の解決方法

問題を見つける最近、MySQL コマンドを使用して MySQL サーバーに接続したときに、以下のよう...

Nginx メモリプールのソースコード分析

目次メモリプールの概要1. nginxデータ構造2. nginxはOSからスペースngx_creat...

Nginx/Httpd リバース プロキシ Tomcat 設定チュートリアル

以前のブログでは、Tomcatのサーバーの各コンポーネントの使用について学びました。 Tomcatは...

フローティングメニューを実装するjQueryプラグイン

毎日jQueryプラグインを学ぶ - フローティングメニュー、参考までに、具体的な内容は次のとおりで...

一般的な MySQL 関数の例の概要 [集計関数、文字列、数値、時刻と日付の処理など]

この記事では、よく使用される MySQL 関数について説明します。ご参考までに、詳細は以下の通りです...

MySQL 5.7.20 の解凍バージョンをインストールするための詳細な手順 (2 つの方法)

Windows 64ビットでのMySQLのインストールについて説明します。5.7以降、MySQLの...

docker で zabbix_agent をデプロイする方法

zabbix_agent のデプロイメント:推奨事項: zabbix_agent は docker-...

CSS スタイルの導入方法とその長所と短所の紹介

CSSを導入する3つの方法1. インラインスタイル利点: 書きやすく、重みがある 欠点: 構造とスタ...

CentOS に Docker をインストールし、Springboot で Docker をリモート公開する方法

目次1. CentOS7.0へのJDK1.8のインストール2. Dockerのインストール3.Doc...

MySQL データベース インデックスの面接の質問 (基本的なプログラマー スキル)

目次導入インデックスの原則1. データページ2. ページディレクトリ3. インデックス原則分析要約す...