Dockerイメージをパッケージ化し、リモートサーバーにプッシュしてk8sにデプロイする方法

Dockerイメージをパッケージ化し、リモートサーバーにプッシュしてk8sにデプロイする方法

前提条件:

1. Docker サーバーでリモート アクセスが有効になっています。「証明書接続によるリモート Docker サーバー」を参照してください。

2. サーバー上に k8s クラスターが構築されています。この記事では、テストに k8s シングルポイント クラスターを使用します。

前回の記事では、idea docker プラグインを介してリモート docker サーバーに正常にアクセスできることをテストしました。この docker プラグインを使用して docker イメージをパッケージ化してプッシュすることもできますが、この記事では、Maven の docker-maven-plugin プラグインを使用して docker イメージをパッケージ化し、リモート docker サーバーにプッシュする別の方法を使用します。

1. Dockerファイル

Dockerfileファイルは、アプリケーションをDockerイメージにするために使用されます。

# jdk 環境のバージョンを指定して、java8 をベースにイメージを作成します。FROM java:8
# 一時ディレクトリ VOLUME /tmp をマウントします
# 指定された jar パッケージをコンテナに追加します [これは、プロジェクトのパッケージ化によって生成された jar パッケージの完全な名前です]
practice-job-0.0.1-SNAPSHOT.jar /practice-job.jar を追加します。
# コンテナによって公開されるポート番号(プロジェクトによって占有されるポート番号を参照)
エクスポーズ8081
# コンテナの起動後に実行されるコマンド ENTRYPOINT [ "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/practice-job.jar" ]

2. pom設定

pom ファイルの関連構成は次のとおりです。リモート サーバーの IP アドレスを入力し、上記の Dockerfile のパスと、リモート Docker にアクセスするために必要な pem 証明書ファイルのパスを指定することに注意してください。

    <ビルド>
        <プラグイン>
            <プラグイン>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </プラグイン>
 
            <!--docker-maven-plugin プラグインを使用してサービスをイメージにパッケージ化し、docker サーバーに送信します-->
            <プラグイン>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <バージョン>1.2.2</バージョン>
                <!-- プラグインを特定のフェーズにバインドして実行します -->
                <処刑>
                    <実行>
                        <id>ビルドイメージ</id>
                        <!-- プラグインをパッケージ フェーズにバインドします。つまり、ユーザーは mvn package を実行するだけで、自動的に mvn docker:build が実行されます -->
                        <phase>パッケージ</phase>
                        <目標>
                            <goal>ビルド</goal>
                        </目標>
                    </実行>
                </処刑>
                <構成>
                    <forceTags> 真</forceTags>
                    <!-- 生成されるイメージ名を指定します。生成するイメージ名に変更します。 -->
                    <imageName>練習問題</imageName>
                    <!--タグを指定-->
                    <画像タグ>
                        <imageTag>最新</imageTag>
                    </画像タグ>
                    <!-- Dockerfile パスを指定します -->
                    <dockerディレクトリ>${project.basedir}</dockerディレクトリ>
                    <!-- リモート Docker アドレスを指定します -->
                    <dockerHost>https://パブリックネットワークIP:2376</dockerHost>
                    <!--pem 証明書ファイルのパス アドレスを指定します-->
                    <dockerCertPath>${project.basedir}/src/main/resources/pem</dockerCertPath>
                    <!-- 以下は、jar パッケージを docker コンテナの指定されたディレクトリにコピーするための構成です -->
                    <リソース>
                        <リソース>
                            <ターゲットパス>/</ターゲットパス>
                            <!--jar パッケージが配置されているパスはターゲット ディレクトリに対応します -->
                            <ディレクトリ>${project.build.directory}</ディレクトリ>
                            <!-- Dockerfile に追加されたファイル名に対応する、含める必要のある jar パッケージ -->
                            <include>${project.build.finalName}.jar</include>
                        </リソース>
                    </リソース>
                </構成>
            </プラグイン>
        </プラグイン>
    </ビルド>

3. イメージプッシュ

上記の準備が完了したら、インストールコマンドを実行します。しばらく待つと、以下のコンソールに BUILD SUCCESS と表示され、イメージのプッシュが成功したことが示されます。

次に、リモート サーバーに移動して確認し、docker images コマンドを入力してコンテナー イメージを表示します。

アプリケーション イメージが正常にプッシュされたことがわかります。次のステップはデプロイメント ステージです。

4. k8s デプロイメント

これまで、デプロイメント環境に Docker コンテナしかなかったのであれば、ここではアプリケーション イメージを docker で実行し、プロジェクトを Docker コンテナにデプロイしてアクセスするだけで済みます。しかし、現在のデプロイメント環境は k8s+docker なので、デプロイメント用にアプリケーション イメージを直接実行することはできません。k8s デプロイメントに進みましょう。

まず、practice-job-deployment.yaml と practice-job-service.yaml という 2 つの yaml ファイルを作成する必要があります。これら 2 つのファイルの機能には、k8s の概念が関係しています。k8s の概念については、以降の記事で説明します。ここでは、k8s のほとんどの構成が yaml ファイルに基づいて定義されていることを知っておくだけで十分です。

vi 実践ジョブデプロイメント.yaml

APIバージョン: v1
種類: 名前空間
メタデータ:
  名前: 練習
---
APIバージョン: アプリ/v1
種類: デプロイメント
メタデータ:
  名前: 実践的なジョブ展開
  名前空間: 練習
