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

推薦する

CSSを使用してHTMLテキストボックス内のテキストの垂直方向の中央を制御する

Text の height 属性が定義されている場合、Text に入力されたテキストは垂直方向に中央...

Linux CentOS インストール JDK および Tomcat チュートリアル

まずJDKをダウンロードします。ここではjdk-8u181-linux-x64.tar.gzを使用し...

WeChatアプレットを少なく使う方法(最適な方法)

序文私は less/sass を書くことに慣れていますが、小さなプログラムを開発するときには、まだ ...

MySQL のクエリパフォーマンスに対する制限の影響

I. はじめにまず、MySQL のバージョンについて説明します。 mysql> バージョンを選...

VUE 応答性原理の詳細な説明

目次1. 応答原理の基盤2. コアオブジェクト: Dep と Watcher 3. 依存関係を収集し...

Linux 論理ボリューム管理 (LVM) の使用法の概要

ディスク領域の管理は、システム管理者にとって重要な日常的なタスクです。ディスク領域が使い果たされると...

Docker Tomcat のアクセス インターフェイスが表示されないのはなぜですか?

質問:オリジン サーバーはターゲット リソースの表現を見つけることができないか、既存の表現を公開した...

goaccess を使用して nginx ログを分析する詳細な方法

最近、goaccess を使って nginx ログを分析したいのですが、nginx ログの設定形式が...

el-select のスタイルを変更する方法の詳細な説明: popper-append-to-body と popper-class

elementUI が提供する el-select コンポーネントのスタイルを変更する方法この問題...

Vue は PDF ファイルのオンライン プレビューを実装します (pdf.js/iframe/embed を使用)

序文現在、私はコースウェア PPT のオンライン プレビューを必要とする高品質のコースに取り組んでい...

MySql 5.6.35 winx64 インストール詳細チュートリアル

注: データベースのバージョンの問題により、プロジェクトの起動時にエラーは発生しませんでしたが、デー...

JQueryセレクターの詳細な説明

目次基本的なセレクター:レベルセレクター:属性セレクター:フィルターセレクター:フォーム属性セレクタ...

MySQL の列から行への変換のヒント (共有)

序文:多くのビジネス テーブルでは、歴史的またはパフォーマンス上の理由により、最初のパラダイムに違反...

選択ドロップダウンボックスの値をIDに渡してコードを実装する方法

完全なコードは次のとおりです。 HTMLコード:コードをコピーコードは次のとおりです。 <!-...

CocosCreatorで複数のタイマーを使用する方法の詳細な説明

1.タイムアウトを設定する3 秒後に abc を印刷します。一度だけ実行します。 setTimeou...