コンテナの場合、最も単純なヘルスチェックはプロセス レベルのヘルスチェックであり、プロセスが稼働しているかどうかを確認します。 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 は次のオプションをサポートしています。
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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: PID を作成できないために MySQL が起動できない問題を解決する方法
>>: JSベースの手持ち連射機能+テキスト揺れ特殊効果コードの簡単実装
JavaScript でポインターの位置を取得する方法は、イベント オブジェクトの pageX と ...
シナリオ: docker で tomcat を起動すると (Alibaba Cloud からダウンロ...
プロジェクトで使用されている特殊文字とアイコンHTMLコードXML/HTML コードコンテンツをクリ...
この記事では、MySQL のスケジュールされたデータベース バックアップ操作の例について説明します。...
序文この記事では、Linux 構成ログ サーバーに関する関連コンテンツを主に紹介し、参考と学習のため...
ウェブサイトの場合、ユーザビリティとは、ユーザーが必要な情報を効果的に見つけたり、タスクを完了したり...
HTML、CSS、JS を使用してシンプルな Web 計算機を作成する方法は?コンピュータには次の...
この記事では、WeChatミニプログラムのビデオ弾幕の位置をランダム化するための具体的なコードを紹介...
レスポンシブ レイアウト システムは、今日の一般的な CSS フレームワークではすでに非常に一般的で...
問題現象: [root@localhost ~]# docker イメージをプル xxx.com.c...
目次1. 2つのモジュールの違い2. Node.jsとの違い3. CommonJSモジュールの読み込...
Centos6にZLMediaKitをインストールするZLMediaKit の作者は Ubuntu ...
インストール プロセスは、コンパイル手順を除いて、基本的にソース バージョンと同じです。この記事では...
インストール中に遭遇した問題を記録しておきますので、皆様のお役に立てれば幸いです。 1. ダウンロー...
カスタムパラメータを渡すだけhtml <div id="アプリ"> ...