Docker で Spring-boot プロジェクトをデプロイするためのサンプル コード

Docker で Spring-boot プロジェクトをデプロイするためのサンプル コード

1. 基本的な Spring-boot クイックスタート

1.1 クイックスタート pom.xml は以下の依存関係を追加します

<親>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <バージョン>2.0.5.RELEASE</バージョン>
  </親>

  <プロパティ>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </プロパティ>

  <依存関係>
    <依存関係>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </依存関係>
    <依存関係>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>テスト</scope>
    </依存関係>
  </依存関係>

  <ビルド>
    <finalName>スプリングドッカー</finalName>
    <プラグイン>
      <プラグイン>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </プラグイン>
    </プラグイン>
  </ビルド>

Spring-boot スタートアップクラス

@SpringBootアプリケーション
パブリッククラスDockerApplication {

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

APIのテスト

@レストコントローラ
パブリッククラスDockerStarterApi {

  @GetMapping("/api/docker/hello")
  パブリック文字列hello() {
    「hello docker」を返します。
  }
}

起動設定ファイルapplication.ymlを構成する

サーバ:
 port: 9090 # 効果を示すために、デフォルトのポート8080をここで変更します

Spring Bootをチェック

. ____ _ __ _ _
 /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/ ___)| |_)| | | | | || (_| | ) ) ) )
 ' |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|================|___/=/_/_/_/
 :: Spring Boot :: (v2.0.2.リリース)

...

2018-12-17 17:26:13.385 INFO 48740 --- [ main] osjeaAnnotationMBeanExporter: 起動時に JMX 公開用の Bean を登録しています
2018-12-17 17:26:13.448 INFO 48740 --- [ main] osbwembedded.tomcat.TomcatWebServer : Tomcat がポート 9090 (http) でコンテキスト パス '' で起動しました
2018-12-17 17:26:13.453 INFO 48740 --- [ main] pers.study.docker.DockerApplication: DockerApplication を 1.982 秒で開始しました (JVM は 2.602 秒実行中)

APIが有効かどうかを確認する

$ curl -XGET 'http://localhost:9090/api/docker/hello'
こんにちはドッカー

ブラウザチェック

http://localhost:9090/api/docker/hello

1.2 パッケージングと起動

プロジェクトパッケージ

上記の手順を完了したら、パッケージ化コマンドを実行します。

$ mvn clean -U -Dmaven.test.skip パッケージをコンパイル

上記の pom ファイルでfinalNameが定義されているため、コンパイルおよびパッケージ化後にtargetディレクトリにspring-docker.jarが生成されることがわかります。

<finalName>スプリングドッカー</finalName>

試運転

$ java -jar ターゲット/spring-docker.jar

何も問題がなければ(質問があればメッセージを残してください〜)、実行結果は上記と同じになり、APIが有効かどうかを確認します。

2. Dockerのクイックインストール

次にDockerを準備します

インストール

公式サイトからダウンロードしてインストールする

インストールの確認、ヘルプの表示

$ docker --version
Docker バージョン 18.06.0-ce、ビルド 0ffa825

$ docker --help
使用方法: docker [オプション] コマンド
コンテナ用の自己完結型ランタイム
...

ミラー加速

中国公式ミラー加速

3. Spring-boot + Dockerを構成する

pom.xmlにdockerプラグインを追加する

<プロパティ>
    <docker.image.prefix>スプリングブート</docker.image.prefix>
  </プロパティ>

  <ビルド>
    <プラグイン>
      <!-- Docker Maven プラグイン -->
      <プラグイン>
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <バージョン>1.0.0</バージョン>
        <構成>
          <イメージ名>${docker.image.prefix}/${project.build.finalName}</イメージ名>
          <dockerディレクトリ>src/main/docker</dockerディレクトリ>
          <リソース>
            <リソース>
              <ターゲットパス>/</ターゲットパス>
              <ディレクトリ>${project.build.directory}</ディレクトリ>
              <include>${project.build.finalName}.jar</include>
            </リソース>
          </リソース>
        </構成>
      </プラグイン>
    </プラグイン>
  </ビルド>

Dockerfileを作成する

上記のpom.xmlファイルの設定によると、 <dockerDirectory>src/main/docker</dockerDirectory> 、docker 設定ファイルのディレクトリはここに設定されているため、 src/mainの下に docker フォルダーを作成し、同時にDockerfileファイルを作成する必要があります。

ディレクトリ構造は次のとおりです。

Docker 構成ファイルの構造.png

Dockerfileを編集する

