Detaillierte Erläuterung der Gründe und Lösungen für den Fehler beim normalen Start von Docker

Detaillierte Erläuterung der Gründe und Lösungen für den Fehler beim normalen Start von Docker

1. Abnormale Leistung beim Docker-Start:

1. Der Status wird wiederholt neu gestartet. Überprüfen Sie dies mit dem Befehl

$ Docker ps -a
CONTAINER ID BILD BEFEHL ERSTELLT STATUS PORTS NAMEN
21c09be88c11 docker.xxxx.cn:5000/xxx-tes/xxx_tes:1.0.6 "/usr/local/tomcat..." vor 9 Tagen Neustart (1) Vor weniger als einer Sekunde xxx10

2. Es gibt offensichtliche Probleme mit Docker-Protokollen:

$docker logs [Containername/Container-ID]

2. Mögliche Gründe für Abnormalitäten beim Docker-Start:

2.1. Nicht genügend Speicher

Zum Starten benötigt Docker mindestens 2 GB Arbeitsspeicher. Führen Sie zunächst den Befehl free -mh aus, um zu prüfen, ob der verbleibende Arbeitsspeicher ausreicht.

Speicher direkt anzeigen

$frei -mh
      insgesamt genutzter freier gemeinsamer Buff/Cache verfügbar
Speicher: 15 G 14 G 627 M 195 M 636 M 726 M
Tauschen: 0B 0B 0B

Protokolle analysieren

Manchmal ist der Speicher kurzzeitig überlastet, was dazu führt, dass einige Prozesse beendet werden. Es scheint, als sei der Speicher ausreichend, aber tatsächlich wird Docker wiederholt neu gestartet. Eine weitere Analyse ist anhand der Docker-Protokoll- und Systemprotokollinformationen erforderlich:

Analysieren von Docker-Protokollen

Überprüfen Sie das Docker-Protokoll, um Informationen zum Speicherüberlauf zu erhalten. Sie müssen es sorgfältig lesen, um die Informationen zu finden. Es steht nicht ganz unten

$docker logs [Containername/Container-ID]|weniger 
Java HotSpot(TM) 64-Bit Server VM-Warnung: INFO: os::commit_memory(0x0000000769990000, 1449590784, 0) fehlgeschlagen; Fehler='Speicher kann nicht zugewiesen werden' (errno=12)
#
# Es ist nicht genügend Speicher vorhanden, um die Java Runtime Environment fortzusetzen.
# Bei der nativen Speicherzuweisung (malloc) konnten 1449590784 Bytes zum Festschreiben des reservierten Speichers nicht zugewiesen werden.
# Eine Fehlerberichtsdatei mit weiteren Informationen wird wie folgt gespeichert:
# //hs_err_pid1.log
Java HotSpot(TM) 64-Bit Server VM-Warnung: INFO: os::commit_memory(0x0000000769990000, 1449590784, 0) fehlgeschlagen; Fehler='Speicher kann nicht zugewiesen werden' (errno=12)
#
# Es ist nicht genügend Speicher vorhanden, um die Java Runtime Environment fortzusetzen.
# Bei der nativen Speicherzuweisung (malloc) konnten 1449590784 Bytes zum Festschreiben des reservierten Speichers nicht zugewiesen werden.
# Eine Fehlerberichtsdatei mit weiteren Informationen wird wie folgt gespeichert:
# /tmp/hs_err_pid1.log
Java HotSpot(TM) 64-Bit Server VM-Warnung: INFO: os::commit_memory(0x0000000769990000, 1449590784, 0) fehlgeschlagen; Fehler='Speicher kann nicht zugewiesen werden' (errno=12)
#
# Es ist nicht genügend Speicher vorhanden, um die Java Runtime Environment fortzusetzen.
# Bei der nativen Speicherzuweisung (malloc) konnten 1449590784 Bytes zum Festschreiben des reservierten Speichers nicht zugewiesen werden.
# Protokolldatei kann nicht gespeichert werden, auf dem Bildschirm ausgeben.
#
# Es ist nicht genügend Speicher vorhanden, um die Java Runtime Environment fortzusetzen.
# Bei der nativen Speicherzuweisung (malloc) konnten 1449590784 Bytes zum Festschreiben des reservierten Speichers nicht zugewiesen werden.
# Mögliche Gründe:
# Das System verfügt nicht über genügend physischen RAM oder Swap-Speicher
# Im 32-Bit-Modus wurde die Prozessgrößenbeschränkung erreicht
# Mögliche Lösungen:
# Reduzieren Sie die Speicherlast des Systems
# Erhöhen Sie den physischen Speicher oder den Swap-Speicher
# Überprüfen Sie, ob der Swap-Backing-Store voll ist
# Verwenden Sie 64-Bit-Java auf einem 64-Bit-Betriebssystem
# Java-Heapgröße verringern (-Xmx/-Xms)
# Anzahl der Java-Threads verringern
# Java-Thread-Stack-Größen verringern (-Xss)
# Größeren Code-Cache mit -XX:ReservedCodeCacheSize= einstellen
# Diese Ausgabedatei ist möglicherweise abgeschnitten oder unvollständig.
#
# Nicht genügend Arbeitsspeicherfehler (os_linux.cpp:2756), pid=1, tid=140325689620224
#
# JRE-Version: (7.0_79-b15) (Build)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.79-b02, gemischter Modus, Linux-AMD64, komprimiert, ups)
# Core Dump geschrieben. Standardspeicherort: //core oder core.1
#

