Dockerのヘルス検出メカニズム

Dockerのヘルス検出メカニズム

コンテナの場合、最も単純なヘルスチェックはプロセス レベルのヘルスチェックであり、プロセスが稼働しているかどうかを確認します。 Docker Daemon はコンテナ内の PID1 プロセスを自動で監視します。docker run コマンドで再起動ポリシーを指定すれば、終了したコンテナをポリシーに従って自動的に再起動することができます。多くの実際のシナリオでは、プロセスレベルのヘルスチェック メカニズムのみを使用するだけでは十分ではありません。たとえば、コンテナ プロセスは実行中であるものの、アプリケーションのデッドロックによりユーザー要求に応答し続けることができません。このような問題は、プロセス監視では検出できません。

通常、停電や異常シャットダウン後にコンテナが自動的に起動できなくなるのを防ぐために、

--restart=常に

例えば

[root@aliyun ~]# docker run --restart=always -d --name blog -d -v /www:/www -v /wwwlogs:/var/log/wwwlogs -p 65423:65422 -p 80:80 -p 443:443 677
7714a84063ee6d405c80b891254bba0e5930f5d271c5ad76cfd6e2f0058d8056

この方法では、コンテナを自動的に再起動できますが、プログラムがデッドロック状態や無限ループ状態になり、アプリケーションプロセスが終了しないのにコンテナがサービスを提供できなくなることがあります。 1.12 より前では、Docker はコンテナのこの状態を検出せず、再スケジュールも行わないため、一部のコンテナはサービスを提供できないものの、ユーザー要求は引き続き受け付けることになります。

1.12 以降、Docker は HEALTHCHECK 命令を提供しています。これは、コンテナのメイン プロセスのサービス ステータスがまだ正常であるかどうかを判断するためのコマンド ラインを指定し、コンテナの実際のステータスをより現実的に反映します。

イメージに HEALTHCHECK 命令が指定されると、コンテナはそれに従って起動されます。初期状態は起動中です。HEALTHCHECK 命令のチェックが成功すると正常状態に変わります。一定回数連続して失敗すると、異常状態に変わります。

HEALTHCHECK は次のオプションをサポートしています。

  • –interval=<interval>: 2 つのヘルスチェック間の間隔。デフォルトは 30 秒です。
  • –timeout=<duration>: ヘルスチェック コマンドを実行するためのタイムアウト期間。この期間を超えると、ヘルスチェックは失敗とみなされます。デフォルトの時間は 30 秒です。
  • –retries=<number>: 指定された回数連続して失敗すると、コンテナの状態は異常とみなされます。デフォルトは 3 回です。 CMD や ENTRYPOINT と同様に、HEALTHCHECK は 1 回しか指定できません。複数のエントリが指定された場合は、最後のエントリのみが有効になります。

HEALTHCHECK [option] CMDに続くコマンドはENTRYPOINTと同じ形式ですが、シェル形式とexec形式に分けられます。コマンドの戻り値によって、ヘルス チェックが成功したかどうかが決まります。0: 成功、1: 失敗、2: 予約済み、この値は使用しないでください。

このdockerfileファイルを見てみましょう

Centosより
LABEL 管理者 "awen メール: <[email protected]>"
ワークディレクトリ /opt/

CentOS7-Base-163.repo を /etc/yum.repos.d/CentOS-Base.repo にコピーします。
nginx /etc/init.d/nginx をコピーします

環境変数 NGINX_V=1.13.5 \
  OPENSSL_V=1.0.2l \
  PCRE_V=8.41 \
  ZLIB_V=1.2.11 

