Heim > Backend-Entwicklung > Golang > Docker-Images für Go (Golang) Kleine, schnellere Docker-Images und Sicherheit

Docker-Images für Go (Golang) Kleine, schnellere Docker-Images und Sicherheit

王林
Freigeben: 2024-08-06 01:48:22
Original
851 Leute haben es durchsucht

Während des Wochenendes habe ich etwas über Docker-Images recherchiert, die speziell für die Verwendung mit Go-Anwendungen (Golang) gedacht sind. Daher habe ich darüber nachgedacht, die interessanten Erkenntnisse zu teilen, da dies für jemanden nützlich sein könnte, der dasselbe für seine technischen Projektarbeiten erforscht.

Hier werde ich einige verschiedene Möglichkeiten erläutern, wie wir ein Image für Golang erstellen können, und auch einige der Sicherheitsaspekte hervorheben, die wir bei der Auswahl berücksichtigen müssen.

Für diese Übung habe ich eine einfache Rest-API verwendet, die mit Go (Golang) und dem Gin Framework entwickelt wurde.

Das Gin-Framework ist ein beliebtes Web-Framework für Go (Golang), das schnell, einfach zu verwenden und hocheffizient ist.
 
Hier ist eine kurze Zusammenfassung der wichtigsten Merkmale und Eigenschaften;

Hauptfunktionen

  • Leistung: Gin ist für seine hohe Leistung bekannt. Es ist eines der schnellsten Go-Web-Frameworks und bietet im Vergleich zu anderen Frameworks einen minimalen Overhead.

  • Schneller HTTP-Router: Gin verwendet einen schnellen HTTP-Router und unterstützt Routing mit Methoden wie GET, POST, PUT, DELETE usw. Es unterstützt auch Middleware und Routengruppierung.

  • Middleware-Unterstützung: Gin bietet eine Möglichkeit, Middleware zu verwenden, um Aufgaben wie Protokollierung, Authentifizierung und andere Vor- oder Nachbearbeitungen von Anfragen abzuwickeln.

  • JSON-Validierung: Das Framework bietet integrierte Unterstützung für die JSON-Validierung und die Bindung von Anforderungsdaten an Go-Strukturen, was die Arbeit mit JSON-Nutzlasten erleichtert.

  • Fehlerbehandlung: Gin verfügt über eine strukturierte Art der Fehlerbehandlung und stellt ein zentrales Fehlermanagementsystem bereit, das Ihnen einen reibungslosen Umgang mit Fehlern ermöglicht.

  • Vorlagen-Rendering: Während Gin in erster Linie für die API-Entwicklung konzipiert ist, unterstützt es bei Bedarf das Rendern von HTML-Vorlagen.

  • Anfragebearbeitung: Unterstützt verschiedene Methoden zur Anfragebearbeitung, einschließlich Formulardaten, JSON-Nutzlasten und URL-Parameter.

  • Integriertes Debugging: Gin stellt detaillierte Fehlermeldungen und Debugging-Informationen bereit, die während der Entwicklung nützlich sein können.

Schlüsselkomponenten

  • Router: Die Kernkomponente, die die Weiterleitung von HTTP-Anfragen an die entsprechenden Handler übernimmt.

  • Kontext: Eine Struktur, die die Anforderungs- und Antwortdaten trägt, und
    stellt Methoden zur Verfügung, um damit umzugehen. Es wird häufig in Handlern verwendet.

  • Engine: Die primäre Instanz der Gin-Anwendung, die mit Routen, Middleware und anderen Einstellungen konfiguriert ist.

  • Middleware: Funktionen, die während des Anforderungslebenszyklus ausgeführt werden und es Ihnen ermöglichen, Aufgaben wie Protokollierung, Authentifizierung und mehr auszuführen

Genug vom Gin Framework :) Kommen wir nun zum Hauptthema und sprechen über die durchgeführten Tests.

Test 1 (regulärer Docker-Build)

In diesem Test verwenden wir ein offizielles Standard-/Regulär-Go-Basisbild

# Official Go Base Image
FROM golang:1.21.0

# Create The Application Working Directory
WORKDIR /app

# Copy and Download Dependencies
COPY go.mod go.sum .
RUN go mod download

# Copy Source and Build The Application
COPY . .
RUN go build -o main .

# Expose The Port
EXPOSE 8081
CMD ["./main"]
Nach dem Login kopieren

Bildgröße

Docker Images for Go (Golang) Small, Faster Docker Images and Security


Test 2 (Mehrstufiger Docker-Build mit Alpine Image)

In diesem Test verwenden wir die Alpine-Version des Go Base Image, die etwas leichter ist

