Detaillierte Erklärung des Sidecar-Modus in Docker Compose

Detaillierte Erklärung des Sidecar-Modus in Docker Compose

Was ist Docker Compose

In der heutigen Welt, in der Microservices weit verbreitet sind, definieren wir Compose normalerweise als Orchestrierungstool zum einheitlichen Starten und Herunterfahren von Containern.

Aber ich habe noch eine Frage: Wer würde Compose verwenden, um mehrere Dienste auf einem einzigen Server bereitzustellen? Nutzen Sie nur einen einzigen Dienst! Bis ich auf die folgende Anforderung stieß, wurde mir klar, dass Compose, wenn ich mehrere Dienste auf einem Server verwenden musste, den Sidecar-Modus verwenden konnte, um es einem Dienst zu erleichtern, einen anderen Dienst über 127.0.0.1 aufzurufen

Anforderungen stoßen auf unangemessene Sprache

Ein in Golang entwickeltes Projekt hofft, den Studentenstatus basierend auf den Studenteninformationen auszudrucken. Ein Teil der Studentenstatustabelle ist wie folgt

Es ist nicht so, dass es in Go keine Bibliothek zum Bedienen von Wörtern gibt, aber es ist immer noch sehr schwierig, ein so komplexes Wort zu bedienen und die Informationen einzugeben. Also haben wir eine Lösung gefunden.

Durchführung

1. Definieren Sie eine gleiche Vorlage über Excel

2. Golang füllt den Wert in die angegebene Zelle von Excel, was viel einfacher ist, als den Wert in Word einzugeben. Ein Teil des Codes

xlsx.SetCellValue("Tabelle1", "C3", Student.Hauptfach.Name)
xlsx.SetCellValue("Tabelle1", "F3", student.ClassInfo.Name)
xlsx.SetCellValue("Tabelle1", "J3", Schüler.Schulsystem)
 
xlsx.SetCellValue("Tabelle1", "B4", student.Name)
xlsx.SetCellValue("Tabelle1", "D4", student.BeforName)
xlsx.SetCellValue("Tabelle1", "F4", Schüler.Geschlecht)
xlsx.SetCellValue("Tabelle1", "H4", student.Nation)
 
xlsx.SetCellValue("Tabelle1", "B5", student.AusweisNr)
xlsx.SetCellValue("Tabelle1", "F5", student.HomePlace)
 
xlsx.SetCellValue("Tabelle1", "B6", student.Geburtstag.Format("20060102"))
xlsx.SetCellValue("Tabelle1", "D6", student.Eintrittszeit.Format("20060102"))
xlsx.SetCellValue("Tabelle1", "F6", student.JoinTeamTime)
 
xlsx.SetCellValue("Tabelle1", "B7", student.Familienadresse)
xlsx.SetCellValue("Tabelle1", "F7", student.HealthStatus)

3. Der wichtigste Schritt ist die Konvertierung von Excel in PDF und die Rückgabe an das Frontend zur Anzeige oder zum Drucken

Ich habe auf GitHub keine Golang-Bibliothek zum Konvertieren von Excel in PDF gefunden (bitte hinterlassen Sie eine Nachricht, wenn Sie Empfehlungen haben), also dachte ich an die FreeSpire.Xls-Bibliothek in .net, mit der sich die Funktion zum Konvertieren von Excel in PDF problemlos realisieren lässt. Ich brauche also eine .net-API, um das generierte und ausgefüllte Excel in PDF umzuwandeln. Also habe ich eine .net-WebAPI erstellt, den Projektnamen als PDF-Prozessor definiert und einen Controller definiert.

