シェルスクリプトによるDockerコンテナの起動順序の制御の詳細な説明

シェルスクリプトによるDockerコンテナの起動順序の制御の詳細な説明

1. 遭遇した問題

分散プロジェクトの展開プロセスでは、サーバーの再起動後にアプリケーション(データベースを含む)を自動的に復元できることが求められることがよくあります。docker docker update --restart=always containeridを使用すると、dockerでコンテナを自動的に起動できますが、データベースの起動後に起動することを保証することはできません。データベースが起動していないと、アプリケーションの起動は失敗します。インターネットには、docker-composeコンテナ配置を通じて起動順序を制御するソリューションもありますが、ブロガーはあまり研究していません。

2. 解決策

シェルスクリプトを使用して制御します。考え方は次のとおりです。

データベース ポートを検出して、データベースが正常に起動したかどうかを確認します。データベースが正常に起動したら、構成センターとサービス登録センターのポートを検出して、正常に起動したかどうかを確認します。データベースと構成センターが起動したら、他のマイクロサービス アプリケーションを起動します。

3. ポート検出

ポート検出に使用するコマンドは

nc -w 1 host port </dev/null && echo "200"

ホスト: 対象ホストのIPアドレス

port: サービスがリッスンするポート

サービスが開始されている場合、このコマンドは 200 を返します。それ以外の場合は何も返しません。

4. シェルスクリプト

コードを直接貼り付けます。使用される構成センターはnacosです。

#!/bin/bash
#chkconfig: 2345 80 90
#説明:autoStartMaintenanceService.sh
#
#前提:
#1. コンピュータの電源がオンになると、Docker が自動的に起動できる必要があります。#2. Docker は、運用および保守サービスを正常に開始できます。#3. このスクリプトは、マイクロサービスが配置されているマシンで実行する必要があります。#
##変更が必要な構成-----開始##データベースが配置されているマシンの IP
データベースホスト=192.169.1.52
##データベースリスニングポート DATABASE_PORT=3306
##マイクロサービスが配置されているマシンのIP
ローカルホスト=192.169.1.46
##マイクロサービス アクセス ポート Maintenance_Port=8180
##NACOS が配置されているマシンの IP
NACOS_HOST=192.169.1.82
##NACOS リスニングポート NACOS_PORT=8848
##マイクロサービス コンテナ名 (NAMES 列)
メンテナンスコンテナ名="umc-maintenance"
##スクリプトによって生成されたログパス Log_Path=/home/test/log
## 変更が必要な設定 ----- 終了 ##
##ループ遅延時間 (秒) LOOP_TIME=5
時刻 =""
日付:

時刻を取得する() {
 at_time="$(日付 +%Y-%m-%d-%H:%M:%S) --- "
 at_date=$(日付 +%Y-%m-%d)
}

自動開始Webサービス() {
 ##ログパスが存在しない場合は作成します if [ ! -d "$Log_Path" ]; then
  mkdir -p $ログパス
 フィ

 真実である一方、
  ##データベースが起動しているかどうかを判断します req_message=$(nc -w 1 ${DATABASE_HOST} ${DATABASE_PORT} </dev/null && echo "200")
  if [ -n "$req_message" ]; then
   取得時刻
   echo "$at_time データベースが実行中です" >>${Log_Path}/"$at_date"_autoStartMaintenanceService.log
   waitNacos開始
  それ以外
   取得時刻
   echo "$at_time データベースは実行されていません。データベースが起動するまでお待ちください" >>${Log_Path}/"$at_date"_autoStartMaintenanceService.log
   スリープ $LOOP_TIME
  フィ
 終わり
}
##Nacosが起動したか判断する waitNacosStarting() {
 req_message=$(nc -w 1 ${NACOS_HOST} ${NACOS_PORT} </dev/null && echo "200")
 テスト$((req_message)) -eq 200;の場合
  取得時刻
  echo "$at_time Nacos が実行中です" >>${Log_Path}/"$at_date"_autoStartMaintenanceService.log
  メンテナンスサービスの開始
  スリープ $LOOP_TIME
 それ以外
  取得時刻
  echo "$at_time Nacos は実行されていません。nacos が起動するまでお待ちください" >>${Log_Path}/"$at_date"_autoStartMaintenanceService.log
  スリープ $LOOP_TIME
 フィ
}

##マイクロサービスを開始する startMaintenanceService() {
 req_message=$(nc -w 1 ${LOCAL_HOST} ${Maintenance_Port} </dev/null && echo "200")
 テスト$((req_message)) -eq 200;の場合
  取得時刻
  echo "$at_time メンテナンスサービスが実行中です" >>${Log_Path}/"$at_date"_autoStartMaintenanceService.log
 それ以外
  container_id=$(docker ps -a | grep $Maintenance_Container_Name | grep -v grep | awk '{print $1}')
  取得時刻
  echo "$at_time メンテナンスサービスコンテナ ID は ${container_id} です" >>${Log_Path}/"$at_date"_autoStartMaintenanceService.log
  docker を起動 ${container_id}
 フィ

}

自動開始Webサービス

5. シェルの入力と出力のリダイレクト

このスクリプトを書いている間、ブロガーはシェルの入力と出力のリダイレクトにも慣れてきました。

