Dockers Mechanismus zur Integritätserkennung

Dockers Mechanismus zur Integritätserkennung

Für Container ist die einfachste Integritätsprüfung die Integritätsprüfung auf Prozessebene, die überprüft, ob der Prozess aktiv ist. Der Docker Daemon überwacht automatisch den PID1-Prozess im Container. Wenn im Docker-Run-Befehl die Neustartrichtlinie angegeben ist, kann der beendete Container gemäß der Richtlinie automatisch neu gestartet werden. In vielen praktischen Szenarien reicht die Verwendung von Integritätsprüfmechanismen allein auf Prozessebene bei weitem nicht aus. Beispielsweise kann der Containerprozess, obwohl er noch läuft, aufgrund eines Anwendungsdeadlocks nicht mehr auf Benutzeranforderungen reagieren. Solche Probleme können durch die Prozessüberwachung nicht erkannt werden.

Um zu verhindern, dass der Container nach einem Stromausfall oder einer abnormalen Abschaltung nicht automatisch gestartet werden kann, können wir normalerweise Folgendes hinzufügen:

--restart=immer

Zum Beispiel

[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

Auf diese Weise kann der Container automatisch neu gestartet werden, manchmal gerät das Programm jedoch in einen Deadlock-Zustand oder einen Endlosschleifenzustand, der Anwendungsprozess wird nicht beendet, aber der Container kann keine Dienste mehr bereitstellen. Vor 1.12 konnte Docker diesen Zustand des Containers nicht erkennen und ihn nicht neu planen. Dies führte dazu, dass einige Container zwar keine Dienste bereitstellen konnten, aber weiterhin Benutzeranforderungen akzeptierten.

Seit 1.12 verfügt Docker über die Anweisung HEALTHCHECK, die eine Befehlszeile angibt, um zu bestimmen, ob der Servicestatus des Hauptprozesses des Containers noch normal ist, und so den tatsächlichen Status des Containers realistischer widerspiegelt.

Wenn die HEALTHCHECK-Anweisung in einem Image angegeben ist, wird der Container damit gestartet. Der Anfangsstatus ist „Starten“. Nachdem die Prüfung der HEALTHCHECK-Anweisung erfolgreich war, ändert sich der Status in „Healthy“. Wenn die Prüfung eine bestimmte Anzahl von Malen hintereinander fehlschlägt, ändert sich der Status in „Unhealthy“.

HEALTHCHECK unterstützt die folgenden Optionen:

  • –interval=<Intervall>: Das Intervall zwischen zwei Integritätsprüfungen, der Standardwert beträgt 30 Sekunden;
  • –timeout=<Dauer>: Die Zeitüberschreitungsdauer für die Ausführung des Integritätsprüfungsbefehls. Wenn diese Zeitspanne überschritten wird, gilt die Integritätsprüfung als fehlgeschlagen. Die Standardzeit beträgt 30 Sekunden.
  • –retries=<Anzahl>: Nach einer bestimmten Anzahl aufeinanderfolgender Fehler wird der Containerstatus als fehlerhaft betrachtet. Der Standardwert ist 3 Mal. HEALTHCHECK kann wie CMD und ENTRYPOINT nur einmal vorkommen. Wenn mehrere Einträge angegeben werden, wird nur der letzte wirksam.

Der auf HEALTHCHECK [Option] CMD folgende Befehl hat dasselbe Format wie ENTRYPOINT, das in Shell-Format und Exec-Format unterteilt werden kann. Der Rückgabewert des Befehls bestimmt, ob die Integritätsprüfung erfolgreich ist oder nicht: 0: Erfolg; 1: Fehler; 2: reserviert, verwenden Sie diesen Wert nicht.

Schauen wir uns diese Dockerfile-Datei an

VON centos
LABEL-Betreuer „awen Email: <[email protected]>“
ARBEITSVERZEICHNIS /opt/

KOPIEREN CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repo
KOPIEREN Sie nginx /etc/init.d/nginx

ENV NGINX_V=1.13.5 \
  OPENSSL_V=1.0.2l \
  PCRE_V=8,41 \
  ZLIB_V=1.2.11 

Führen Sie den Befehl yum -y update \ aus.
  && yum -y installiere OpenSSH-Server, OpenSSL, GCC, GCC-C++, PCRE-Entwicklung, OpenSSL-Entwicklung, Zlib-Entwicklung, 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 \
  && Gruppenzuordnung -r www && Benutzerzuordnung -r -g www www \
  && tar zxvf zlib-$ZLIB_V.tar.gz \
  && cd zlib-$ZLIB_V \
  && ./konfigurieren \
  && machen \
  && make install \
  && cd /opt \
  && tar zxvf pcre-$PCRE_V.tar.gz \
  && cd pcre-$PCRE_V \
  && ./konfigurieren \
  && machen \
  && make install \
  && 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 \
  && machen \
  && make install \
  && 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 ja" >> /etc/ssh/sshd_config \
  && sed -i "s/PasswordAuthentication yes/PasswordAuthentication no/g" /etc/ssh/sshd_config \
  && sed -i "s/UsePAM ja/UsePAM nein/g" /etc/ssh/sshd_config \
  && sed -i "s/#Port 22/Port 65422/g" /etc/ssh/sshd_config \
  && yum alles reinigen \
  && mkdir /var/run/sshd \
  && chmod +x /etc/init.d/nginx \
  && rm -rf /root/*.cfg \
  && echo "Asien/Shanghai" > /etc/lokale Zeit


KOPIEREN ssl/* /usr/local/nginx/ssl/ 
KOPIEREN vhost/* /usr/local/nginx/conf/vhost/
KOPIEREN Sie nginx.conf /usr/local/nginx/conf/
KOPIEREN ssh/* /root/.ssh/


VOLUME ["/www", "/var/log/wwwlogs", "/usr/local/nginx/ssl", "/usr/local/nginx/conf/vhost"]

AUSLEGEN 65422 80 443

GESUNDHEITSCHECK CMD curl -fs http://localhost/ || Ausfahrt 1
EINSTIEGSPUNKT /etc/init.d/nginx start && chown -R www:www /var/log/wwwlogs/ && /usr/sbin/sshd -D

In

GESUNDHEITSCHECK CMD curl -fs http://localhost/ || Ausfahrt 1

Es handelt sich um die hinzugefügte Konfiguration zur Integritätsüberwachung, die dann kompiliert und gestartet wird. Wenn Sie den Prozess überprüfen, werden Sie feststellen, dass sein Status „Starten“ lautet.

[root@aliyun ~]# docker ps -a
CONTAINER ID BILD BEFEHL ERSTELLT STATUS PORTS NAMEN
7714a84063ee 677 "/bin/sh -c '/etc/ini" vor 3 Sekunden. 2 Sekunden aktiv (Gesundheit: wird gestartet) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:65423->65422/tcp Blog

Warten Sie einen Moment und Sie werden feststellen, dass sein Status gesund ist

[root@aliyun ~]# docker ps -a
CONTAINER ID BILD BEFEHL ERSTELLT STATUS PORTS NAMEN
7714a84063ee 677 "/bin/sh -c '/etc/ini" Vor etwa einer Minute Aktiv Vor etwa einer Minute (fehlerfrei) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:65423->65422/tcp Blog

Wir können den Status der letzten drei Male durch Inspect einsehen

[root@aliyun ~]# docker inspect --format '{{json .State.Health}}' blog | python -m json.tool
{
  "FailingStreak": 0,
  "Protokoll": [
    {
      "Ende": "2017-10-11T11:15:27.516562686+08:00",
      "ExitCode": 0,
      "Ausgabe": "<html>\r\n<head><title>301 dauerhaft verschoben</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 dauerhaft verschoben</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n",
      "Start": "2017-10-11T11:15:27.470554485+08:00"
    },
    {
      "Ende": "2017-10-11T11:15:57.563377729+08:00",
      "ExitCode": 0,
      "Ausgabe": "<html>\r\n<head><title>301 dauerhaft verschoben</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 dauerhaft verschoben</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n",
      "Start": "2017-10-11T11:15:57.516690754+08:00"
    },
    {
      "Ende": "2017-10-11T11:16:27.609685416+08:00",
      "ExitCode": 0,
      "Ausgabe": "<html>\r\n<head><title>301 dauerhaft verschoben</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 dauerhaft verschoben</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n",
      "Start": "2017-10-11T11:16:27.563533362+08:00"
    },
    {
      "Ende": "2017-10-11T11:16:57.654441173+08:00",
      "ExitCode": 0,
      "Ausgabe": "<html>\r\n<head><title>301 dauerhaft verschoben</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 dauerhaft verschoben</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n",
      "Start": "2017-10-11T11:16:57.609810588+08:00"
    },
    {
      "Ende": "2017-10-11T11:17:27.701113019+08:00",
      "ExitCode": 0,
      "Ausgabe": "<html>\r\n<head><title>301 dauerhaft verschoben</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 dauerhaft verschoben</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n",
      "Start": "2017-10-11T11:17:27.654580727+08:00"
    }
  ],
  "Status": "gesund"
}

Wenn die Integritätsprüfung über die Anzahl der Wiederholungsversuche hinaus kontinuierlich fehlschlägt, ändert sich der Status in „(fehlerhaft)“.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Docker verwendet Busybox, um ein Basis-Image zu erstellen
  • Architektur und Komponentenbeschreibung der privaten Docker-Bibliothek Harbor
  • Methoden und Schritte für die verteilte Bereitstellung von Etcd basierend auf Docker
  • Docker-Compose - Bereitstellung der chinesischen Gitlab-Version per Mausklick - Methodenschritte
  • Beispielcode zum Bereitstellen eines Spring-Boot-Projekts mit Docker
  • So ändern Sie das Standardnetzwerksegment der Docker0-Brücke in Docker
  • Versuch der Bereitstellung von Docker-Containern – Kommunikation mit mehreren Containern (Node+MongoDB+Nginx)
  • Kann Docker das nächste „Linux“ werden?
  • So stellen Sie Gitlab mit Docker-Compose bereit
  • Detaillierte Schritte zur schnellen Installation von Openshift

<<:  So lösen Sie das Problem, dass MySQL nicht gestartet werden kann, da keine PID erstellt werden kann

>>:  Einfache Implementierung der Handheld-Sperrfeuerfunktion + Textschüttel-Spezialeffektcode basierend auf JS

Artikel empfehlen

Grundlegende Nutzungsdetails zur Vue-Komponentenbildung

Inhaltsverzeichnis 1. Was ist Komponentenbildung?...

Implementierungscode der Front-End-HTML-Skin-Änderungsfunktion

50 Zeilen Code zum Ändern von 5 Hautfarben, einsc...

Beispiel zum Erstellen und Ausführen mehrerer MySQL-Container in Docker

1. Verwenden Sie das Image mysql/mysql-server:lat...

So erstellen Sie einen Redis-Cluster mit Docker

Inhaltsverzeichnis 1. Erstellen Sie ein Redis-Doc...

Teilen Sie das Problem, dass Ubuntu 19 die Docker-Quelle nicht installieren kann

Entsprechend den wichtigsten Websites und persönl...

Mit JS ein kleines Flugzeugkriegsspiel implementieren

In diesem Artikelbeispiel wird der spezifische JS...

So löschen Sie Dateinamen oder Verzeichnisse mit Sonderzeichen in Linux

Löschen einer Datei anhand ihrer Inode-Nummer Ver...

Analyse des Funktionsprinzips und des Implementierungsprozesses von Docker Hub

Ähnlich wie der von GitHub bereitgestellte Code-H...

Grundlegende Ideen zum Auffinden von Fehlern in der Web-Frontend-Entwicklung

Die WEB-Entwicklung besteht hauptsächlich aus zwe...

So fragen Sie schnell 10 Millionen Datensätze in MySQL ab

Inhaltsverzeichnis Normale Paging-Abfrage So opti...