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

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

推薦する

Linux TTY/PTS の違いの概要

キーボードで文字を入力すると、対応するプロセスにどのように送信されるのでしょうか? ps や who...

DockerプライベートイメージライブラリとAlibaba CloudオブジェクトストレージOSSの簡単な分析

Docker プライベートイメージライブラリDockerプライベートイメージライブラリとAlibab...

iframe タグの使用方法の詳細な説明 (属性、透明度、適応高さ)

1. iframe の定義と使用法iframe 要素は、別のドキュメントを含むインライン フレーム...

ByteDance インタビュー: JS を使用して Ajax 同時リクエスト制御を実装する方法

序文正直に言うと、最近とても混乱していると感じています。テクノロジーと人生について。また、将来の発展...

MySql インデックスを表示および最適化する方法

MySQL はハッシュ インデックスと Btree インデックスをサポートしています。 InnoDB...

Vue はフォームデータ検証のサンプルコードを実装します

el-form フォームにルールを追加します。データにルールを定義する定義されたルールをel-for...

LinuxでのMySQLのインストール手順

1. mysql tar ファイルをダウンロードします。参考: 2. インストールパッケージがあるデ...

親コンテナの CSS 均等分割 (完全三分の一) の実装

親コンテナの幅は固定されています。子要素が親の幅を均等に分割するには、どのような方法がありますか?コ...

ネイティブ js でカスタム スクロール バーを実装する

この記事の例では、カスタムスクロールバーを実装するためのjsの具体的なコードを参考までに共有していま...

MySQL 5.7 でパスワードを変更するときに発生する ERROR 1054 (42S22) の解決方法

MySQL 5.7 を新しくインストールしました。ログインすると、パスワードが間違っているというメッ...

html リンク タグ タイトル属性 改行 マウス ホバー プロンプト コンテンツ 改行効果

オブジェクト上にマウスを移動したときにコンテンツ(タイトル属性の内容)を折り返す方法、HTML タイ...

NexusはHTTPSプロトコルをサポートするためにnginxプロキシを使用します

背景すべての会社の Web サイトは HTTPS プロトコルをサポートする必要があります。Aliba...

Windows Server 2008R2、2012、2016、2019 の違い

目次共通バージョンの紹介共通バージョンのダウンロードアドレスとインストール以下に簡単な違いを示します...

MySQL 8.0.24 リリースノートのいくつかの改善点

目次1. 接続管理2. オプティマイザレベルでの改善3. 機能の改善4. パフォーマンススキーマの最...

HTMLでのラジオ値の取得、割り当て、登録の詳細な説明

1. ラジオのグループ化名前が同じであれば、それらはグループであり、つまり、次のようにグループ内で選...