Spring Boot のパッケージ化と Docker リポジトリへのアップロードの詳細な手順

Spring Boot のパッケージ化と Docker リポジトリへのアップロードの詳細な手順

重要な注意: この記事を読む前に、Docker コンテナに関する知識と、一般的な Docker 操作コマンドを理解して使いこなせる能力が必要です。すでに Docker コンテナに関する知識がある場合は、始めましょう。

タイトルで説明した機能を実行するための一般的な手順は次のとおりです。

Dockerイメージリポジトリを構築する

Spring Boot 構成ファイルを変更して、Docker リポジトリ構成、パッケージを追加し、Docker イメージ リポジトリにアップロードします。

アップロードしたイメージファイルを自分のDockerイメージリポジトリから取得して実行します。

ステップ1: プライベートDockerイメージリポジトリを構築する

Docker イメージ リポジトリを構築するには、docker-registry ツールを使用する必要があります。Docker-registry は、プライベート イメージ リポジトリを構築するために使用できる公式ツールです。この記事は公式の docker-registry v2.x バージョンに基づいています: https://docs.docker.com/registry/

1. レジストリイメージファイルを取得する

docker プルレジストリ

2. 画像を開始する

$ docker run -d \
    -p 5000:5000 \
    -v /opt/data/registry:/var/lib/registry \
    レジストリ

-d: デーモンスレッドの開始
-p: ポートマッピング ホストポート: コンテナポート
-v: データ ボリュームは、コンテナー内のアドレス ディレクトリをホストにマップします。/opt/data/registry は、ホスト内のイメージ プライベート ウェアハウスが保存される場所です。
レジストリはイメージ名です

3. daemon.jsonファイルとウェアハウス設定を追加する

:vim /etc/docker/daemon.json を実行します。

次の構成を追加します。

{
  「レジストリミラー」: [
    「https://registry.docker-cn.com」
  ]、
  「安全でないレジストリ」: [
    "yourip:5000"
  ]
}

元のdaemon.jsonファイルにinsecure-registriesノード構成を追加します。 yourip: 仮想マシンのIPを入力し、保存して終了し、構成ファイルを再読み込みしてdockerを再起動します。

systemctlデーモンリロード
systemctl dockerを再起動します

4. イメージを自分のイメージリポジトリにアップロードしてテストします。docker tag コマンドを使用してイメージにタグを付け、リポジトリにアップロードします: docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]

docker タグ ubuntu:latest 127.0.0.1:5000/ubuntu:latest

(ここでテスト用にアップロードした画像は、記事のものと同じである必要はありません。Tomcatイメージを取得してアップロードすることもできます。)この時点でマークされた画像が生成されます。

dockerイメージls
リポジトリ タグ イメージ ID 作成 仮想サイズ
ubuntu 最新 ba5877dc9bec 6 週間前 192.7 MB
127.0.0.1:5000/ubuntu:latest 最新 ba5877dc9bec 6 週間前 192.7 MB

プライベートリポジトリにプッシュ

docker push 127.0.0.1:5000/ubuntu:最新

プライベートウェアハウスのイメージを表示します(実際にはウェアハウス起動時にマウントされたディレクトリに移動できます。この記事では、ホストマシンの /opt/data/registry ディレクトリにアップロードされたイメージファイルを表示できます)

カール 127.0.0.1:5000/v2/_catalog

プライベートリポジトリイメージをプルダウンする

docker pull 127.0.0.1:5000/ubuntu:最新

プルに問題がなければ、ミラーリポジトリが構築されたことを意味します。

ステップ2 SpringBoot構成ファイルを変更して、Dockerリポジトリ構成、パッケージを追加し、Dockerイメージリポジトリにアップロードします。

SpringBoot プロジェクトを構成する前に、jar パッケージをウェアハウスにアップロードするように Docker コンテナを構成する必要があります。

docker リモート API を開き、ファイルを変更します。

vim /lib/systemd/system/docker.service

オリジナルの ExecStart: ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

**-H tcp://0.0.0.0:2375** を追加します。

変更後: ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock

(Alibaba Cloud Server を使用している場合は、アクセス ルールでポート 2375 を開くことを忘れないでください)

保存して終了し、設定を再読み込みしてDockerを起動します。

systemctlデーモンリロード 
systemctl dockerを再起動します

設定が成功したかどうかを確認します。

docker -H 127.0.0.1 情報

次の出力は構成が成功したことを示します。

クライアント:
デバッグモード: false

サーバ:
コンテナ: 5
ランニング: 1
一時停止: 0
停止: 4
画像: 6
サーバーバージョン: 19.03.3
ストレージ ドライバー: overlay2
.......

Springbootプロジェクトを設定し、次のようにパッケージ設定をpomファイルに追加します。

