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

So implementieren Sie das Builder-Muster in Javascript

Überblick Das Builder-Muster ist ein relativ einf...

Vue-Konfigurationsdetails für mehrere Seiten

Inhaltsverzeichnis 1. Der Unterschied zwischen me...

Verständnis und Beispielcode des Vue-Standardslots

Inhaltsverzeichnis Was ist ein Slot Grundlegendes...

Verständnis des synchronen oder asynchronen Problems von setState in React

Inhaltsverzeichnis 1. Ist setState synchron? asyn...

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

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

Ein praktischer Bericht über die Wiederherstellung einer MySQL Slave-Bibliothek

Beschreibung der Situation: Heute habe ich mich b...

So verhindern Sie, dass Website-Inhalte in Suchmaschinen aufgenommen werden

Normalerweise besteht das Ziel beim Erstellen ein...

Lösung für das Problem der Zeilenhöhe der Elementtabellenkopfzeile

Inhaltsverzeichnis Vorwort 1. Ursache des Problem...

Linux Bash: ./xxx: Fehler „Binärdatei kann nicht ausgeführt werden“

Heute habe ich einem Kunden ein kleines Tool für ...

Drei Möglichkeiten zum Teilen der Komponentenlogik in React

Ohne weitere Umschweife sind dies diese drei Meth...

Vue implementiert die Funktion zum Aufrufen der Handykamera und des Albums

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

Vue verwendet Echarts, um ein dreidimensionales Balkendiagramm zu implementieren

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