通常、各 Unix/Linux コマンドは実行時に 3 つのファイルを開きます。

  • 標準入力ファイル (stdin): stdin のファイル記述子は 0 であり、Unix プログラムはデフォルトで stdin からデータを読み取ります。
  • 標準出力ファイル (stdout): stdout のファイル記述子は 1 で、Unix プログラムはデフォルトでデータを stdout に出力します。
  • 標準エラー ファイル (stderr): stderr のファイル記述子は 2 で、Unix プログラムはエラー情報を stderr ストリームに書き込みます。

コマンドの説明
コマンド > ファイルは出力をファイルにリダイレクトし、ファイルを上書きします
コマンド < file は入力をファイルにリダイレクトします
コマンド >> ファイルは出力をファイルに追加モードでリダイレクトします。
コマンド2> ファイルはエラーをファイルに出力し、ファイルを上書きします
コマンド 2>> ファイルはエラーを追加モードでファイルにリダイレクトします
<<タグは開始タグと終了タグの間の内容を入力として受け取ります

stdout と stderr をマージしてファイルにリダイレクトする場合 (つまり、正しい情報とエラー情報の両方をファイルに出力する場合)、次のように記述できます。

コマンド > ファイル 2>&1
またはコマンド >> ファイル 2>&1

/dev/null ファイル

/dev/null は特別なファイルです。そこに書き込まれたものはすべて破棄されます。そこから読み取ろうとすると、何も得られません。ただし、/dev/null ファイルは非常に便利です。コマンドの出力をこのファイルにリダイレクトすると、出力が無効になります。

command > /dev/null 2>&1 stdout と stderr をブロックする可能性があります

参照する

初心者向けチュートリアル - シェル

これで、Docker コンテナの起動順序を制御する Shell スクリプトに関するこの記事は終了です。関連する Shell スクリプトによる Docker 制御のコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Dockerはコンテナとホスト間でのシェルコマンドのシームレスな呼び出しを可能にします
  • Dockerコンテナシェルスクリプトの実行ステータスを監視する方法
  • DockerでLinuxシェルコマンドを実行する方法
  • ホスト上のDockerコンテナ内でシェルまたはプログラムを実行する
  • シェルスクリプトを使用して Docker サービスを一括で開始および停止する
  • シェルスクリプトは、Docker の半自動コンパイル、パッケージ化、およびリリースアプリケーション操作を構築します。

<<:  Linux ホスト上で複数の MySQL データベースを起動する方法

>>:  Vue ルーティング遅延読み込みの詳細

推薦する

MySQLデータベースに接続し、クエリ操作を実行するためのIDEAの完全なコード

1.まずMysqlリンク設定ページを書く パッケージ com.wretchant.fredis.me...

MySQL の不正な文字列値の解決方法

MySQL を使用して中国語の文字を挿入すると、多くの友人から次のエラーが報告されます。 これは、文...

mysql8.0.19 でパスワードを忘れた場合の完璧な解決策

おすすめの読み物: MySQL 8.0.19 は、間違ったパスワードを 3 回入力するとアカウント ...

MySQL 最適化における B ツリー インデックスの知識ポイントのまとめ

SQL を最適化する必要があるのはなぜですか?当然ですが、SQL ステートメントを記述する場合、次の...

Nginx でバージョン番号を隠す方法

Nginx はバージョン番号を非表示にする実稼働環境では、セキュリティ上の脆弱性の漏洩を避けるために...

MySQL 最適化接続最適化

記事「MySQL の最適化: キャッシュの最適化」では、システムによってコンパイルされた変数値、また...

モバイル ブラウザのビューポート パラメータ (Web フロントエンド デザイン)

モバイル ブラウザは、Web ページを仮想の「ウィンドウ」(ビューポート) に配置します。このウィン...

MySQL InnoDB ReplicaSet の簡単な紹介

目次01 InnoDBレプリカセットの紹介02 InnoDBレプリカセットの制限03 導入前に知って...

uniappとvueの違いの詳細な説明

目次1. シンプルなページの例2.uni-appはvueコンポーネントとミニプログラムネイティブコン...

CSS で div 凹角スタイルを実装するサンプル コード

通常の開発では、凸型の丸い角、つまり border-radius 属性を使用するのが一般的です。凹角...

MySQL 5.7.10 winx64 のインストールと設定方法のグラフィック チュートリアル (win10)

MySQL は比較的使いやすいリレーショナル データベースです。今日は、win10 システムを再イ...

JavaScript でよく使われる 3 つの Web エフェクトの詳細な説明

目次1要素オフセットシリーズ1.1 オフセットの概要1.2 オフセットとスタイルの違い視覚領域クライ...

MySQLストレージエンジンについて学びましょう

目次序文1. MySQL メインストレージエンジン: 2. さまざまなストレージエンジンがテーブルを...

Mysql 8.0.18 ハッシュ結合テスト (推奨)

ハッシュ結合ハッシュ結合は実行にインデックスを必要とせず、ほとんどの場合、現在のブロックネストループ...

iframe を介してフレームセットを本体に配置する

フレームセットと本文は同じレベルにあるため、本文にフレームセットを配置することはできません。まずペー...