Analysieren Sie Systemprotokolle

Beim Überprüfen des Systemprotokolls fand ich eine große Anzahl von Aufzeichnungen über Prozesse, die aufgrund eines Speicherüberlaufs beendet wurden.

$grep -i 'Nicht genügend Arbeitsspeicher' /var/log/messages
7. April 10:04:02 Centos106-Kernel: Nicht genügend Arbeitsspeicher: Prozess 1192 (Java) beenden, Punktzahl 54 oder Kind opfern
7. April 10:08:00 Centos106-Kernel: Nicht genügend Arbeitsspeicher: Prozess 2301 (Java) beenden, Punktzahl 54 oder Kind opfern
7. April 10:09:59 Centos106-Kernel: Nicht genügend Arbeitsspeicher: Prozess 28145 (Java) beenden, Punktzahl 52 oder Kind opfern
7. April 10:20:40 Centos106-Kernel: Nicht genügend Arbeitsspeicher: Prozess 2976 (Java) beenden, Punktzahl 54 oder Kind opfern
7. April 10:21:08 Centos106-Kernel: Nicht genügend Arbeitsspeicher: Prozess 3577 (Java) beenden, Punktzahl 47 oder Kind opfern
7. April 10:21:08 Centos106-Kernel: Nicht genügend Arbeitsspeicher: Prozess 3631 (Java) beenden, Punktzahl 47 oder Kind opfern
7. April 10:21:08 Centos106-Kernel: Nicht genügend Arbeitsspeicher: Prozess 3634 (Java) beenden, Punktzahl 47 oder Kind opfern
7. April 10:21:08 Centos106-Kernel: Nicht genügend Arbeitsspeicher: Prozess 3640 (Java) beenden, Punktzahl 47 oder Kind opfern
7. April 10:21:08 Centos106-Kernel: Nicht genügend Arbeitsspeicher: Prozess 3654 (Java) beenden, Punktzahl 47 oder Kind opfern
7. April 10:27:27 Centos106-Kernel: Nicht genügend Arbeitsspeicher: Prozess 6998 (Java) beenden, Punktzahl 51 oder Kind opfern
7. April 10:27:28 Centos106-Kernel: Nicht genügend Arbeitsspeicher: Prozess 7027 (Java) beenden, Punktzahl 52 oder Kind opfern
7. April 10:28:10 Centos106-Kernel: Nicht genügend Arbeitsspeicher: Prozess 7571 (Java) beenden, Punktzahl 42 oder Kind opfern
7. April 10:28:10 Centos106-Kernel: Nicht genügend Arbeitsspeicher: Prozess 7586 (Java) beenden, Punktzahl 42 oder Kind opfern

2.2. Port-Konflikt

Der Docker-Abhörport wurde von anderen Prozessen belegt. Dieses Problem tritt häufig bei neu bereitgestellten Diensten oder bei der Bereitstellung neuer Hintergrunddienste auf dem ursprünglichen Computer auf. Daher sollten Sie vor der Bereitstellung einen Befehl ausführen, um zu prüfen, ob der Port belegt ist. Wenn nach dem Online-Gehen festgestellt wird, dass er belegt ist, sollten Sie ihn auf einen verfügbaren Port ändern und neu starten.

Prüfbefehl: $netstat -nltp|grep [geplante Portnummer]

3. Gegenmaßnahmen

3.1. Gegenmaßnahmen bei Speichermangel:

Gegenmaßnahme 1:
3.1.1 Nach zu langer Ausführung belegt der SaltStack Minion möglicherweise viel Speicher und muss neu gestartet werden. Der Neustartbefehl funktioniert manchmal möglicherweise nicht. Überprüfen Sie vor allem den laufenden Status. Wenn er nicht gestoppt werden kann, starten Sie ihn neu.

