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

推薦する

Ubuntuはポート22を開きます

シナリオssh 経由で Ubuntu サーバーに接続するには、xshell ツールを使用する必要があ...

MYSQL SERVER のログファイルを縮小する方法

トランザクション ログには、関連するデータベースに対する操作が記録され、データベースの回復に関連する...

JS オブジェクト配列の重複排除のための 3 つの方法の例と比較

目次1. 重複排除前後のデータの比較2. 使い方1. フィルターとマップを使用する2. 削減を使用す...

マークアップ言語 -

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

Linuxネットワーク設定の基本操作コマンドを詳しく解説

目次ネットワーク構成を表示するネットワークインターフェース情報を表示する---ifconfigルーテ...

Linux サーバー上のローカル静的リソースにアクセスするために nginx を使用する方法

1. ポート 80 が占有されているかどうかを確認します。通常、ポート 80 は Apache サー...

VMware で Centos7 ブリッジ ネットワークを構成する手順の詳細な説明

VMware仮想マシンでのCentos7ブリッジネットワーク構成の完全な手順は参考用です。具体的な内...

MySQL移行計画と落とし穴の実践記録

目次背景解決策1: 古いデータをバックアップするオプション2: テーブルを分割する解決策3: tid...

JavaScript でピンボール ゲームの Web バージョンを実装する

参考までに、JavaScriptのオブジェクトとメソッドを使用して実装されたWebピンボールゲームを...

Vue スキャフォールディング プロジェクトを作成するための詳細な手順

vue スキャフォールディング -> vue.cli大規模で完全に機能する Vue プロジェク...

MySQL 論理バックアップとリカバリ テストの概要

目次1. データベース論理バックアップとはどのようなバックアップですか? 2. よく使われる論理バッ...

記事では、js を使用して弾幕効果を実現する方法を説明します

目次新しい HTML ファイルを作成します。初期テンプレートを作成するHTML の追加CSS パディ...

CSS の無効な行の高さ設定の問題の解決策

CSS の無効な行の高さ設定についてまず、次のコード文字列を記述します。 <!DOCTYPE ...

Centos8 の Django プロジェクトに nginx+uwsgi をデプロイするチュートリアル

1. 仮想環境virtualenvのインストール1. virtualenvをインストールするpip3...