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

推薦する

Linuxにおけるselinuxの基本設定チュートリアルの詳細な説明

selinux ( Security-Enhanced Linux)は、Linux カーネル モジュ...

問題におけるJS演算子の調査

問題は、誰もが「メモリ リーク」について知っていることです。一般的なシナリオはいくつかあります。クロ...

Web Storage APIの使用に関する簡単な説明

目次1. ブラウザのローカルストレージ技術1.1、セッションストレージ1.2、ローカルストレージ2....

Dockerコンテナでアプリケーションサービスを自動的に起動する方法の例

コンテナの起動時に Docker コンテナ内のアプリケーション サービスを自動的に起動する場合。 D...

JS にこれがあるのはなぜですか?

目次1. 需要2. 解決策3. 最初の改善4.砂糖を加える5. 理解不能6. 問題点7. オブジェク...

CSS3 でクールなスライス画像カルーセル効果を実現

今日は、CSS を使用してクールな画像カルーセル コンポーネントを作成する方法を学びます。その原理は...

CSS を使用して要素のスクロールバーを非表示にするサンプルコード

どの要素でもスクロールできるようにしながら、スクロールバーを非表示にするにはどうすればよいでしょうか...

Windows での MySQL のダウンロード、インストール、設定、使用に関するチュートリアル

MySQLの概要MySQL はリレーショナル データベース管理システムです。データベースは構造化され...

GZIP 圧縮 Tomcat と Web パフォーマンスの改善プロセス図

1. はじめに最近、あるプロジェクトに取り組んでいたのですが、サーバーからクライアントに返される J...

nginx をプロキシ キャッシュとして使用する方法

キャッシュを使用する目的は、バックエンドの負荷を軽減し、Web サイトの同時実行性を向上させることで...

Linux で SVN サーバーをインストールする方法

1. Yumのインストール yum でサブバージョンをインストール 2. 構成1. 倉庫を作る/ho...

CSS レスポンシブ レイアウト システムの例コード

レスポンシブ レイアウト システムは、今日の一般的な CSS フレームワークではすでに非常に一般的で...

HTML における <meta> タグの使用に関する詳細な説明

私たちが作成する Web ページでは、より多くの人々に訪問してもらいたい場合、検索エンジンを使用して...

HTMLからPDFへのスクリーンショット保存機能の実装

テクノロジーの活用itext.jar: バイト ファイル入力ストリームを画像、PDF などに変換しま...

純粋な CSS でマークダウンの自動番号付けを実装するサンプル コード

問題の起源私がタイトルの番号付けの問題に初めて注目したのは、学部の論文を書いていた頃まで遡ります。当...