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

推薦する

MySQL Bツリーインデックスとインデックス最適化の概要についての簡単な説明

MySQL の MyISAM エンジンと InnoDB エンジンはどちらもデフォルトで B+ ツリー...

コードレイン効果を実現するJavaScriptキャンバス

この記事では、コードレイン効果を実現するためのキャンバスの具体的なコードを参考までに共有します。具体...

Flexboxレイアウトの最もシンプルなフォーム実装

フレキシブル レイアウト (Flexbox) はますます人気が高まっており、CSS レイアウトの記述...

MySQLストレージ時間タイプの選択に関する問題の説明

MySQL では、datetime 型は通常、時間を保存するために使用されますが、現在では多くのシス...

MySQL インデックスの知識の要約

MySQL インデックスの確立は、MySQL の効率的な操作にとって非常に重要です。インデックスによ...

MySQL での varchar 型の日付の比較、並べ替え、その他の操作の実装

MySQL を使用する場合、日付は通常、datetime や timestamp などの形式で保存さ...

デザイン参考 WordPressウェブサイト構築成功事例

これら 16 のサイトはそれぞれ注意深く読む価値があり、どのサイトでも推奨されている Web サイト...

MySQL のユーザー権限を照会する方法の概要

MySQLユーザー権限を表示する2つの方法を紹介します1. MySQL grantsコマンドを使用す...

OpenShift のクイックインストールの詳細な手順

OpenShift 3.9 の最新バージョンを体験する最も早い方法。準備 [root@host ~]...

CSS を使用して、画像に 3D の凸型と凹型のエフェクト (フレーム外に凸型、またはフレーム内に凹型) を実現します。

Ⅰ. 問題の説明: CSS を使用して画像の 3D 凸凹効果を実現します。 Ⅱ実施手順は以下のとお...

削除、切り捨て、ドロップの違いと選択方法

序文先週、同僚が私に尋ねました。「兄さん、MySQL にバグを見つけました。午後にディスクをクリーン...

Dockerを使用してMySQLデータベースをインストールするDeepinの詳細な説明

まずMySQLソースをクエリするdocker 検索 mysql公式ウェブサイトにアクセスしてイメージ...

アカウントとパスワードを記憶する機能を実現するVueの考え方とプロセス

目次実装のアイデアアカウント パスワードを保存する方法は 3 つあります。機能インターフェースアカウ...

eCharts でパーセンテージ付きの横棒グラフを実装する方法

目次サンプルコードレンダリングコード分​​析要約するサンプルコード var データ = [220, ...

Docker クリーニングキラー/Docker オーバーレイ ファイルがディスク領域を大量に占有する

[インターネット上の移行ファイルをすべて見ると、信頼性が低く、症状のみを治療し、根本的な原因を治療し...