yum -y update を実行します\
  && yum -y インストール openssh-server openssl gcc gcc-c++ pcre-devel openssl-devel zlib-devel wget make perl tar net-tools \
  && wget -c -4 https://nginx.org/download/nginx-$NGINX_V.tar.gz \
  && wget -c -4 https://www.openssl.org/source/openssl-$OPENSSL_V.tar.gz \
  && wget -c -4 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-$PCRE_V.tar.gz \
  && wget -c -4 http://zlib.net/zlib-$ZLIB_V.tar.gz \
  && グループアド -r www && ユーザーアド -r -g www www \
  && tar zxvf zlib-$ZLIB_V.tar.gz \
  && cd zlib-$ZLIB_V \
  && ./configure \
  && 作る \
  && インストール \
  && cd /opt \
  && tar zxvf pcre-$PCRE_V.tar.gz \
  && cd pcre-$PCRE_V \
  && ./configure \
  && 作る \
  && インストール \
  && cd /opt \
  && tar zxvf openssl-$OPENSSL_V.tar.gz \
  && tar zxvf nginx-$NGINX_V.tar.gz \
  && cd nginx-$NGINX_V \
  && ./configure --prefix=/usr/local/nginx --user=www --group=www --with-pcre=/opt/pcre-$PCRE_V --with-http_ssl_module --with-zlib=/opt/zlib-$ZLIB_V --with-openssl=/opt/openssl-$OPENSSL_V --with-http_v2_module --with-http_ssl_module \
  && 作る \
  && インストール \
  && rm -rf /opt/* \
  && mkdir -p /usr/local/nginx/ssl \
  && mkdir -p /usr/local/nginx/conf/vhost \
  && mkdir -p /var/log/wwwlogs/ \
  && mkdir -p /www/ \
  && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' \
  && ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N '' \
  && ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' \
  && ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N '' \
  && echo "RSAAuthentication yes" >> /etc/ssh/sshd_config \
  && echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config \
  && sed -i "s/PasswordAuthentication yes/PasswordAuthentication no/g" /etc/ssh/sshd_config \
  && sed -i "s/UsePAM yes/UsePAM no/g" /etc/ssh/sshd_config \
  && sed -i "s/#ポート22/ポート65422/g" /etc/ssh/sshd_config \
  && yum すべてをクリーンアップ \
  && mkdir /var/run/sshd \
  && chmod +x /etc/init.d/nginx \
  && rm -rf /root/*.cfg \
  && echo "アジア/上海" > /etc/localtime


ssl/* をコピー /usr/local/nginx/ssl/ 
コピー vhost/* /usr/local/nginx/conf/vhost/
nginx.conf をコピー /usr/local/nginx/conf/
コピー ssh/* /root/.ssh/


ボリューム ["/www","/var/log/wwwlogs","/usr/local/nginx/ssl","/usr/local/nginx/conf/vhost"]

エクスポーズ 65422 80 443

ヘルスチェック CMD curl -fs http://localhost/ || exit 1
エントリポイント /etc/init.d/nginx start && chown -R www:www /var/log/wwwlogs/ && /usr/sbin/sshd -D

ヘルスチェック CMD curl -fs http://localhost/ || exit 1

これは追加されたヘルスモニタリング構成で、コンパイルされて起動されます。プロセスを確認すると、そのステータスが開始中であることがわかります。

[root@aliyun ~]# docker ps -a
コンテナID イメージ コマンド 作成ステータス ポート名
7714a84063ee 677 "/bin/sh -c '/etc/ini" 3 秒前 2 秒前に起動 (ヘルス: 開始) 0.0.0.0:80->80/tcp、0.0.0.0:443->443/tcp、0.0.0.0:65423->65422/tcp ブログ

しばらく待つと、その状態が正常であることがわかります

[root@aliyun ~]# docker ps -a
コンテナID イメージ コマンド 作成ステータス ポート名
7714a84063ee 677 "/bin/sh -c '/etc/ini" 約 1 分前 起動 約 1 分 (正常) 0.0.0.0:80->80/tcp、0.0.0.0:443->443/tcp、0.0.0.0:65423->65422/tcp ブログ

検査を通じて過去3回のステータスを見ることができます

[root@aliyun ~]# docker inspect --format '{{json .State.Health}}' ブログ | python -m json.tool
{
  「失敗連続」: 0,
  「ログ」: [
    {
      「終了」: 「2017-10-11T11:15:27.516562686+08:00」、
      「終了コード」: 0,
      「出力」: 「<html>\r\n<head><title>301 永久に移動されました</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 永久に移動されました</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n」、
      「開始」: 「2017-10-11T11:15:27.470554485+08:00」
    },
    {
      「終了」: 「2017-10-11T11:15:57.563377729+08:00」、
      「終了コード」: 0,
      「出力」: 「<html>\r\n<head><title>301 永久に移動されました</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 永久に移動されました</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n」、
      「開始」: 「2017-10-11T11:15:57.516690754+08:00」
    },
    {
      「終了」: 「2017-10-11T11:16:27.609685416+08:00」、
      「終了コード」: 0,
      「出力」: 「<html>\r\n<head><title>301 永久に移動されました</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 永久に移動されました</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n」、
      「開始」: 「2017-10-11T11:16:27.563533362+08:00」
    },
    {
      「終了」: 「2017-10-11T11:16:57.654441173+08:00」、
      「終了コード」: 0,
      「出力」: 「<html>\r\n<head><title>301 永久に移動されました</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 永久に移動されました</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n」、
      「開始」: 「2017-10-11T11:16:57.609810588+08:00」
    },
    {
      「終了」: 「2017-10-11T11:17:27.701113019+08:00」、
      「終了コード」: 0,
      「出力」: 「<html>\r\n<head><title>301 永久に移動されました</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 永久に移動されました</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n」、
      「開始」: 「2017-10-11T11:17:27.654580727+08:00」
    }
  ]、
  「ステータス」:「健康」
}

ヘルスチェックが再試行回数を超えて連続して失敗すると、ステータスが (異常) に変わります。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Dockerはbusyboxを使用してベースイメージを作成します
  • DockerプライベートライブラリHarborのアーキテクチャとコンポーネントの説明
  • Docker ベースの Etcd 分散デプロイメントの方法と手順
  • Docker-compose ワンクリックデプロイ gitlab 中国語版の方法手順
  • Docker で Spring-boot プロジェクトをデプロイするためのサンプル コード
  • Docker で Docker0 ブリッジのデフォルトのネットワーク セグメントを変更する方法
  • Docker コンテナのデプロイの試み - マルチコンテナ通信 (node+mongoDB+nginx)
  • Docker は次の「Linux」になれるか?
  • Docker-compose を使用して GitLab をデプロイする方法
  • OpenShift のクイックインストールの詳細な手順

<<:  PID を作成できないために MySQL が起動できない問題を解決する方法

>>:  JSベースの手持ち連射機能+テキスト揺れ特殊効果コードの簡単実装

推薦する

Linux サービス管理の 2 つの方法、service と systemctl の詳細な説明

1.サービスコマンドサービスコマンドは実際には/etc/init.dディレクトリに移動し、関連プログ...

nginx ロケーション優先度の詳細な説明

場所表現タイプ~ は大文字と小文字を区別して通常の一致を実行することを示します~*は大文字と小文字を...

Linux でシェル スクリプトを使用して jar パッケージ プロジェクトを展開するための完全な手順

1. JDKをインストールする コンピュータの動作桁を確認します。 uname -ar 2017 x...

JS はシンプルなブロック崩しピンボールゲームを実装します

この記事では、ブロック崩しピンボールゲームを実装するためのJSの具体的なコードを参考までに紹介します...

Linux でメモリ使用量を確認する方法

システムの問題、アプリケーションの速度低下、または原因不明の問題をトラブルシューティングする場合、最...

Linux で大きなファイルの内容を消去または削除する 5 つの方法

Linux ターミナルでファイルを操作しているときに、Linux コマンドライン エディターでファイ...

Nginxでネットワーク分離を解決した実践記録を詳しく解説

必要最近、Node オンライン サービスを移行する必要があったため、2 つの新しいオンライン サーバ...

MySQL シリーズ 13 MySQL レプリケーション

目次1. MySQLレプリケーション関連の概念2. シンプルな1マスター1スレーブアーキテクチャの実...

JavaScript の遅延読み込み属性パターンを理解する

従来、開発者はインスタンスで必要になる可能性のあるデータに対して JavaScript クラス内にプ...

react+reduxを使用してカウンター機能を実装すると発生する問題

Redux はシンプルな状態マネージャーです。その歴史をたどることはしません。使用法の観点から見ると...

MySQLにおけるSQLの実行順序についてのちょっとした質問

今日、仕事中に左結合に関するSQLの問題に遭遇しました。後で解決しましたが、この問題を通じてSQLの...

MySQL の大文字と小文字の区別に関する注意

目次MySQLの大文字と小文字の区別はパラメータによって制御されますMySQLの大文字と小文字の区別...

XHTML 入門チュートリアル: シンプルな Web ページの作成

1 分で最初の Web ページを作成します。簡単な Web ページを作ってみましょう。ぜひフォローし...

MySQLデータベース移行により、大量のデータを迅速にエクスポートおよびインポートできます

データベースの移行は、よく遭遇する問題です。データ量が少ない場合、移行は基本的に問題になりません。実...

Linux/CentOS システムでネットワーク時間を同期する 2 つの方法の詳細な説明

ハードウェア上の理由により、機械は標準時間にある程度追いつけない場合があり、その誤差は 1 か月で数...