Docker 経由で Spring Boot アプリケーションを公開およびデプロイするプロセスの分析

Docker 経由で Spring Boot アプリケーションを公開およびデプロイするプロセスの分析

Spring BootプロジェクトをDockerにデプロイする方法は、手動デプロイとプラグインデプロイの2つがあります。

手動展開

1.アイデアを使ってSpring Bootプロジェクトを作成する

pom.xml ファイル

<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<プロジェクト 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">
    <親>
        <artifactId>spring-cloud-examples</artifactId>
        <グループID>org.example</グループID>
        <バージョン>1.0-SNAPSHOT</バージョン>
    </親>
    <モデルバージョン>4.0.0</モデルバージョン>

    <artifactId>Dockerデモ</artifactId>

    <依存関係>
        <依存関係>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </依存関係>
    </依存関係>

    <ビルド>
        <プラグイン>
            <プラグイン>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </プラグイン>
        </プラグイン>
    </ビルド>

</プロジェクト>

spring-boot-maven-pluginプラグインを追加する必要があります。このプラグインの機能は、Jar パッケージをパッケージ化するときに依存パッケージを導入することです。パッケージ化のために「mvn package」を実行すると、直接実行できる JAR ファイルにパッケージ化されます。「java -jar」コマンドを使用して直接実行できます。

スタートアップクラス

パッケージ dockerdemo;

org.springframework.boot.SpringApplication をインポートします。
org.springframework.boot.autoconfigure.SpringBootApplication をインポートします。
org.springframework.web.bind.annotation.RequestMapping をインポートします。
org.springframework.web.bind.annotation.RestController をインポートします。

@レストコントローラ
@SpringBootアプリケーション
パブリッククラスアプリケーション{
    パブリック静的voidメイン(String[] args) {
        SpringApplication.run(Application.class、引数);
    }

    @RequestMapping("/hello")
    パブリック文字列hello(){
        「Hello Docker World!」を返します。
    }
}

2. プロジェクトをJarにパッケージ化する

次に、プロジェクトの pom.xml ファイルがあるディレクトリで Maven コマンドを実行し、プロジェクトを Jar パッケージにパッケージ化します。

$ mvn パッケージ

出力ログから、Jar がターゲット ディレクトリにあることがわかります。Jar パッケージを直接実行します。

$ java -jar DockerDemo-1.0-SNAPSHOT.jar

次にブラウザにhttp://localhost:8080/helloと入力してテストします。

ここに画像の説明を挿入

3. Dockerイメージをビルドする

Dockerfileを作成する

java:8より
ボリューム /tmp
DockerDemo-1.0-SNAPSHOT.jar DockerDemo.jar を追加します。
bash -c "touch /DockerDemo.jar" を実行します。
エントリポイント ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/DockerDemo.jar"]

パラメータの説明:

  • FROM: DockerイメージがJDK8に基づいて作成されていることを示します
  • VOLUME: はマウント ポイントの作成を意味し、コンテナー ディレクトリは /tmp になり、ホスト ディレクトリは自動的に生成されます。 Spring Boot に組み込まれた Tomcat コンテナはデフォルトで /tmp を作業ディレクトリとして使用するため、/tmp が作成されます。
  • 追加: コンテナ外の DockerDemo-1.0-SNAPSHOT.jar をコンテナにコピーし、名前を DockerDemo.jar に変更します。
  • RUN: RUN の後に bash コマンドが続き、-c はその後の文字列がコマンドとして実行されることを意味します。つまり、touch /DockerDemo.jar が実行されます。このコマンドは、DockerDemo.jar ファイルのアクセス時刻と変更時刻を現在の時刻に変更します。
  • ENTRYPOINT: コンテナの起動時に実行されるコマンド。コマンドラインで java -jar xxxx.jar と入力するのと同じです。Tomcat の起動時間を短縮するには、java.security.egd のシステム プロパティを追加して、ENTRYPOINT として /dev/urandom を指定します。

Dockerfile を作成したら、パッケージ化された Spring Boot プロジェクトの jar パッケージと Dockerfile ファイルを任意のディレクトリに配置し、docker コマンドを使用してイメージ ファイルをビルドします。

$ docker イメージをビルド -t DockerDemo:1 。

パラメータの説明:

  • 構築: 鏡を作ることを意味する
  • -t: イメージにラベルを付けることを意味します。これは docker tag イメージ ID と同等です。新しいイメージ名: バージョン番号
  • .: はDockerfileファイルの場所を示し、. は現在のディレクトリを示します。

