Jenkins + Docker + ASP.NET Core の自動デプロイメントの問題について (落とし穴を避ける)

Jenkins + Docker + ASP.NET Core の自動デプロイメントの問題について (落とし穴を避ける)

このブログを書くつもりはなかったのですが、実際の操作中に、ネットワークの問題に圧倒されたこと (ネットワークは人を狂わせるものだということを本当に感じます。他の人はパッケージやイメージを数秒でダウンロードできますが、私は自分の数 KB の小さなパイプを見てとても惨めな気分になります)、そしてもう 1 つは、ここにはまだいくつかの落とし穴があることです。他の人が同じ落とし穴を繰り返さないように書き留めました。

注意すべき点がいくつかあります:

  • 以下のシェルコマンドのほとんどは管理者権限を必要とするため、使用しているユーザーがrootでない場合はsudoを追加する必要があります。
  • より複雑なコマンドについては、コメント付きバージョンとコメントなしバージョンの両方を提供しています。コメントなしバージョンは、コピーしやすいように用意されています。

準備

  • 7.x の場合
  • ドッカー
  • ジェンキンス
  • Docker 対応の ASP.NET Core アプリケーション コードです。私のコードを直接使用できます: https://github.com/xiaoxiaotank/MyAspNetCoreApp

Dockerをインストールする

公式ドキュメント: https://docs.docker.com/engine/install/centos/

1. 新しいシステムを選択する場合は、まずyumとシステムカーネルを更新することをお勧めします。

yumアップデート

2. 古いバージョンのdockerをアンインストールしてください

  • /var/lib/docker/以下のイメージ、コンテナ、ボリューム、ネットワークは保持されます
  • 旧バージョンでは、Dockerはdockerまたはdocker-engineという名前でした。現在はdocker-ceという名前になっています。
yum 削除 docker \
           dockerクライアント\
           docker-client-最新 \
           docker-common \
           docker-最新 \
           docker-最新-logrotate \
           docker-logrotate \
           dockerエンジン

3. yum-utils をインストールします (以下で使用する yum-config-manager を提供します)

yum をインストール -y yum-utils

4. yum を構成する Alibaba Cloud Docker リポジトリ Docker 公式リポジトリ: https://download.docker.com/linux/centos/docker-ce.repo

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

5. Dockerをインストールする

yum インストール -y docker-ce docker-ce-cli containerd.io

6. アクセラレータを取得するためにDockerイメージアクセラレータを構成する

アドレス: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["アクセラレータの URL をここに入力してください"]
}
終了
sudo systemctlデーモンリロード
sudo systemctl dockerを再起動します

7. Docker情報を表示する

docker情報

8.hello-worldテスト

docker で hello-world を実行する

Jenkinsをインストールして初期化する

公式ドキュメント: https://www.jenkins.io/doc/book/installing/docker/

まず最初に言っておきますが、公式ドキュメントではdockerコマンドの実行やプログラムコンテナの実行にdocker:dindイメージを使っています。これは全く不要だと感じますし、これを導入すると余計な問題が沢山発生すると思うので、私は使いませんでした。

dindについてもっと知りたい場合は、こことこのブログをご覧ください。

Jenkinsをインストールする

1. Dockerfileを作成する

vim Dockerファイル

2. Dockerfileファイルに次の内容を入力します。

  • タグリファレンス: https://hub.docker.com/r/jenkins/jenkins
  • 注意: 古いイメージjenkinsではなく、イメージ jenkins/jenkins を使用してください。
jenkins/jenkins:lts-jdk11 より
ユーザー ルート
apt-get update && apt-get install -y apt-transport-https \ を実行します。
       ca-証明書 curl gnupg2 \
       ソフトウェアプロパティ共通
実行 curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
apt-key フィンガープリント 0EBFCD88 を実行します
add-apt-repository を実行します\
       "deb [arch=amd64] https://download.docker.com/linux/debian \
       $(lsb_release -cs) 安定"

# docker-ce-cli をインストールして、Jenkins の docker デーモンに docker コマンドを送信します。
apt-get update && apt-get install -y docker-ce-cli を実行します。

3. イメージを構築する

docker ビルド . -t myjenkins

警告が表示された場合: [警告] IPv4 転送が無効になっています。ネットワークは機能しません。

実際、これは Linux で IPv4 パケット転送機能が有効になっていないことを意味します。

まずDockerを再起動してみてください

systemctl dockerを再起動します

無効の場合、

# 1. sysctl.confを開く
vim /etc/sysctl.conf

# 2. 次の行を追加します。net.ipv4.ip_forward=1

# 3. ネットワークとDockerを再起動する
systemctl ネットワークを再起動します && systemctl docker を再起動します

4. Jenkinsコメントバージョンを実行する