<プラグイン>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <バージョン>1.1.0</バージョン>
    <処刑>
        <実行>
            <id>ビルドイメージ</id>
            <phase>パッケージ</phase>
            <目標>
                <goal>ビルド</goal>
            </目標>
        </実行>
    </処刑>
    <構成>
        <イメージ名>jenkins_test/${project.artifactId}:${project.version}}</イメージ名>
        <dockerHost>http://yourip:2375</dockerHost>
        <baseImage>java:8</baseImage>
        <entryPoint>["java", "-jar","/${project.build.finalName}.jar"]
        </エントリポイント>
        <リソース>
            <リソース>
                <ターゲットパス>/</ターゲットパス>
                <ディレクトリ>${project.build.directory}</ディレクトリ>
                <include>${project.build.finalName}.jar</include>
            </リソース>
        </リソース>
    </構成>
</プラグイン>
  • executes.execution.phase: Maven がアプリケーションをパッケージ化するときに Docker イメージが構築される場所です。
  • imageName: イメージ名を指定するために使用します。jenkins_test はウェアハウス名、{project.version} はイメージのバージョン番号です。
  • dockerHost: パッケージがアップロードされる Docker サーバーのアドレス。
  • baseImage: アプリケーションが依存するベースイメージ。ここでは java です。
  • entryPoint: Docker コンテナの起動時に実行されるコマンド。
  • resources.resource.targetPath: パッケージ化されたリソース ファイルをこのディレクトリにコピーします。
  • resources.resource.directory: コピーするファイルが配置されているディレクトリ。Maven によってパッケージ化されたアプリケーション jar パッケージは、ターゲット ディレクトリに保存されます。
  • resources.resource.include: コピーする必要があるファイル、パッケージ化されたアプリケーション jar パッケージ。

上記の内容を設定したら、パッケージ化できます(通常のspringboot mavenパッケージ化、またはidea mavenprojectインストール)

パッケージ化が正常に完了したら、Dockerコンテナに戻ってイメージウェアハウスを確認します。

カール 127.0.0.1:5000/v2/_catalog

存在を確認したら、アップロードした画像をプルダウンし、プルが成功したら画像リストを確認します

Docker イメージ

次のように表示します:

これは、この一連の操作が成功したことを意味します。Docker は java:8 ベース イメージをプルする必要があるため、最初のパッケージ化は遅くなる可能性があります。

この画像から始めましょう。

docker run -p 8080:8080 イメージID

-p: ポートマッピング

起動は以下のように成功します。

springboot プロジェクトの application.yml ファイルで設定されている server.port は 8080 であるため、起動時に 8080:8080 をマッピングする必要があります。最初の 8080 はホスト マシンのポートであり、2 番目の 8080 はコンテナーのポートです。

これまでのところ、この記事で実装する必要のあるものはすべて実装されています。イースターエッグをさらに知りたい場合は、読み続けてください。 ! ! !

springbootプロジェクトには次のようなログ設定があります

<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<構成デバッグ="false">
    <!-- ログ ファイルの保存アドレスを定義します。LogBack 構成では相対パスを使用しないでください。-->
    <プロパティ名="LOG_HOME" 値="/home/logs" />
    <!-- コンソール出力 -->
    <アペンダー名="STDOUT" クラス="ch.qos.logback.core.ConsoleAppender">
        <エンコーダークラス="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- フォーマットされた出力: %d は日付、%thread はスレッド名、%-5level: レベルは左から 5 文字分表示されます、%msg: ログ メッセージ、%n は改行です -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </エンコーダ>
    </アペンダー>
    <!-- 毎日ログファイルを生成します -->
    <アペンダー名="FILE" クラス="ch.qos.logback.core.rolling.RollingFileAppender">
        <ローリングポリシークラス="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--ログファイル出力ファイル名-->
            <ファイル名パターン>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</ファイル名パターン>
            <!--ログファイルの保存日数-->
            <MaxHistory>30</MaxHistory>
        </ローリングポリシー>
        <エンコーダークラス="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- フォーマットされた出力: %d は日付、%thread はスレッド名、%-5level: レベルは左から 5 文字分表示されます、%msg: ログ メッセージ、%n は改行です -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </エンコーダ>
        <!--最大ログ ファイル サイズ-->
        <トリガーポリシークラス="ch.qos.logback.core.rolling.サイズベースのトリガーポリシー">
            <最大ファイルサイズ>10MB</最大ファイルサイズ>
        </トリガーポリシー>
    </アペンダー>

    <!-- ログ出力レベル -->
    <ルートレベル="情報">
        <アペンダー参照ref="STDOUT" />
        <appender-ref ref="ファイル" />
    </ルート>
</構成>

このノードに設定されたログファイルの保存アドレスに注意する必要があります。