[Route("[Controller]")]
    öffentliche Klasse PDFController: ControllerBase
    {
        privater schreibgeschützter ILogger<PDFController> _logger;
        öffentlicher PDFController (ILogger<PDFController>-Logger)
        {
            _logger = Logger;
        }

        [HttpPost]
        öffentliche asynchrone Task<IActionResult> HttpPostAsync()
        {
            versuchen
            {
                Stream stream = Anfrage.Body;
                byte[] Puffer = neues Byte[Anforderung.Inhaltslänge.Wert];
                stream.Position = 0L;
                stream.ReadAsync(Puffer, 0, Puffer.Länge);
                Arbeitsmappe wb = neue Arbeitsmappe();
                wb.LoadFromStream(Strom);
                Arbeitsblatt ws = wb.Arbeitsblätter[0];
                var streamReturn = neuer MemoryStream();

                ws.SaveToPdfStream(streamReturn);
                Datei zurückgeben (streamReturn, "Anwendung/Oktett-Stream");
            }
            catch (Ausnahme ex)
            {
                _logger.LogError("", Beispiel);
                returniere BadRequest(zB Message);
            }
        }
    }

4. Stellen Sie das Go-Projekt und das .net-Projekt bereit, sodass die Go-Sprache die .net-API aufruft, um Excel in PDF zu konvertieren

Da es sich um ein kleines Einzelprojekt handelt, muss ich überlegen, wie ich die Bereitstellung und den Aufruf relativ einfach gestalten kann. Zu diesem Zeitpunkt dachte ich an Docker Compose.

Ich kann die Go-API und die .net-API gleichzeitig über Docker-Compose starten. Das Wichtigste ist, dass die Go- und .net-Projekte dasselbe Netzwerk verwenden können, sodass die Go-API die .net-API über Port 127.0.0.1 aufrufen kann. Die Topologie ist wie folgt

5. Die Go-API ruft die .net-API über 127.0.0.1 auf, sodass die .net-API zum Sidecar der Go-API wird und diese bedient

Antwort, Fehler := http.Post("http://127.0.0.1:6081/PDF", "multipart/form-data;boundary="+multipart.NewWriter(bytes.NewBufferString("")).Boundary(), bytes.NewReader(byteA))
wenn err != nil {
    c.Schlecht(err.Fehler())
    zurückkehren
}
Antwort verschieben.Body.Close()
wenn Antwort.StatusCode != 200 {
    Daten, _ := ioutil.ReadAll(Antwort.Body)
    c.Bad(Zeichenfolge(Daten))
    zurückkehren
}
 
pdfFilePth := fmt.Sprintf("./templates/tmp/%s.pdf", uuid.New())
f, err := os.Create(pdfFilePth)
wenn err != nil {
    c.Schlecht(err.Fehler())
    zurückkehren
}
io.Kopie(f, Antwort.Text)
c.Ctx.Output.Download(pdfFilePth, "data.xlsx")

6. Docker-Compose-Bereitstellung

Schreiben einer Docker-Datei für Go

VON Bibliothek/Golang
 
ARBEITSVERZEICHNIS /app
RUN go env -w GO111MODULE=on
RUN go env -w GOPROXY=https://goproxy.cn,direct
ADD api/ /app
Führen Sie den Befehl cd /app aus.
RUN gehen mod ordentlich
FÜHREN Sie go build main.go aus
EINSTIEGSPUNKT ["/app/main"]
EXPOSE 6080

.net Dockerfile schreiben

#Unter https://aka.ms/containerfastmode erfahren Sie, wie Visual Studio diese Docker-Datei verwendet, um Ihre Bilder für ein schnelleres Debuggen zu erstellen.

VON mcr.microsoft.com/dotnet/aspnet:6.0 AS-Basis
Führen Sie apt-get update aus.
Führen Sie apt-get install -y --no-install-recommends libgdiplus libc6-dev aus. 
Führen Sie den Befehl apt-get install -y fontconfig xfonts-utils aus.
KOPIEREN /pdfprocessor/fonts/ /usr/share/fonts/
Führen Sie mkfontscale aus
Führen Sie mkfontdir aus
Führen Sie den Befehl fc-cache -fv aus.

ARBEITSVERZEICHNIS /app
EXPOSE 6081

VON mcr.microsoft.com/dotnet/sdk:6.0 AS-Build
ARBEITSVERZEICHNIS /src
KOPIEREN ["pdfprocessor/pdfprocessor.csproj", "pdfprocessor/"]
Führen Sie dotnet restore "pdfprocessor/pdfprocessor.csproj" aus.
KOPIEREN . .
Arbeitsverzeichnis "/src/pdfprocessor"
Führen Sie den Befehl dotnet build "pdfprocessor.csproj" -c Release -o /app/build aus.

VON Erstellen ALS Veröffentlichen
RUN dotnet publish "pdfprocessor.csproj" -c Release -o /app/publish

VON Basis ALS Finale
ARBEITSVERZEICHNIS /app
KOPIEREN --from=publish /app/publish .
EINSTIEGSPUNKT ["dotnet", "pdfprocessor.dll"]

Schreiben Sie docker-compose.yaml, damit goapi und .net api dasselbe Netzwerk verwenden können

Version: '3.4'

Leistungen:
  PDF-Prozessor:
    Bild: pdfprocessor
    bauen:
      Kontext: .
      Dockerdatei: pdfprocessor/Dockerfile
    hängt ab von:
      - Bildungsadministrator
    Netzwerkmodus: "Dienst:eduadmin"
  eduadmin:
    Bild: eduadmin
    bauen:
      Kontext: .
      Docker-Datei: API/Docker-Datei
    Häfen:
      - „6080:6080“
      - „6088:6088“

7. Starten Sie den Dienst über Docker-Compose Up -d und sehen Sie sich den PDF-Anzeigeeffekt an

Abschließend möchte ich sagen, dass Docker-Compose wirklich großartig ist!

Dies ist das Ende dieses Artikels über den Sidecar-Modus von Docker Compose. Weitere Informationen zum Sidecar-Modus von Docker Compose finden Sie in früheren Artikeln auf 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:
  • Eine kurze Erläuterung zur Lösung des Depends_on-Reihenfolgeproblems in Docker-Compose
  • Praktische Hinweise zur Installation von Jenkins mit Docker-Compose
  • Detaillierter Prozess für den Einstieg mit Docker Compose HelloWorld
  • Installations- und Verwendungsschritte für Docker Compose

<<:  Details zum Like-Operator in MySQL

>>:  Idee zur Implementierung eines Popup-Maskeneffekts für Kommentarantworten, kompatibel mit IE 8/Chrome/Firefox

Artikel empfehlen

JavaScript zur Implementierung der Webversion des Schlangenspiels

In diesem Artikel wird der spezifische Code für J...

Beschreiben Sie kurz die MySQL InnoDB-Speicher-Engine

Vorwort: Die Speicher-Engine ist der Kern der Dat...

Zusammenfassung der Ereignisbehandlung im Vue.js-Frontend-Framework

1. v-on-Ereignisüberwachung Um DOM-Ereignisse abz...

MySQL führt Befehle für externe SQL-Skriptdateien aus

Inhaltsverzeichnis 1. Erstellen Sie eine SQL-Skri...

Lösen Sie das Problem des Mac Docker x509-Zertifikats

Frage Kürzlich musste ich mich bei einem privaten...

Acht Hook-Funktionen in der Vue-Lebenszykluskamera

Inhaltsverzeichnis 1. beforeCreate und erstellte ...

Warum wirkt sich die Verwendung von Limits in MySQL auf die Leistung aus?

Lassen Sie mich zunächst die MySQL-Version erklär...

So stellen Sie Tomcat stapelweise mit Ansible bereit

1.1 Aufbau der Verzeichnisstruktur Dieser Vorgang...

Beispiele für Vorschaufunktionen für verschiedene Dateitypen in vue3

Inhaltsverzeichnis Vorwort 1. Vorschau der Office...

5 Möglichkeiten zum Senden von E-Mails in der Linux-Befehlszeile (empfohlen)

Wenn Sie eine E-Mail in einem Shell-Skript erstel...