openjdk:8-jdk-alpine から
ボリューム /tmp
spring-docker.jar app.jar を追加します。
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

FROMは、イメージがJava 8に基づいていることを示します。

VOLUMEはマウントディレクトリを示します

ADDはパッケージ化されたファイルをコピーし、 app.jarに名前を変更します。

以下の公式ドキュメントによると、ENTRYPOINT は Tomcat の起動時間を短縮するために追加されたシステム プロパティです。

Spring Boot アプリケーションがデフォルトで Tomcat の作業ディレクトリを作成する場所が /tmp であるため、 /tmpを指すVOLUMEを追加しました。その結果、ホストの/var/lib/dockerの下に一時ファイルが作成され、 /tmpの下のコンテナーにリンクされます。この手順は、ここで作成した単純なアプリではオプションですが、ファイルシステムに実際に書き込む必要がある他の Spring Boot アプリケーションでは必須になる場合があります。

Tomcat の起動時間を短縮するために、エントロピーのソースとして「/dev/urandom」を指すシステム プロパティを追加しました。Tomcat の「標準」バージョン (またはその他の Web サーバー) を使用する場合、Spring Boot の最新バージョンではこれは必要ありません。

設定が完了しました!

4. DockerがSpring-bootを起動する

moduleに入り、実行します:

$ mvn パッケージ docker:build

[INFO] プロジェクトをスキャンしています...

...

 ---> e1f8aba72bdf で実行中
中間コンテナ e1f8aba72bdf を削除しています
 ---> 36a61c09f09a
進捗メッセージ{id=null、ステータス=null、ストリーム=null、エラー=null、進捗=null、進捗詳細=null}
36a61c09f09a の構築に成功しました
springboot/spring-docker:latest のタグ付けに成功しました
[INFO] springboot/spring-docker をビルドしました
[情報]  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
[情報] ビルド成功
[情報]  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
[情報] 合計時間: 6.367 秒
[情報] 終了日時: 2018-12-17T20:48:21+08:00
[情報]  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 

ミラーを見る

$ docker イメージ
リポジトリ タグ イメージ ID 作成 サイズ
springboot/spring-docker 最新 36a61c09f09a 2 分前 123MB

画像を実行する

$ docker run -p 9090:9090 -t springboot/spring-docker
 . ____ _ __ _ _
 /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/ ___)| |_)| | | | | || (_| | ) ) ) )
 ' |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|================|___/=/_/_/_/
 :: Spring Boot :: (v2.0.2.リリース)

2018-12-17 12:53:21.502 INFO 1 --- [ main] pers.study.docker.DockerApplication : PID 1 の 94991c04be5d で DockerApplication v1.0-SNAPSHOT を開始しています (/app.jar は / で root によって開始されました)
2018-12-17 12:53:21.509 INFO 1 --- [ main] pers.study.docker.DockerApplication: アクティブなプロファイルが設定されていません。デフォルトのプロファイルにフォールバックします: default

···

2018-12-17 12:53:25.255 INFO 1 --- [ main] osjeaAnnotationMBeanExporter : 起動時に JMX 公開用の Bean を登録しています
2018-12-17 12:53:25.337 INFO 1 --- [ main] osbwembedded.tomcat.TomcatWebServer : Tomcat がポート 9090 (http) でコンテキスト パス '' で起動しました
2018-12-17 12:53:25.353 INFO 1 --- [ main] pers.study.docker.DockerApplication: DockerApplication を 4.485 秒で起動しました (JVM は 5.346 秒実行中)

コンテナを表示

$ docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
94991c04be5d springboot/spring-docker "java -Djava.securit…" 53 秒前 52 秒前 0.0.0.0:9090->9090/tcp quizzical_bhabha

起動の確認とAPIへのアクセス

$ curl -XGET 'http://localhost:9090/api/docker/hello'
こんにちはドッカー

この時点で、spring-boot の Docker デプロイは完了です。

5. 画像を削除する

コンテナを停止する

$ docker stop 94991c04be5d
94991c04be5d

コンテナの削除

$ docker rm 94991c04be5d
94991c04be5d

画像の削除

$ docker イメージ rm springboot/spring-docker
タグなし: springboot/spring-docker:latest
削除済み: sha256:36a61c09f09ab88cfe5a05f564deb57498682f4a6f3ec01d2a8c4fdc80ac1e41
削除済み: sha256:3f9aef70be6d4d43c205454d8874f10bc2f7280f70eb88cd1f04937b7965dd27
削除済み: sha256:9a5800e93615bb4c5128bb36d31ec494327c01f1a9a768c1ff538badf76628b9
削除済み: sha256:d9c66f907448fa9e61fd5f9267d7fcf8e1f4b52d0a20466414f2f45777261284