Gegenmaßnahme 2:
3.2.2 Wenn das ELK-Protokollsammlungsprogramm oder andere Java-Prozesse zu viel Speicherplatz beanspruchen, überprüfen Sie dies mit den Befehlen top und ps, bestimmen Sie sorgfältig die Rolle des Prozesses und stoppen Sie den entsprechenden Prozess, ohne das Geschäft zu beeinträchtigen.

Strategie 3:
Den belegten Speicher (Buff/Cache) freigeben:
$sync #Speicherdaten auf die Festplatte schreiben
$echo 3 > /proc/sys/vm/drop_caches #Den belegten Speicher freigeben

Gegenmaßnahme 4:
Manchmal liegt es nicht daran, dass der Buff/Cache zu hoch ist, was zu unzureichendem Speicher führt, sondern daran, dass der Speicher tatsächlich von vielen notwendigen Prozessen verbraucht wird. In diesem Fall muss das Problem aus der Perspektive der Zuweisung und Nutzung von Maschinenressourcen betrachtet und gelöst werden.

3.2 Gegenmaßnahmen bei Hafenkonflikten

Gegenmaßnahme 1:
Im Allgemeinen tritt dieses Problem häufig bei neu bereitgestellten Diensten oder bei der Bereitstellung neuer Hintergrunddienste auf dem ursprünglichen Computer auf. Daher sollten Sie vor der Bereitstellung einen Befehl ausführen, um zu prüfen, ob der Port belegt ist. Wenn nach dem Online-Zugriff festgestellt wird, dass er belegt ist, sollten Sie ihn auf einen verfügbaren Port ändern und neu starten.
Prüfbefehl: $netstat -nltp|grep [geplante Portnummer]

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:
  • CentOS7 installiert Docker, um das Problem zu lösen, dass es nicht gestartet werden kann
  • Detaillierte Erklärung, wie Docker ein CentOS-Image startet
  • Lösung und Implementierungsschritte für den Fall, dass der CentOS7-Docker-Dienst nicht gestartet werden kann
  • So starten Sie mehrere Dienste gleichzeitig in Docker
  • So rufen Sie den Startcontainer in Docker auf
  • Der Unterschied zwischen zwei Möglichkeiten zum Erstellen eines Docker-Images und Starten des Containers (Zusammenfassung)
  • Lösung für MySQL-Initialisierungs- und Startfehler in Docker
  • Beispiel für den automatischen Start eines Anwendungsdienstes in einem Docker-Container
  • So implementieren Sie den Selbststart eines Docker-Containers
  • So erstellen, starten und stoppen Sie einen Docker-Container

<<:  Verwendung von Vue-Filtern und benutzerdefinierten Anweisungen

>>:  Grafisches Tutorial zur Installation und Konfiguration der MSI-Version von MySQL 8.0.11

Artikel empfehlen

CentOS7-Konfiguration Alibaba Cloud Yum-Quellmethodencode

Öffnen Sie den Centos Yum-Ordner Geben Sie den Be...

Lösung für die Upload-Einschränkung von Element-ui-Uploaddateien

Frage Die Angabe des Typs der hochgeladenen Datei...

Rundungsvorgang des Datums-/Uhrzeitfelds in MySQL

Inhaltsverzeichnis Vorwort 1. Hintergrund 2. Simu...

So entwerfen und optimieren Sie MySQL-Indizes

Inhaltsverzeichnis Was ist ein Index? Prinzip der...

So installieren Sie Docker und konfigurieren Alibaba Cloud Image Accelerator

Docker-Installation Über die Installation auf ein...

Beispielcode für die Codevorlage für die Linux C-Protokollausgabe

Vorwort Dieser Artikel stellt hauptsächlich den r...

Installieren Sie eine virtuelle Python-Umgebung in Ubuntu 18.04

Nur als Referenz für Python-Entwickler, die Ubunt...

Lassen Sie uns über die beiden Funktionen von try catch in Javascript sprechen

Das Programm wird sequentiell von oben nach unten...

Vue muss Wissenspunkte lernen: die Verwendung von forEach()

Vorwort Bei der Frontend-Entwicklung stoßen wir h...

CSS fügt Scroll zu Div hinzu und verbirgt die Bildlaufleiste

CSS fügt dem div Scrollen hinzu und verbirgt die ...

Zusammenfassung zum Sharding von MySQL-Datenbanken und -Tabellen

Während der Projektentwicklung werden unsere Date...