docker 実行 \
  --name jenkins \ # コンテナにjenkinsという名前を付けます
  --detach \ # バックグラウンド分離モードで実行します --publish 8080:8080 \ # ホストポート 8080 をコンテナポート 8080 にマップします --publish 50000:50000 \ # ホストポート 50000 をコンテナポート 50000 にマップします --volume jenkins-data:/var/jenkins_home \ # ボリューム jenkins-data はコンテナパス /var/jenkins_home にマップし、ホスト上で直接 jenkins 構成を変更できます --volume /var/run/docker.sock:/var/run/docker.sock \ # ホスト上の docker sock はコンテナの docker sock にマップし、コンテナ内の docker コマンドがホスト上の docker に送信されて myjenkins が実行されるようにします # ビルドしたばかりのイメージ myjenkins を使用してコンテナを実行します

注釈なしバージョン

docker 実行 \
  --name ジェンキンス \
  --デタッチ\
  --publish 8080:8080 \
  --publish 50000:50000 \
  --volume jenkins-data:/var/jenkins_home \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  マイジェンキンス

5. Jenkinsプラグインソースを変更する

先ほど、コンテナ内のパス/var/jenkins_homeをボリュームjenkins-dataにマッピングし、すべてのdockerボリュームはディレクトリ /var/lib/docker/volumes/ に保存されました。

hudson.model.UpdateCenter.xml を開く

vim /var/lib/docker/volumes/jenkins-data/_data/hudson.model.UpdateCenter.xml

ファイル内の URL を清華大学の公式ミラーに変更します。

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

今すぐ:

<?xml バージョン = '1.1' エンコーディング = 'UTF-8'?>
<サイト>
  <サイト>
    <id>デフォルト</id>
    <!-- 元の URL: https://updates.jenkins.io/update-center.json -->
    <url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
  </サイト>
</サイト>

Jenkinsを再起動します。

docker ジェンキンスを再起動

Jenkinsを初期化する

アクセス: http://<host-ip>:8080 管理者の初期パスワードを表示するには、管理者の初期パスワードを入力します。

/var/lib/docker/volumes/jenkins-data/_data/secrets/initialAdminPassword を編集します。 

「推奨プラグインをインストールする」を選択します

長い待ち時間の後、ネットワーク環境と依存関係の問題により、一部のプラグインのインストールに失敗する場合があります。ただし、「続行」をクリックして修正に進みましょう。

次に、独自の管理者アカウントを作成し、Jenkins URLを確認します。

入力後、Jenkinsのメインページは次のようになります

まずインストールに失敗したプラグインを修正しましょう

左側のメニューバーの「Jenkinsの管理」をクリックして、Jenkinsを最新バージョンにアップグレードします。

アップデートセンターページで、下部にある「インストール完了後(アイドル時)に Jenkins を再起動する」というボックスをチェックすることを忘れないでください。

自動構成と展開

Jenkinsページの左側にあるメニューの最初の「新しいタスク」をクリックし、タスク名を入力して、フリースタイルを選択します。

以下の設定情報を入力して保存します



シェルコマンドは次のとおりです。

image_tag=`日付 +%Y%m%d%H%M%S`;
$image_tag をエコーし​​ます。

# イメージをビルドしてタグ付けする
docker build -t myapp:$image_tag .;
Docker イメージ;

# myappコンテナの古いバージョンを停止して削除する
CID=$(docker ps | grep "myapp" | awk '{print $1}')
$CIDをエコーする
if [ "$CID" != "" ];then
  docker stop $CID
  docker rm $CID
フィ

# ビルドしたイメージを実行します。docker run -p 5000:80 --name myapp -d myapp:$image_tag;
docker ps -a;
docker は myapp をログに記録します。

左側のメニューの「今すぐビルド」をクリックして AspNetCoreApp をデプロイし、「コンソール出力」を確認します。「Finished: SUCCESS」と表示されたら、デプロイが成功したことを意味します。

アクセス: http://<host-ip>:5000/hello (hello が追加されていることに注意してください)

2021-05-12T15:28:43.9032704+00:00: こんにちは!

次に、Docker で実行中のコンテナを確認します。

コンテナID イメージ コマンド 作成ステータス ポート名
e167a135f7a0 myapp:20210512152453 "dotnet MyAspNetCore…" 2 分前 2 分前にアップ 0.0.0.0:5000->80/tcp, :::5000->80/tcp myapp
e83a2570c334 myjenkins "/sbin/tini -- /usr/…" 約 1 時間前 約 1 時間前 0.0.0.0:8080->8080/tcp、:::8080->8080/tcp、0.0.0.0:50000->50000/tcp、:::50000->50000/tcp jenkins

予防

1. Jenkins BlueOceanおよびその他のプラグインのダウンロードとインストールについて

