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

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

推薦する

VMware pro15 インストール macOS10.13 詳細インストール図(画像とテキスト)

編集者は最近、macOS システムを使い始めたかったので、VMware に macOS イメージ シ...

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

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

Webデザイン講座(4):素材と表現について

<br />前回のWebデザインチュートリアル:Webデザインチュートリアル(3):デザ...

vue-element-admin プロジェクトのインポートとエクスポートの実装

vue-element-admin インポートコンポーネントのカプセル化テンプレートとスタイルまず、...

node.js でマルチコア CPU を最大限に活用する方法

目次概要node.js でマルチコア CPU を最大限に活用する方法Node で子プロセスを作成する...

Linuxダイナミックリンクライブラリの使用

通常のプログラムと比較すると、ダイナミック リンク ライブラリにはメイン関数がなく、一連の関数の実装...

WindowsシステムでPhPStudy MySQLの起動に失敗する問題を解決する

エラーを報告するApache\Nginx サービスは正常に起動しましたが、MySQL は起動に失敗し...

MySQL データベースのエンコーディングを utf8mb4 に変更する方法

utf8mb4 エンコーディングは utf8 エンコーディングのスーパーセットであり、utf8 と互...

Dockerはブリッジを追加し、IPアドレスの範囲を設定します

バイナリ docker 19.03 バージョンがインストール後に docker0 ブリッジを自動的に...

Vueは動的コンポーネントを使用してTAB切り替え効果を実現します

目次問題の説明Vueの動的コンポーネントとはアプリケーションシナリオの説明実装手順ステップ 1 (新...

フロントエンド制作に関する簡単な議論: 互換性のために IE6 はまだ必要ですか?

国内市場ではIE6~7のサポートに対する一定の需要がまだありますが、フロントエンド開発者として、私た...

Nginx がサーバーの生存状態をパッシブにチェックする詳細な説明

導入定期的にヘルスチェックを送信して、アップストリーム グループ内の HTTP サーバーのヘルスを監...

JavaScriptの基本構文とデータ型の詳細な説明

目次JavaScript のインポート1. 内部ラベル2. 外部紹介基本的な構文データ型番号弦ブール...

Centos7 への MySQL8 のインストールチュートリアル

MySQL 8 の新機能: MySQL をバージョン 5.x から 8.x に直接アップグレードする...

Navicat for SQLite で中国語データを CSV にインポートする方法

この記事では、参考までに、csv中国語データをNavicat for SQLiteにインポートする具...