従来の jar パッケージ展開方法に従うと、ログ ファイルはホスト マシンの /home/logs にあるはずです。しかし、そのようなディレクトリが存在しないことがわかりました。では、問題はどこにあるのでしょうか。ログファイルはどこに出力されますか? ?起動したSpringbootコンテナに入り、すでに実行中のコンテナに対話的に入ってみましょう。

docker exec -it コンテナID bash 

その中にホームディレクトリがあることがわかります。ディレクトリを一つずつ入っていけば、ログファイルがここにあることがわかります。

考えてみてください。以前、データ ボリューム コマンドを使用しませんでしたか? コンテナー内のパスを仮想マシンにマップできますか?ぜひお試しください!起動したコンテナを停止します(直接削除しましょう)

docker stop コンテナID
docker rm コンテナID

コンテナを再起動する

docker run -d -p 8080:8080 -v /home/logs:/home/logs イメージID

今回はコマンドに -d を追加しました。これはデーモンスレッドが開始されていることを意味します(バックグラウンドで実行中)。開始されたコンテナのログを表示するには、次のコマンドを使用します。

docker ログ -f コンテナID 

ご覧のとおり、起動は成功しているので、locback.xml がマッピングしたホストの /home/logs ディレクトリにログ ファイルを出力するのは当然です。確認して一連のコマンドを入力すると、ログ ファイルが実際にここにあることがわかります。

Spring Boot のパッケージ化と Docker リポジトリへのアップロードの詳細な手順については、これで終わりです。Spring Boot のパッケージ化とアップロードに関するその他の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • SpringBoot のパッケージ化と Docker へのアップロード、およびマルチインスタンス デプロイメントの実装に関する簡単な分析 (IDEA バージョン)
  • Springboot docker jenkins でイメージを自動的にデプロイしてアップロードするための詳細な手順
  • Spring Boot Docker パッケージング ツールの概要
  • Springboot パッケージングを Docker イメージとして実装し、デプロイする
  • Spring Boot パッケージング Docker イメージの最もシンプルな実装
  • Springboot マイクロサービス パッケージング Docker イメージ プロセスの分析

<<:  HTML doctype の役割の紹介

>>:  Vueはマーキースタイルのテキストの水平スクロールを実装します

推薦する

Websocket に基づくシンプルなチャットルームダイアログの実装

この記事では、WebSocketを使用して簡単なチャットルームの会話を実装するための具体的なコードを...

MySQL 8.0.16 Win10 zip バージョンのインストールと設定のグラフィック チュートリアル

この記事では、MySQL 8.0.16 Win10 zip版のインストールと設定のグラフィックチュー...

JavaScriptオフセットは、ウィンドウ内でのマウス座標の取得とモジュールのドラッグを実装します。

オフセットOffset はオフセットです。関連プロパティの offset シリーズを使用すると、次の...

Docker コンテナ アプリケーションで避けるべき 10 の悪い習慣

コンテナが企業の IT インフラストラクチャに欠かせない要素となっていることは間違いありません。コン...

Web プロジェクトでの SQL インジェクションの防止

目次1. SQLインジェクションの概要2. SQLインジェクション攻撃の全体的な考え方SQLインジェ...

マルチコア CPU を使用して Linux コマンドを高速化する方法 (GNU Parallel)

非常に大量のデータ(数百 GB)を計算する必要があったことはありますか?または、その内部を検索したり...

MYSQL 5.6 スレーブレプリケーションの展開と監視

MYSQL 5.6 スレーブレプリケーションの展開と監視MYSQL 5.6 のインストールと展開 #...

MySQL のフィールドに一意のインデックスを追加および削除する方法

1. PRIMARY KEY(主キーインデックス)を追加するmysql>ALTER TABLE...

Vue3 ベースのスクリプト設定構文 $refs の使用

目次1. Vue2 構文2. Vue3の使用1. コンポーネントのref値を設定する2. コンポーネ...

mysql8.0.11 winx64 インストールと設定のチュートリアル

mysql 8.0.11 winx64のインストールチュートリアルは以下のように記録され、みんなと共...

LeetCode の SQL 実装 (181. 従業員は管理職よりも収入が高い)

[LeetCode] 181.従業員の収入が管理職よりも多い従業員テーブルには、マネージャーを含む...

MySQL データベースは SQL ステートメントを知っている必要があります (拡張バージョン)

拡張版です。質問とSQL文は以下の通りです。ユーザー テーブルを作成し、id、name、gender...

Linuxネットワーク構成ツールの使用

この記事では、RHEL8 のネットワーク サービスとネットワーク構成ツール、およびネットワーク ファ...

TortoiseSvn Little Turtle インストール 最新の詳細なグラフィックチュートリアル

tortoiseGit のインストール時にいつも問題があったので、単純に svn に変更しました。途...

MySQL 5.7 のインストールと設定方法のグラフィックチュートリアル

このチュートリアルでは、MySQL 5.7のインストールと設定方法を参考までに紹介します。具体的な内...