Jenkins で bluocean などのプラグインをインストールしたい場合は、公式サイトに従わずに Dockerfile にインストールコマンドを入れてください。加速元を指定するために--jenkins-update-centerパラメータを追加する場合でも、そうすることは推奨されません。私も最初はできるだけ自動化したかったのですが、ネットワークの問題でプラグインのダウンロードとインストールに失敗し、イメージのビルドに失敗し、2、3時間の時間を無駄にしました(本当に苦痛でした)

さらに、Jenkins をインストールするときに、blueocean の関連プラグインが含まれているイメージ jenkinsci/blueocean を直接使用することもできます。

2. myappコンテナのポートマッピング5000:80について

私の Dockerfile では外部に公開されているポートが 80 なので、コンテナのポート 80 をホストのポート 5000 にマッピングしました。実際の状況に応じてここを変更する必要があります。

3. dind(docker in docker)に興味がある場合

dindについてもっと知りたい場合は、こことこのブログをご覧ください。

以上が、Jenkins + Docker + ASP.NET Core の自動デプロイに関する問題の詳細です。Jenkins + Docker + ASP.NET Core の自動デプロイの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • ASP.NET Core 開発 Docker デプロイ
  • Linux CentOS の Docker に Asp.Net Core (.Net6) をデプロイする
  • Gogs+Jenkins+Docker による .NetCore ステップの自動デプロイ
  • Linux システム Docker への ASP.NET Core アプリケーションのデプロイのプロセス分析
  • docker を使用して Asp.net コア アプリケーションをデプロイするための完全な手順
  • Asp.net Core Jenkins Docker のワンクリックデプロイの実装
  • ASP.NET Core Docker デプロイメントの詳細
  • .Net Core は Docker コンテナを展開します

<<:  CSSリンクと@importの違いの詳細な説明

>>:  ショートカットアイコンとアイコンコードの違いの紹介

推薦する

yum を使用して rpm と関連する依存関係をダウンロードして、docker をオフラインでインストールします。

yum を使用してすべての依存関係を一緒にインストールできますが、–downloadonly –d...

JavaScript スクリプトが実行されるタイミングの詳細な説明

JavaScript スクリプトは HTML 内のどこにでも埋め込むことができますが、いつ呼び出され...

Vueドロップダウンメニューのコンポーネント開発の詳細説明

この記事の例では、Vueドロップダウンメニューのコンポーネント開発の具体的なコードを参考までに共有し...

line-height=height要素の高さだがテキストが垂直方向に中央揃えされない問題を解決する

まず、行の高さが要素の高さと等しい場合にテキストが垂直方向に中央揃えにならない理由を説明します。実際...

標準SQL更新ステートメントの3つの用途についての簡単な理解

1. 環境: MySQL-5.0.41-win32 Windows XP プロフェッショナル2. テ...

Oracle VM VirtualBox の CentOS7 オペレーティング システムのインストール チュートリアル図

目次インストール手順環境設定実行構成インストール手順ダウンロードアドレス: バージョン6.0 最初に...

JavaScriptのプロトタイプオブジェクトを徹底的に理解しましょう

目次1. プロトタイプとは何ですか? 1.1 関数プロトタイプオブジェクト1.2 コンストラクタを使...

Vue+tsx のスロット使用の問題が置き換えられない

目次序文問題を見つける解決する追記序文最近、 UIコンポーネントを作成する予定で、 vue 2.xと...

Docker-Composeコマンドの使い方の詳しい説明

Docker コンテナはさまざまな方法で管理およびデプロイできます。 Docker コマンドを直接使...

MySql のサブクエリ内のクエリ例の詳細な説明

北西を見ると私の故郷はどこにあるでしょうか。南東の満月を何度見たことがあるでしょうか。月が再びゆっく...

React NativeのstartReactApplicationメソッドの簡単な分析

今回は、 RNの起動処理を整理しました。最後のstartReactApplication比較的複雑で...

Mysql ALTER TABLE はフィールドを追加するときにテーブルをロックしますか?

目次MySQL 5.6以前MySQL 5.6以降要約する知らせMySQL 5.6以前更新手順元のテー...

テーブル適応とオーバーフローのいくつかの設定の詳細な説明

1. テーブル リセットの 2 つのプロパティ: ①border-collapse: collaps...

MySQL 8.0 アトミック DDL 構文の詳細な説明

目次01 アトミックDDLの紹介02 一部のDDL操作の実行動作の変更03 DDL 操作のログを表示...

Linuxはscpコマンドを使用してファイルをローカルコンピュータにコピーし、ローカルファイルをリモートサーバーにコピーします。

以下のように表示されます。リモート サーバーのファイルをローカルにコピーします。 scp -r -P...