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

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

推薦する

Zabbix を使用して ogg プロセスを監視する (Windows プラットフォーム)

この記事では、Windows プラットフォームで ogg プログラムを監視する方法を紹介します。 (...

フレックスレイアウトの互換性の問題の概要

1. W3C バージョンの flex 2009年版フラグ: display: box; または bo...

MySQL テーブルを削除するときに外部キー制約を無視するシンプルな実装

テーブルを削除することはあまり一般的ではありませんが、特に外部キーの関連付けがあるテーブルの場合は、...

Vueはメニューナビゲーションを実装するためにelement-uiを使用します

この記事では、Element-uiを使用してメニューナビゲーションを実装するVueの具体的なコードを...

HTML チュートリアル: よく使われる HTML タグのコレクション (4)

関連記事:初心者が学ぶ HTML タグ (3)導入された HTML タグは、必ずしも XHTML 仕...

docker を使用して Windows 10 Home バージョンで Laravel 開発環境を構築する方法の詳細なチュートリアル

オペレーティング·システム: Win10 ホームエディションDockerをインストールします:公式サ...

HTML ウェブページにおけるさまざまなフォント形式の詳細

このセクションでは、テキストの変更の詳細から始めます。これにより、読者はさまざまな HTML フォン...

SEATAトランザクションサービスDockerのデプロイ手順の詳細説明

1. データベース認証ステートメントを作成する > データベース seata を作成します。 ...

HTML に基づいてページを更新せずにフォーム送信を実装する

ページを更新せずにフォーム送信を実装するために Ajax を使用することは、プロジェクトでよく使用さ...

JSアルバム画像の揺れと拡大表示効果のサンプルコード

前回の記事では、JS を使って簡単な揺れ効果を実現する方法を紹介しました。ご興味があればクリックして...

js でオブジェクトを作成するさまざまな方法とその長所と短所のまとめ

目次初期作成方法ファクトリーパターンコンストラクターパターンコンストラクタパターンの最適化プロトタイ...

JavaScript - Vue でのスロットの使用: スロット

目次Vue でのスロットの使用: slotスコープ付きスロット: テンプレートタグで囲む要約するVu...

jsプロキシの原理の詳細な説明

目次プロキシモードとは何ですか?実例を紹介例を使ってプロキシモデルの定義を理解するプロキシとはget...

jQueryのanimateアニメーションメソッドとアニメーションキューイング問題の解決方法の詳しい説明

目次animate() アニメーションメソッドアニメーションキューイングdelay() メソッドアニ...

Nginx+Tomcat 負荷分散クラスタのインストールと構成のケースの詳細な説明

目次序文1. Nginx+Tomcat 2. Nginxサーバーを構成する3. Tomcatアプリケ...