# Official Go Apline Base Image
FROM golang:1.21.0-alpine as builder

# Create The Application Directory
WORKDIR /app

# Copy and Download Dependencies
COPY go.mod go.sum .
RUN go mod download

# Copy The Application Source & Build
COPY . .
RUN go build -o main .

# Final Image Creation Stage
FROM alpine:3.19

WORKDIR /root/

# Copy The Built Binary
COPY --from=builder /app/main .

# Expose the port
EXPOSE 8081
CMD ["./main"]

Nach dem Login kopieren

Bildgröße
Docker Images for Go (Golang) Small, Faster Docker Images and Security

Hier sieht man, dass bei einem mehrstufigen Aufbau die Bildgrößen deutlich reduziert werden.


Test 3 (Distroless Build)

In diesem Test verwenden wir ein Distroless Go-Basisbild von Google. Distroless-Images sind dafür bekannt, dass sie leichtgewichtig und sicher sind und nur die minimal erforderlichen Dateien enthalten. Dabei wurden diese Debug-Shells und unnötigen Pakete entfernt. Daher opfern Sie die Flexibilität eines Paketmanagers und einer Shell.

# Build Stage
FROM golang:1.21.0 as builder

# Set The Application Directory
WORKDIR /app

# Copy and Download Dependencies
COPY go.mod go.sum .
RUN go mod download

# Copy The Application Source and Build the application
COPY . .
RUN CGO_ENABLED=0 go build -o main .

# Final Image Creation Stage
FROM gcr.io/distroless/static-debian12

# Copy the built binary
COPY --from=builder /app/main /
CMD ["/main"]
Nach dem Login kopieren

Bildgröße
Docker Images for Go (Golang) Small, Faster Docker Images and Security


CGO_ENABLED=0: Dies ist eine Umgebungsvariableneinstellung, die CGO (C-Go) deaktiviert. CGO ist eine Funktion von Go, die es Go-Paketen ermöglicht, C-Code aufzurufen. Durch das Festlegen von CGO_ENABLED=0 wird sichergestellt, dass der Build nicht von C-Bibliotheken abhängt und eine vollständig statische Binärdatei erstellt wird. Dies ist nützlich, um leichte und portable Go-Binärdateien zu erstellen, die auf jedem System ausgeführt werden können, ohne dass zusätzliche Abhängigkeiten erforderlich sind.

Alles zusammenfassend bedeutet RUN CGO_ENABLED=0 go build -o main ., dass Docker einen Befehl zum Erstellen einer Go-Anwendung im aktuellen Verzeichnis ausführt und dabei eine statische Binärdatei mit dem Namen „main“ erzeugt, die dies nicht tut hängen von allen C-Bibliotheken ab.

Zusammenfassung

Bildgröße
Docker Images for Go (Golang) Small, Faster Docker Images and Security

Auch wenn die Distroless-Bilder etwas größer sind als die Alpine-Bilder, könnte die Überlegung zu Sicherheitsbedrohungen/Schwachstellen dazu führen, sich für Distroless! zu entscheiden. Denken Sie daher über all diese Fakten nach und wählen Sie diejenige aus, die Ihren Anforderungen entspricht

Alpine mit mehrstufigen Builds ist eine gute Wahl, wenn Sie mehr Kontrolle über den Build-Prozess benötigen und keine Kompatibilitätsprobleme mit musl libc bestehen ein Anliegen. Es bietet Flexibilität und ist kleiner als viele andere Basis-Images, enthält aber dennoch mehr Komponenten als Distroless-Images, was zu potenziellen Sicherheitslücken/-bedrohungen führen kann.

Google Distroless Images sind ideal, um die Sicherheit zu maximieren und die Angriffsfläche zu minimieren. Sie bieten eine sehr minimale Laufzeitumgebung, was für Produktionssysteme von Vorteil sein kann, bei denen Sicherheit Priorität hat. Sie opfern jedoch die Flexibilität eines Paketmanagers und einer Shell.

Empfehlung:

Verwenden Sie Alpine, wenn Sie Flexibilität und Kontrolle über die Build-Umgebung benötigen und wenn Kompatibilitätsprobleme mit musl libc kein Problem darstellen.

Verwenden Sie Google Distroless, wenn Sicherheit und die Minimierung der Angriffsfläche für Sie oberste Priorität haben und Sie sicherstellen können, dass alle Abhängigkeiten Ihrer Anwendung ordnungsgemäß gebündelt sind.

Ich hoffe, das war interessant und danke für deine Zeit!

Das obige ist der detaillierte Inhalt vonDocker-Images für Go (Golang) Kleine, schnellere Docker-Images und Sicherheit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage