Docker und Go: Containerisierung von Anwendungen auf fortgeschrittenem Niveau

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum fortgeschrittene Go-Containerisierung ein Must-have ist

Die Containerisierung von Go-Anwendungen mit Docker ist längst zum Industriestandard geworden. Ein einfaches Dockerfile, das lediglich die Binärdatei in ein Image auf Basis von golang:latest kopiert, ist jedoch nur die Spitze des Eisbergs. Auf fortgeschrittenem Niveau stehen Entwickler vor Aufgaben wie der Minimierung der Image-Größe, der Gewährleistung von Sicherheit, der Optimierung der Build-Zeit und der sinnvollen Organisation einer Multi-Container-Architektur.

In diesem Artikel behandeln wir fortgeschrittene Techniken zur Containerisierung von Go-Anwendungen: vom Multi-Stage-Build bis zur Arbeit mit Netzwerken und Volumes in Docker Compose. Das Material richtet sich an diejenigen, die bereits mit den Grundlagen von Docker und Go vertraut sind und ihre Fähigkeiten auf die nächste Stufe heben möchten.



1. Multi-Stage-Build: Minimales Image in Sekunden

Das Hauptproblem von Basis-Images ist ihre Größe. Das Image golang:1.22 wiegt etwa 800 MB, was für die Produktion inakzeptabel ist. Die Lösung ist der Multi-Stage-Build, bei dem wir ein "schweres" Image nur für die Kompilierung verwenden und das finale Image auf Basis von scratch oder alpine erstellen.



Beispiel für ein fortgeschrittenes Dockerfile für Go

# Stage 1: BuildFROM golang:1.22-alpine AS builder

WORKDIR /appCOPY go.mod go.sum ./RUN go mod download

COPY . .RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /app/server ./cmd/server

# Stage 2: Finales ImageFROM scratch

COPY --from=builder /app/server /serverCOPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/

EXPOSE 8080ENTRYPOINT ["/server"]


Wichtige Optimierungen:

  • CGO_ENABLED=0 — deaktiviert CGO, was die Erstellung einer statisch gelinkten Binärdatei ermöglicht. Dies ist die einzige Möglichkeit, scratch zu verwenden.
  • -ldflags="-s -w" — entfernt Debug-Informationen und die Symboltabelle, wodurch die Binärgröße um 20-30% reduziert wird.
  • COPY --from=builder /etc/ssl/certs/... — fügt Root-Zertifikate für HTTPS-Anfragen aus dem Container hinzu (ohne diese kann Go keine TLS-Verbindungen herstellen).
  • Das resultierende Image wiegt ~10-15 MB statt 800 MB.


Wann sollte man alpine anstelle von scratch verwenden?

Wenn Ihre Anwendung eine Shell, ping, curl oder andere Dienstprogramme zur Fehlerbehebung benötigt, verwenden Sie alpine:latest (nur 5 MB). Für maximale Sicherheit in der Produktion wählen Sie jedoch scratch — es enthält nichts Überflüssiges.



2. Optimierung des Docker-Cachings und Umgang mit Abhängigkeiten

Jede Anweisung in einem Dockerfile erzeugt eine Schicht. Um wiederholte Builds zu beschleunigen, muss die Reihenfolge der Anweisungen richtig organisiert sein.



Die richtige Reihenfolge der Schichten

FROM golang:1.22-alpine AS builder

WORKDIR /app

# 1. Nur die Abhängigkeitsdateien kopierenCOPY go.mod go.sum ./RUN go mod download

# 2. Quellcode kopierenCOPY . .

# 3. BuildRUN go build -o /app/server ./cmd/server


Warum ist das wichtig? Docker cached Schichten. Wenn Sie nur den Code (main.go) geändert haben, aber nicht go.mod, wird die Schicht mit RUN go mod download aus dem Cache genommen. Das spart bei jedem Build Minuten.



Verwendung von .dockerignore

Vergessen Sie nicht die .dockerignore-Datei — sie schließt unnötige Dateien aus dem Build-Kontext aus und beschleunigt die Datenübertragung an den Docker-Daemon:

.git.gitignore*.mdDockerfile.dockerignorenode_modulestest/coverage/


3. Docker Compose für Go: Netzwerke, Volumes und Multi-Container-Architektur

Eine reale Go-Anwendung besteht selten aus nur einem Dienst. Üblich sind API + Datenbank + Redis + Message Queue. Docker Compose ermöglicht es, die gesamte Infrastruktur in einer einzigen YAML-Datei zu beschreiben.



Beispiel einer docker-compose.yml für eine Go-Anwendung

version: '3.8'

services: app: build: context: . docke

Blogs

Buchempfehlungen