4. イメージを表示して実行する

#画像を表示:
$ docker イメージ
#イメージを実行します:
$ docker コンテナ実行 --name DockerDemo -d -p 80:8080 DockerDemo:1

パラメータの説明:

  • docker container run: コンテナを実行することを意味します
  • –name: コンテナに別名を付けます。コンテナを操作するときに、コンテナIDの代わりに別名を使用すると、コンテナの管理が容易になります。
  • -d: コンテナが起動後にバックグラウンドで実行されることを示します
  • -p: ポートマッピング。コンテナ内のポート8080をホストのポート80にマッピングする

ここに画像の説明を挿入

プラグインの展開

プラグインをデプロイするには、プロジェクトの pom.xml ファイルにdockerfile-maven-pluginプラグインを追加します。

ドキュメント

<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<プロジェクト 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">
    <親>
        <artifactId>spring-cloud-docker</artifactId>
        <グループID>org.example</グループID>
        <バージョン>1.0-SNAPSHOT</バージョン>
    </親>
    <モデルバージョン>4.0.0</モデルバージョン>

    <artifactId>スプリングクラウドユーレカ</artifactId>

    <プロパティ>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <!-- イメージプレフィックス。リモートライブラリにイメージをプッシュするときに必要です。ここでは、Alibaba Cloud プライベートライブラリが構成されています。 -->
        <docker.image.prefix>
            レジストリ.cn-huhehaote.aliyuncs.com/monkeybrain
        </docker.image.prefix>
        <!-- docker イメージタグ -->
        <docker.tag>最新</docker.tag>

        <!-- アクティブ化されたプロフィール -->
        <!--<アクティブ化されたプロパティ></アクティブ化されたプロパティ>-->
    </プロパティ>

    <依存関係>
        <依存関係>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </依存関係>
    </依存関係>

    <プロフィール>
        <!-- Docker 環境 -->
        <!--<プロフィール>
            <id>ドッカー</id>

            <プロパティ>
                <activatedProperties>ドッカー</activatedProperties>
                <docker.tag>docker-demo-${プロジェクトバージョン}</docker.tag>
            </プロパティ>
        </プロフィール>-->
    </プロフィール>

    <ビルド>
        <!--デフォルトの Maven コマンド-->
        <defaultGoal>インストール</defaultGoal>
        <finalName>${プロジェクト.アーティファクトId}</finalName>

        <リソース>
            <リソース>
                <ディレクトリ>src/main/resources</ディレクトリ>
                <フィルタリング>真</フィルタリング>
            </リソース>
        </リソース>


        <プラグイン>
            <!-- Spring Boot Maven プラグインを設定して、プロジェクトを実行可能な jar パッケージにパッケージ化します -->
            <プラグイン>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <構成>
                    <実行可能ファイル> 真</実行可能ファイル>
                </構成>
            </プラグイン>

            <!-- パッケージ化時にユニットテストをスキップ -->
            <プラグイン>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <構成>
                    <skipTests> 真</skipTests>
                </構成>
            </プラグイン>

            <!-- docker maven プラグインを設定し、インストール ライフサイクルをバインドし、maven install の実行時に docker イメージを生成します -->
            <プラグイン>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <バージョン>0.4.13</バージョン>
                <!--<実行>
                    <実行>
                        <phase>インストール</phase>
                        <目標>
                            <goal>ビルド</goal>
                            <goal>タグ</goal>
                        </目標>
                    </実行>
                </実行>-->
                <構成>
                    <!-- ここで docker ノードの IP を変更するには、docker ノードのリモート管理ポート 2375 を開く必要があります。
                    具体的な設定については、Dockerのインストールと設定に関する前回の記事を参照してください-->
                    <dockerHost>http://localhost:2375</dockerHost>
                    <イメージ名>${docker.image.prefix}/${project.build.finalName}</イメージ名>
                    <serverId>aliyun-docker-registry</serverId>
                    <registryUrl>registry.cn-huhehaote.aliyuncs.com</registryUrl>
                    <pushImage>真</pushImage>
                    <!--ミラータグ-->
                    <画像タグ>
                        <imageTag>最新</imageTag>
                    </画像タグ>
                    <!--ベースイメージ-->
                    <baseImage>java:8</baseImage>
                    <!-- ここでの entryPoint は、コンテナの起動時に実行するコマンドを定義します。コンテナが起動すると、java -jar パッケージ名が実行されます-->
                    <エントリポイント>
                        ["java","-jar","/${project.build.finalName}.jar"]
                    </エントリポイント>
                    <リソース>
                        <リソース>
                            <ターゲットパス>/</ターゲットパス>
                            <ディレクトリ>${project.build.directory}</ディレクトリ>
                            <include>${project.build.finalName}.jar</include>
                        </リソース>
                    </リソース>

                    <!--<イメージ>${docker.image.prefix}/${project.build.finalName}</イメージ>
                    <新しい名前>${docker.image.prefix}/${project.build.finalName}:${docker.tag}</新しい名前>
                    <forceTags>true</forceTags>-->
                    <!-- イメージを生成するときにリモート ライブラリにプッシュする必要がある場合は、pushImage を true に設定します -->
                    <!--<pushImage>偽</pushImage>-->
                </構成>
            </プラグイン>
        </プラグイン>
    </ビルド>


</プロジェクト>

プッシュコマンドを実行する

$ mvn clean package docker:build -DpushImage

これで、Docker による Spring Boot アプリケーションのリリースとデプロイのプロセス分析に関するこの記事は終了です。Spring Boot アプリケーションの Docker デプロイに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker Compose は MySQL に接続するために SpringBoot プロジェクトをデプロイしますが、そこで遭遇する落とし穴があります。
  • Springboot の複数のデータ ソースが Docker と連携して、mysql マスター スレーブを展開し、読み取りと書き込みの分離効果を実現します。
  • Springboot および Vue プロジェクトの Docker デプロイメントの実装手順
  • SpringbootサービスDockerの自動デプロイを実装する方法
  • Springboot パッケージングを Docker イメージとして実装し、デプロイする

<<:  ウェブデザインのための6つのヒント

>>:  MySQL トランザクション分離はどのように実現されますか?

推薦する

Vue.jsは9グリッド画像表示モジュールを実装します

Vue.js を使用して、クリックしてズームできる 9 グリッドの画像表示モジュールを作成しました。...

JavaScriptで継承を実装するいくつかの方法

目次構造継承(callで実装)プロトタイプチェーン継承(プロトタイプチェーンの助けを借りて実装)複合...

Linuxカーネルスケジューラソースコード初期化の分析

目次1. はじめに2. スケジューラの基本概念2.1. 実行キュー (rq) 2.2 スケジューリン...

Vue ベースの要素ボタン権限実装ソリューション

背景要件: ERP システムに「ボタン権限制御」機能を追加する必要があり、権限の制御粒度をボタン レ...

MySQLは数百万のシミュレーションデータ操作コードを自動的に挿入します

私はデータベースツールとして Navicat を使用しています。他のものも同様です。 1. Navi...

MySQL は重複データを削除して最小の ID ソリューションを維持します

オンラインで検索して重複データを削除し、ID が最小のデータだけを残します。方法は次のとおりです。 ...

JavaScript ECharts の使用方法の説明

以前、プロジェクトを行う際に ECharts を使用しました。今日はそれをメモとして整理し、より多く...

SQLシリアル番号取得コード例

この記事は主にSQLシリアル番号取得コード例を紹介します。記事ではサンプルコードを詳細に紹介しており...

MySQLクエリステートメント内のユーザー変数のコード分析

前回の記事では、MySQL 最適化の概要 - クエリの合計数を紹介しました。この記事では、クエリ ス...

ブラウザ(IEシリーズ)を判別するための条件付きコメント

<!--[if IE 6]> IE6 のみが認識可能 <![endif]-->...

CentOS8.1 で Gitlab サーバーを構築するための詳細なチュートリアル

Gitlab と Github の違いについては、あまり説明する必要はありません。一言でまとめると、...

Linux は suid vim.basic ファイルを使用して権限昇格を実現します。

カリで再現まず、必要なvim.basicファイルにsuid権限を設定します。 chmod u+s /...

MySQLインスタンスクラッシュ事例の詳細な分析

[問題の説明]私たちの実稼働環境には、複数の MySQL サーバー (MySQL 5.6.21) の...

MySQL のテーブルリターンとインデックスカバレッジの例の詳細な説明

目次インデックスタイプインデックス構造非クラスター化インデックスクエリインデックスカバー要約するイン...

Linux で rpm パッケージを見つけるために CD をマウントする方法

前面に書かれたLinux を使用する際にソフトウェアをインストールする必要がある場合があります。もち...