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 メール: <hi@awen.me>"
ワークディレクトリ /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ベースの手持ち連射機能+テキスト揺れ特殊効果コードの簡単実装

推薦する

JavaScript で虫眼鏡の特殊効果を実現

達成される効果:マウスを小さな画像の上に置くと、小さなブロックが小さな画像の上に表示され、この小さな...

JavaScript タイピングゲーム

この記事では、タイピングゲームを実装するためのJavaScriptの具体的なコードを参考までに紹介し...

docker-swarm をベースにした継続的インテグレーション クラスタ サービスの構築の詳細な説明

序文この記事は私自身の製作過程の簡単な記録です。練習中に質問があれば、一緒に話し合うことができます。...

MySQL 独立インデックスと共同インデックスの選択

複数列のインデックスについては、理解が不足していることがよくあります。よくある間違いは、多数の列に独...

HTML に CSS を導入するいくつかの方法の紹介

目次1. HTMLタグ要素にCSSスタイルを直接埋め込む2. HTMLのheadセクションにおけるス...

nginxプロキシsocket.ioサービスの落とし穴の詳細な説明

目次Nginx は 2 つの socket.io サーバーをプロキシします。 socket.ioの動...

Reactプロジェクトで要素を使用する方法

React プロジェクトで要素フレームワークを使用するのは今回が初めてです。非常に単純な問題に遭遇し...

LINUX でプロセスを表示する 4 つの方法 (要約)

プロセスは CPU とメモリ内で実行されるプログラム コードであり、各プロセスは 1 つ以上のプロセ...

nginx と Tencent Cloud の無料証明書を使用して https を作成する方法

httpsを取得する方法を勉強しています。最近、Tencent Cloud が提供する無料の SSL...

MySQL で複数の主キーが定義されているエラーの解決方法

主キーを作成するには 2 つの方法があります。 テーブルテーブル名を作成( フィールド名タイプ、 フ...

Sqoop エクスポート マップ 100% 削減 0% さまざまな理由と解決策でスタック

私はこのようなバグを典型的な「ハムレット」バグと呼んでいます。これは、「エラーメッセージは同じだが、...

JavaScript でイベントのバブリングを防ぐ方法

注意すべき点は、イベントバブリング自体の特性上、メリットだけでなくデメリットも生じるということです。...

VirtualBox での CentOS 8.1 仮想マシンのインストールを最小限に抑える詳細なチュートリアル

1. 関連ツールと画像をダウンロードするダウンロードリンクバーチャルボックス: https://do...

Linux オペレーティング システムに Apache サービスをインストールする方法

ダウンロードリンク:動作環境VMware 仮想マシンの CentOS 7.6セキュアCRT Xftp...

MySQL の制限ページング最適化ソリューションの実装に関する簡単な説明

MySQL のページングステートメントの使用制限Oracle や MS SqlServer と比較す...