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はマーキースタイルのテキストの水平スクロールを実装します

推薦する

Vue.set() と this.$set() の使い方と違い

開発に Vue を使用する場合、次のような状況に遭遇することがあります。Vue インスタンスを生成し...

Dockerはホスト間のネットワーク通信を実現するためにMacvlanを導入する

基本的な概念: Macvlanの動作原理: Macvlan は、Linux カーネルでサポートされて...

HTMLページのネイティブVIDEOタグはダウンロードボタン機能を隠します

Web プロジェクトを作成しているときに、紹介ビデオが別にある紹介ページに遭遇しました。この短いビデ...

FlashFXP FTP クライアント ソフトウェア登録クラッキング方法

FlashFXPのダウンロードアドレスは、https://www.jb51.net/softs/95...

MySQL 完全折りたたみクエリ正規マッチングの詳細な説明

概要前の章では、クエリのフィルター条件について学習しました。MySQL では、like % ワイルド...

モバイルデバイス Web 開発における HTML ヘッドの書き方

コードをコピーコードは次のとおりです。 <ヘッド> <meta http-equi...

Vueはechart円グラフの凡例のパーセンテージを表示するメソッドを実装します

この記事では主に、echart を使用してパーセンテージを表示する Vue の円グラフデータ部分を紹...

this.parentNode.parentNode (親ノードの親ノード) はどういう意味ですか?

親ノードの親ノード、例えば、このような段落がありますHTML:コードをコピーコードは次のとおりです。...

MySQL で中国語を入力するときに発生するエラー 1366 の解決方法

MySQL で中国語を入力すると、次のエラーが発生します。エラー 1366: 1366: 行 1 の...

Centos6.5 の rpm パッケージから mysql5.7 をインストールするときに発生する初期化エラーの解決策

1. rzをサーバーにアップロードして解凍する rz [root@mini2 アップロード]# ta...

Docker を使用してエンタープライズレベルのカスタムイメージを構築する方法

序文退社前に、ある依頼を受けました。基本イメージ規格の変更により、最新の Docker イメージ規格...

MySQL システム ユーザーが開くことができるファイルの最大数に関する簡単な説明

本から学ぶことは常に浅はかで、これがさらなるダウンタイムを引き起こすことには決して気づきません......

強くお勧めします! Vue 3.2 でシンタックスシュガーを設定する

目次前の1. セットアップ構文シュガーとは何か2. セットアップコンポーネントを使用して自動的に登録...

JS で if 判定をスムーズに行う方法

目次序文コードの実装アイデア 1アイデア2要約する参照ドキュメント序文プロジェクト内の小さな要件ポイ...

MySql における特殊演算子の使用の概要

序文MySQL には次の 4 種類の演算子があります。算術演算子比較演算子論理演算子ビット演算子これ...