Detaillierte Erläuterung der Startreihenfolge des Docker-Containers mithilfe eines Shell-Skripts

Detaillierte Erläuterung der Startreihenfolge des Docker-Containers mithilfe eines Shell-Skripts

1. Aufgetretene Probleme

Bei der verteilten Projektbereitstellung ist es häufig erforderlich, dass die Anwendung (einschließlich der Datenbank) nach dem Neustart des Servers automatisch wiederhergestellt werden kann. Obwohl die Verwendung von docker update --restart=always containerid dazu führen kann, dass der Container automatisch mit Docker gestartet wird, kann nicht garantiert werden, dass er nach dem Start der Datenbank gestartet wird. Wenn die Datenbank nicht gestartet wird, schlägt der Anwendungsstart fehl. Im Internet gibt es auch eine Lösung, um die Startreihenfolge durch die Anordnung der Docker-Compose-Container zu steuern, die vom Blogger weniger untersucht wird.

2. Lösung

Verwenden Sie zur Steuerung ein Shell-Skript. Die Idee ist wie folgt

Ermitteln Sie den Datenbankport, um zu überprüfen, ob die Datenbank erfolgreich gestartet wurde. Nachdem die Datenbank erfolgreich gestartet wurde, ermitteln Sie die Ports des Konfigurationscenters und des Serviceregistrierungscenters, um zu überprüfen, ob sie erfolgreich gestartet wurden. Nachdem die Datenbank und das Konfigurationscenter gestartet wurden, starten Sie andere Microservice-Anwendungen.

3. Porterkennung

Der zur Porterkennung verwendete Befehl ist

nc -w 1 host port </dev/null && echo "200"

Host: die IP-Adresse des Zielhosts

Port: der Port, auf dem der Dienst lauscht

Wenn der Dienst gestartet ist, gibt dieser Befehl 200 zurück, andernfalls gibt er nichts zurück.

4. Shell-Skript

Fügen Sie den Code direkt ein. Das verwendete Konfigurationscenter ist nacos

#!/bin/bash
#chkconfig: 2345 80 90
#Beschreibung:autoStartMaintenanceService.sh
#
#Prämisse:
#1.Docker muss automatisch starten können, wenn der Computer eingeschaltet wird.#2.Docker kann den Betriebs- und Wartungsdienst normal starten.#3.Dieses Skript muss auf dem Computer ausgeführt werden, auf dem sich der Mikrodienst befindet.#
##Zu ändernde Konfiguration-----Start##IP des Rechners, auf dem sich die Datenbank befindet
DATABASE_HOST=192.169.1.52
##Datenbank-Abhörport DATABASE_PORT=3306
##IP der Maschine, auf der sich der Microservice befindet
LOCAL_HOST=192.169.1.46
##Microservice-Zugriffsport Maintenance_Port=8180
##IP der Maschine, auf der sich NACOS befindet
NACOS_HOST=192.169.1.82
##NACOS-Abhörport NACOS_PORT=8848
##Name des Microservice-Containers (Spalte NAMES)
Maintenance_Container_Name="umc-wartung"
##Der vom Skript Log_Path=/home/test/log generierte Protokollpfad
##Konfiguration, die geändert werden muss-----Ende##
##Schleifenverzögerungszeit (s) LOOP_TIME=5
um_Zeit=""
am_Datum=""

getAtTime() {
 at_time="$(Datum +%J-%m-%d-%H:%M:%S) --- "
 at_date=$(Datum +%J-%m-%d)
}

autoStartWebService() {
 ##Wenn der Protokollpfad nicht existiert, erstellen Sie ihn, wenn [ ! -d "$Log_Path" ]; dann
  mkdir -p $Log_Pfad
 fi

 während wahr; tun
  ##Beurteilen Sie, ob die Datenbank gestartet ist req_message=$(nc -w 1 ${DATABASE_HOST} ${DATABASE_PORT} </dev/null && echo "200")
  wenn [ -n "$req_message" ]; dann
   getAtTime
   echo "$at_time Datenbank läuft" >>${Log_Path}/"$at_date"_autoStartMaintenanceService.log
   warteNacosStarting
  anders
   getAtTime
   echo "$at_time Datenbank läuft nicht, bitte warten Sie, bis die Datenbank gestartet wird" >>${Log_Path}/"$at_date"_autoStartMaintenanceService.log
   Schlaf $LOOP_TIME
  fi
 Erledigt
}
##Beurteilen Sie, ob Nacos gestartet ist waitNacosStarting() {
 req_message=$(nc -w 1 ${NACOS_HOST} ${NACOS_PORT} </dev/null && echo "200")
 wenn test $((req_message)) -eq 200; dann
  getAtTime
  echo "$at_time Nacos läuft" >>${Log_Path}/"$at_date"_autoStartMaintenanceService.log
  startWartungsservice
  Schlaf $LOOP_TIME
 anders
  getAtTime
  echo "$at_time Nacos läuft nicht. Bitte warten Sie, bis Nacos startet." >>${Log_Path}/"$at_date"_autoStartMaintenanceService.log
  Schlaf $LOOP_TIME
 fi
}