6. その他の設定機能

環境プロパティの追加

$ docker run -e "SPRING_PROFILES_ACTIVE=prod" -p 9090:9090 -t springboot/spring-docker

バックグラウンドで実行を開始する

$ docker run -p 9090:9090 -d springboot/spring-docker

コンテナのデバッグを有効にし、 Dockerfileを変更する

openjdk:8-jdk-alpine から
ボリューム /tmp
spring-docker.jar app.jar を追加します。
環境変数JAVA_OPTS''
CMD java -Djava.security.egd=file:/dev/./urandom $JAVA_OPTS -jar app.jar

ドッカー実行

次のようにコードをコピーします
$ docker run -e "JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n" -p 9090:9090 -p 5005:5005 -t springboot/spring-docker

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

以下もご興味があるかもしれません:
  • Docker デプロイメント Springboot プロジェクト例の分析
  • Docker を使用してプロジェクトを迅速にデプロイするための Spring Boot の手順を完了します。
  • Idea による Springboot の Docker への Java リモート ワンクリック デプロイ
  • SpringbootはDockerデプロイメントを統合し、Dockerイメージを構築する2つの方法を実装します。
  • Springbootプロジェクトでwarパッケージdockerパッケージをビルドし、リソースの下に静的リソースが見つからない場合の解決策
  • DockerへのSpring Bootアプリケーション公開の実装
  • Spring Boot と Docker のデプロイメントの実践
  • Springboot dockerの原理とプロジェクト構築

<<:  Vue+nodeはオーディオ録音・再生機能を実現

>>:  MySQLのパスワードを忘れた場合の対処方法

推薦する

MySQLデータベースでゼロ値を含む日付の問題について簡単に説明します

デフォルトでは、MySQL は日付に 0 値を挿入することを受け入れますが、実際には日付の 0 値に...

CentOS7でパーティションのサイズを変更する方法

昨日、ある人のシステムのインストールを手伝ったのですが、自動パーティション分割をクリックするのを忘れ...

MySQL公式エクスポートツールmysqlpumpの使用

目次導入説明書実際の経験長所と短所総括する導入mysqlpump は mysqldump の派生です...

Vue プロジェクトで垂直テーブルを 2 つの方法で実装するアイデアの分析

問題の説明私たちのプロジェクトでは、水平方向のテーブルが一般的ですが、必要に応じて垂直方向のテーブル...

WeChatアプレットは写真の撮影とアルバムからの写真の選択を実現します

この記事では、WeChatアプレットで写真を撮ったり、アルバムから写真を選択したりするための具体的な...

Oracle の MySQL バージョンでユーザー Scott のテーブル ステートメントを作成する例

概要: Oracle scottユーザーには4つのテーブルがあり、実験やデータ検証に便利です。現在は...

ユーザーのニーズがマーケティング指向のデザインにつながる

<br />それぞれのトピックについて、チーム内でメールで議論します。議論が白熱するにつ...

IE6/IE7/IE8/IE9/FF 向け CSS ハック (概要)

IE8.0の正式版をインストールしたので、基本的なCSS HACKをいくつかまとめてみました。We...

nodejs で worker_threads を使用して新しいスレッドを作成する方法

導入前の記事で述べたように、NodeJS には 2 種類のスレッドがあります。1 つは、ユーザー リ...

JavaScriptはスクロールバーの位置を取得し、ページをアンカーポイントまでスライドします。

序文この記事は、私が最近仕事で遭遇した問題を記録したものです。アプリネイティブとフロントエンドのh5...

ES6スプレッド演算子の使用例

目次スプレッド演算子とレスト演算子とは何ですか?配列スプレッド演算子残り演算子(コレクション関数)ス...

Windows で Nginx を使用して https サーバーとリバース プロキシを構成する際の問題

リクエストロジックフロントエンド --> https経由でnginxをリクエストnginx -...

CentOS 7 で Python を 3.6.6 にアップグレードした後に発生する yum エラー問題の解決方法の概要

最近、テスト サーバーのオペレーティング システムを Cent0S 7.5 にアップグレードし、Py...

シェルスクリプトを使用したMySQLデータベースの自動バックアップ

シェルスクリプトを使用したMySQLデータベースの自動バックアップデータベースを頻繁にバックアップす...

Springboot および Vue プロジェクトの Docker デプロイメントの実装手順

目次A. SpringbootプロジェクトのDockerデプロイメント1. Springbootプロ...