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の違いの詳細な説明

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

推薦する

Vue+elementUI コンポーネントは、折りたたみ可能な動的レンダリングのマルチレベル サイドバー ナビゲーションを再帰的に実装します。

かなり前に実装された機能ですが、クリックすると選択したメニュー項目の背景色が白くなることに気付きまし...

Dockerイメージをプライベートリポジトリにアップロードする方法の例

イメージは、GitHub と同様に Docker パブリック リポジトリに直接簡単にプッシュできます...

HTMLリンクを書くときは、HTTPリクエストを減らすためにサブフォルダに必ずスラッシュを追加してください。

サブフォルダーの末尾にスラッシュがない場合、2 つの HTTP リクエストが生成され、効率に影響しま...

Linux サーバーのクイックアンインストールとノード環境のインストール (簡単に始められます)

1.まずnpmをアンインストールする sudo npm アンインストール npm -g 2. ノー...

960 グリッドシステムの基本原理と使用法

もちろん、CSS はフレームワークを必要とするほど高度ではないと考えて、反対の意見を持つ人もたくさん...

Linux オペレーティング システムでよく使用される MySQL コマンドの概要

以下に、一般的な MySQL コマンドをいくつか示します。 -- データベース サービスを開始します...

シンプルなカレンダー効果を実現する js

この記事では、シンプルなカレンダー効果を実現するためのjsの具体的なコードを参考までに共有します。具...

Nginx_geo モジュールを使用して CDN スケジュールを設定する方法

NginxのGeoモジュールの紹介geo ディレクティブは、ngx_http_geo_module ...

Mysql通信プロトコルの詳細な説明

1.Mysql接続方法MySQL 通信プロトコルを理解するには、まず MySQL サーバーへの接続に...

Dockerのネットワークモードと設定方法

1. Dockerネットワークモードdocker run が Docker コンテナを作成するときに...

MySQL の最適化: 高品質の SQL 文を書く方法

序文インターネット上にはデータベースの最適化に関する情報や方法が数多くありますが、その多くは品質にば...

画像を使用してハイパーリンクのパーソナライズされた下線を実現します

画像内に下線付きのリンクが表示されても驚かないでください。実はとても簡単なので、あなたにもできるので...

ChromeはCookieの変更を監視し、値を割り当てます

次のコードは、Chrome による Cookie の変更の監視を導入しています。コードは次のとおりで...

SQL インジェクション脆弱性プロセスの例と解決策

コード例: パブリッククラスJDBCDemo3 { パブリック静的voiddemo3_1(){ bo...

vue の v-bind を理解する

目次1. v-bindの主要ソースコードの分析1. v-bind属性はどこに均一に保存されるか: a...