##Starten Sie den Microservice startMaintenanceService() {
 req_message=$(nc -w 1 ${LOCAL_HOST} ${Maintenance_Port} </dev/null && echo "200")
 wenn test $((req_message)) -eq 200; dann
  getAtTime
  echo "$at_time Wartungsdienst läuft" >>${Log_Path}/"$at_date"_autoStartMaintenanceService.log
 anders
  Container-ID = $ (Docker ps -a | grep $Wartungscontainername | grep -v grep | awk '{print $1}')
  getAtTime
  echo "$at_time Die Container-ID des Wartungsdienstes lautet ${container_id}" >>${Log_Path}/"$at_date"_autoStartMaintenanceService.log
  Docker starten ${Container-ID}
 fi

}

autoStartWebService

5. Shell-Ein- und Ausgabeumleitung

Beim Schreiben dieses Skripts wurde der Blogger auch mit der Shell-Ein- und Ausgabeumleitung vertrauter

Im Allgemeinen öffnet jeder Unix/Linux-Befehl bei seiner Ausführung drei Dateien:

  • Standardeingabedatei (stdin): Der Dateideskriptor von stdin ist 0 und Unix-Programme lesen standardmäßig Daten von stdin.
  • Standardausgabedatei (stdout): Der Dateideskriptor von stdout ist 1 und Unix-Programme geben Daten standardmäßig an stdout aus.
  • Standardfehlerdatei (stderr): Der Dateideskriptor von stderr ist 2, und Unix-Programme schreiben Fehlerinformationen in den stderr-Stream.

Befehl Beschreibung
command > file leitet die Ausgabe in die Datei um und überschreibt die Datei
command < file leitet die Eingabe in eine Datei um
command >> file leitet die Ausgabe im Anfügemodus in die Datei um
Befehl 2> Datei gibt den Fehler in die Datei aus und überschreibt die Datei
Befehl 2>> Datei leitet den Fehler im Anfügemodus an die Datei weiter
Das <<-Tag verwendet den Inhalt zwischen dem Start-Tag und dem End-Tag als Eingabe

Wenn Sie stdout und stderr zusammenführen und in eine Datei umleiten möchten (d. h. sowohl korrekte Informationen als auch Fehlerinformationen in eine Datei ausgeben möchten), können Sie Folgendes schreiben:

Befehl > Datei 2>&1
Oder Befehl >> Datei 2>&1

/dev/null-Datei

/dev/null ist eine spezielle Datei. Alles, was dort hineingeschrieben wird, wird verworfen. Wenn Sie versuchen, daraus zu lesen, erhalten Sie nichts. Die Datei /dev/null ist jedoch sehr nützlich. Wenn Sie die Ausgabe eines Befehls dorthin umleiten, wird die Ausgabe deaktiviert.

command > /dev/null 2>&1 kann stdout und stderr blockieren

siehe

Tutorial für Anfänger - Shell

Dies ist das Ende dieses Artikels über Shell-Skripte, die die Startreihenfolge von Docker-Containern steuern. Weitere relevante Inhalte zu Shell-Skripten zur Docker-Steuerung finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Docker ermöglicht den nahtlosen Aufruf von Shell-Befehlen zwischen Container und Host
  • So überwachen Sie den Ausführungsstatus eines Docker-Container-Shell-Skripts
  • So führen Sie Linux-Shell-Befehle in Docker aus
  • Führen Sie die Shell oder das Programm im Docker-Container auf dem Host aus.
  • Verwenden Sie Shell-Skripte, um Docker-Dienste stapelweise zu starten und zu stoppen
  • Shell-Skript erstellt Docker halbautomatische Kompilierungs-, Verpackungs- und Freigabeanwendungsvorgänge

<<:  So starten Sie mehrere MySQL-Datenbanken auf einem Linux-Host

>>:  Details zum Lazy Loading im Vue-Routing

Artikel empfehlen

Implementierung der MySQL-Datensortierung (aufsteigend und absteigend)

Datensortierung aufsteigend, absteigend 1. Sortie...

Die perfekte Lösung für das MySql-Versionsproblem sql_mode=only_full_group_by

1. Überprüfen Sie sql_mode wählen Sie @@sql_mode ...

Lernen Sie die Grundlagen der JavaScript-DOM-Operationen in einem Artikel

DOM-Konzepte DOM: Dokumentobjektmodell: Das Dokum...

HTML-Tabellen-Tag-Tutorial (26): Zellen-Tag

Die Attribute des <TD>-Tags werden verwende...

Beispiele für die Verwendung von DD DT DL-Tags

Normalerweise verwenden wir die Tags <ul><...

Zusammenfassung und Praxis des Javascript-Prototyp-Kettendiagramms

Inhaltsverzeichnis Prototypenkette Wir können ein...

Erläuterung der Dockerfile-Anweisungen und der grundlegenden Struktur

Durch die Verwendung von Dockerfile können Benutz...

Einführung in Kubernetes (k8s)

Ich wollte schon immer Kubernetes lernen, weil es...

Detaillierte Erklärung zum Kopieren und Sichern von Docker-Containerdaten

Hier nehmen wir den Jenkins-Container als Beispie...

Implementierungscode für den MySQL-Protokolltrigger

SQL-Anweisung DROP-TRIGGER WENN EXISTIERT sys_men...