仕様:
  レプリカ: 1
  セレクタ:
    一致ラベル:
      アプリ: practice-job-pod
  テンプレート:
    メタデータ:
      ラベル:
        アプリ: practice-job-pod
    仕様:
      ホストネットワーク: true
      コンテナ:
        - 名前: 練習ジョブコンテナ
          image: practice-job:latest #イメージ名 + バージョンimagePullPolicy: Never #イメージのソースを示します。NotPresent がローカルで利用できない場合は、ハブ ウェアハウスからプルされます。Never はローカル ポートからのみを意味します。
            - コンテナポート: 8081
          環境:
            # ログファイルのパスを指定します - 名前:logging.path
              値: /var/logs

vi 練習ジョブサービス.yaml

APIバージョン: v1
種類: サービス
メタデータ:
  名前: 実践ジョブサービス
  名前空間: 練習
  ラベル:
    アプリ: 練習ジョブサービス
仕様:
  タイプ: NodePort
  セレクタ:
    アプリ: practice-job-pod
  ポート:
    - 名前: http
      プロトコル: TCP
      port: 8081 #サービス(内部)ポート targetPort: 8081 #ポッドポート nodePort: 32001 #サービス(外部)ポート

次に、コマンドを個別に実行します。

kubectl apply -f 実践ジョブのデプロイメント.yaml
kubectl apply -f 練習ジョブサービス.yaml 

コマンドを実行します: kubectl get pod --all-namespaces。ポッドを確認すると、プロジェクトのポッドが正常に実行されたことがわかります。

アプリケーションの実行ログを表示するには、kubectl logs practice-job-deployment-77d685767-glvgm -n practice コマンドを実行します。形式は次のとおりです: kubectl logs <pod name> -n <pod namespace>。

コマンドを実行します: docker ps プロジェクトがすでにコンテナ内で実行されていることがわかります

コマンド kubectl get service --all-namespaces を実行します。アプリケーションに対応するサービスが正常に開始され、公開されているポートが 32001 であることがわかります。これは、先ほど yaml ファイルで構成したポートです。

最後に、ブラウザはパブリック ネットワーク IP:32001/doc.html にアクセスします。このパスは私のプロジェクト専用であり、プロジェクトによってパスは異なります。ファイアウォールで対応するポートを開く必要があることに注意してください。

この時点で、アプリケーションはローカルの Docker イメージからパッケージ化され、サーバーにプッシュされ、その後 k8s+docker コンテナーにデプロイされます。

これで、docker イメージをパッケージ化してリモート サーバーにプッシュし、k8s にデプロイする手順に関するこの記事は終了です。より関連性の高い docker イメージのパッケージ化と k8s へのデプロイについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • docker を使用して Spring Boot をデプロイし、Skywalking に接続する方法
  • Dockerでk8sをデプロイする方法
  • Dockerコンテナのk8sデプロイメントの実装
  • Docker 学習ノート k8s デプロイ方法
  • Skywalking は Docker イメージをコンテナ化してデプロイし、テストから可用性まで k8s を構築します。

<<:  最もよく使用されるJavaScriptイベントについて詳しく学ぶ

>>:  ウェブサイトに天気予報を挿入する方法

推薦する

hasLayout によって発生する CSS バグの一覧

IE には長い間問題がありました。誰もがテストを受けたとき、誰もが笑顔でしたが、それはただのニヤニヤ...

ウェブ音楽プレーヤーを実現する js

この記事では、参考までに簡単なHTMLと音楽プレーヤーの制作コードを紹介します。具体的な内容は以下の...

Vue は水の波紋効果のクリックフィードバック指示を実装します

目次水波効果実装を見てみましょう水の波紋のデフォルトスタイルをカスタマイズする水の波紋の位置と直径を...

CSS BEM 記述標準の詳細な説明

BEM は、Web 開発に対するコンポーネントベースのアプローチです。ユーザー インターフェイスを独...

Docker5フル機能の港湾倉庫構築プロセス

Harbor は、Docker イメージを保存および配布するためのエンタープライズ レベルのレジスト...

Vue ディレクティブ v-html と v-text

目次1. v-text テキストレンダリング命令2. v-html 1. v-text テキストレン...

MySQL の悲観的ロックと楽観的ロックの使用例

悲観的ロック悲観的ロックは、データを悲観的であるとみなします。データをクエリするときに、ロックを追加...

Nginx のステータス監視とログ分析の詳細な説明

1. Nginx ステータス監視Nginx には、Nginx の全体的なアクセス ステータスを監視す...

Docker デプロイメント MySQL8 クラスター (マスター 1 台とスレーブ 2 台) の実装手順

目次1. CentOS 7.9 20にDockerをインストールする2. MySQL クラスターをデ...

PSSHを使用してLinuxサーバーを一括管理する

pssh は、多数のマシンでのバッチ ssh 操作に使用される、Python で実装されたオープン ...

Dockerでイメージ情報を表示する方法

この記事では、Dockerでイメージ情報を表示する方法を学ぶ必要があります。 1. imagesコマ...

CSS の子要素を親要素と高い一貫性を持たせる方法

絶対位置決め方式: (1)親要素を相対配置に設定します。親要素の高さを指定しない場合は、左の子要素の...

Nginx の場所と proxy_pass パスの設定の問題の概要

目次1. Nginxロケーションの基本設定1.1 Nginx 設定ファイル1.2 Pythonスクリ...

Linux でユーザー アカウントをロックおよびロック解除する 3 つの方法

組織内で何らかのパスワード ポリシーがすでに実装されている場合は、この記事を読む必要はありません。た...

Linux の crontab タスク スケジューリングの簡単な分析

1. スケジュールタスクを作成する命令crontab -eは現在のユーザーの編集インターフェースに入...