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 einer Warenkorbfunktion basierend auf Vuex

In diesem Artikelbeispiel wird der spezifische Co...

Zusammenfassung und Beispiele der Kommunikationsmethoden für Vue3-Komponenten

Die Kommunikationsmodi der Vue3-Komponenten sind ...

So begrenzen Sie den Wertebereich von Objektschlüsseln in TypeScript

Wenn wir TypeScript verwenden, möchten wir das vo...

Erläuterung der objektorientierten Klassenvererbung in JavaScript

1. Objektorientierte Klassenvererbung In den obig...

Vue+video.js implementiert Video-Wiedergabelisten

In diesem Artikel wird der spezifische Code von v...

Tools zum Konvertieren statischer Websites in RSS

<br /> Dieser Artikel wurde von Rachel Golds...

Detaillierte Erklärung der Lösung zur Bildverformung unter Flex-Layout

Flex-Layout ist heutzutage eine häufig verwendete...

CSS realisiert den Maskeneffekt, wenn die Maus über das Bild bewegt wird

1. Setzen Sie den HTML-Code der Maskenebene und d...

So übertragen Sie Dateien zwischen Docker-Container und lokalem Computer

Zum Übertragen von Dateien zwischen dem Host und ...

Zabbix-Konfiguration DingTalk-Alarmfunktions-Implementierungscode

brauchen Das Konfigurieren von DingTalk-Alarmen i...

Drei BOM-Objekte in JavaScript

Inhaltsverzeichnis 1. Standortobjekt 1. URL 2. Ei...

Detaillierte Erläuterung der kombinierten MySQL-Abfrage

Verwenden von UNION Die meisten SQL-Abfragen best...

Analyse der vernachlässigten DOCTYPE-Beschreibung

Doctype ist einer davon: <!DOCTYPE HTML PUBLIC ...

Tiefgreifendes Verständnis der Vue-cli4-Routing-Konfiguration

Inhaltsverzeichnis Vorwort - Vue Routing 1. Die g...

So aktivieren Sie die Protokollfunktion für langsame Abfragen in MySQL

Das MySQL-Protokoll für langsame Abfragen ist seh...