MAISON CODE .
/ Tech · DevOps · Docker · Kubernetes · Containers

Docker und Kubernetes: Versandcontainer, kein Code

„Es funktioniert auf meinem Rechner“ ist keine akzeptable Ausrede. Wie die Containerisierung die Konsistenz von der Entwicklung bis zur Produktion gewährleistet.

AB
Alex B.

Das „Funktioniert auf meiner Maschine“-Syndrom

Entwickler A: „Die Anmeldung funktioniert auf meinem Mac.“ Entwickler B: „Auf meinem Windows-PC schlägt es fehl.“ Server: „Es stürzt unter Linux ab, weil die Node.js-Version nicht übereinstimmt.“ Das ist Umgebungsdrift. Es verschwendet Tausende von Stunden. Docker löst dieses Problem. Wir versenden keinen „Code“. Wir versenden einen „Container“. Ein Container ist eine leichte virtuelle Maschine, die das Betriebssystem (Alpine Linux), die Laufzeit (Knoten 18), die Abhängigkeiten (node_modules) und den Code enthält. Wenn der Container auf Ihrem Laptop startet, wird er auch auf dem Server gestartet. Garantiert. Es handelt sich um die Standardbereitstellungseinheit.

Warum Maison Code dies bespricht

Bei Maison Code legen wir Wert auf Reproduzierbarkeit. Wenn ein neuer Entwickler dem Team beitritt, sollte er nicht drei Tage damit verbringen, Redis, Postgres und ImageMagick zu installieren. Sie sollten „docker-compose up“ ausführen und in 10 Minuten mit dem Codieren beginnen. Wir nutzen Kubernetes (K8s) für unsere Unternehmenskunden, die eine enorme Skalierbarkeit und Selbstheilungsfunktionen benötigen. Wir sprechen darüber, weil DevOps kein nachträglicher Einfall ist; Es ist die Grundlage der Entwicklungsgeschwindigkeit.

Die Docker-Datei: Das Rezept

Die Docker-Datei definiert, wie der Container erstellt wird.

„dockerfile

1. Basisbild (klein und sicher)

VON Knoten: 18-alpine AS Builder

2. Verzeichnis festlegen

WORKDIR /app

3. Abhängigkeiten installieren (Cache-Ebene)

KOPIEREN Sie das Paket*.json ./ RUN npm ci ausführen

4. Code kopieren

KOPIEREN. .

5. Bauen

RUN npm run build

--- Mehrstufiger Build (Optimierung) ---

Wir verwerfen die „Builder“-Phase und behalten nur die Produktionsartefakte

VON Knoten:18-alpiner AS-Läufer WORKDIR /app COPY —from=builder /app/.next ./.next COPY —from=builder /app/public ./public COPY —from=builder /app/node_modules ./node_modules COPY —from=builder /app/package.json ./package.json

6. Starten

CMD [„npm“, „start“] „

Optimierungstipp: Mehrstufige Builds. Im obigen Beispiel verwenden wir eine „Builder“-Stufe, um den Code zu kompilieren. Dann kopieren wir nur das Ergebnis in die „Runner“-Stufe. Wir lassen den „Source Code“, den „TypeScript Compiler“ und die „DevDependencies“ zurück. Ergebnis: Verwenden Sie ein 100-MB-Image anstelle eines 1-GB-Images. Schnellere Bereitstellung, sicherere Laufzeit.

Docker Compose: Lokale Orchestrierung

Sie betreiben selten nur einen Container. Sie führen eine Web-App, eine Datenbank und einen Cache aus. „docker-compose.yml“ orchestriert sie.

„yaml Version: ‘3’ Dienstleistungen: Internet: bauen: . Häfen: [“3000:3000”] Umgebung: DATABASE_URL: postgres://user:pass@db:5432/myapp Datenbank: Bild: postgres:15 Umgebung: POSTGRES_PASSWORD: bestanden redis: Bild: redis:alpine „

Jetzt dreht „docker-compose up“ den gesamten Stapel hoch. Der „Web“-Container kann mit „db“ kommunizieren, indem er einfach den Hostnamen „db“ verwendet. Magisches DNS.

Kubernetes (K8s): Der Kapitän

Docker führt Container aus. Kubernetes verwaltet sie. Wenn Sie 1 Server haben, verwenden Sie Docker. Wenn Sie 100 Server haben, verwenden Sie Kubernetes. K8s-Griffe:

  1. Selbstheilung: „Container A ist abgestürzt. Starten Sie ihn neu.“
  2. Auto-Scaling: „CPU-Auslastung ist hoch. Fügen Sie 5 weitere Container hinzu.“
  3. Rollende Updates: „Aktualisieren Sie Version 1 auf 2. Führen Sie dies einzeln durch. Wenn die Fehler zunehmen, führen Sie automatisch ein Rollback durch.“

Die „Overkill“-Warnung

Kubernetes ist komplex. Die Lernkurve ist steil (Pods, Bereitstellungen, Dienste, Ingress, Helm-Charts). Für 90 % der Startups sind K8s übertrieben. Verwenden Sie ein PaaS (Platform as a Service) wie Vercel, Railway oder AWS App Runner. Sie führen Container für Sie aus, ohne dass Sie sich die Mühe machen müssen, die Cluster Control Plane zu verwalten. Wechseln Sie nur dann zu K8s, wenn Sie Folgendes benötigen:

  • Compliance (On-Premise-Hosting).
  • Kostenoptimierung im großen Maßstab.
  • Komplexe Netzwerknetze.

7. Helm: Der Paketmanager für K8s

K8s YAML-Dateien sind ausführlich. „deployment.yaml“ (50 Zeilen). service.yaml (20 Zeilen). ingress.yaml (30 Zeilen). Mit 3 Umgebungen (Dev, Staging, Prod) multiplizieren. Es ist unkontrollierbar. Lösung: Helm. Helm-Charts sind Vorlagen. helm install my-app ./charts/my-app --set image.tag=v2 Es ersetzt Variablen in der Vorlage und stellt die Manifeste bereit. Es ist „NPM für Kubernetes“.

8. GitOps (ArgoCD): Die Wahrheit liegt in Git

Führen Sie niemals „kubectl apply -f file.yaml“ von Ihrem Laptop aus. Dadurch entsteht eine „Konfigurationsdrift“. Lösung: GitOps.

  1. Speichern Sie alle YAMLs in einem Git-Repo („Infra-Repo“).
  2. Installieren Sie ArgoCD im Cluster.
  3. ArgoCD beobachtet das Git Repo.
  4. Wenn Sie eine Änderung an Git übertragen, wendet ArgoCD sie automatisch auf den Cluster an.
  5. Wenn jemand den Cluster manuell hackt, erkennt ArgoCD den Unterschied und macht ihn rückgängig (Selbstheilungskonfiguration). Der Clusterstatus stimmt immer mit Git überein.

10. Distroless Images: Sicherheit durch Minimalismus

Alpine Linux ist klein (5 MB). Aber es hat eine Shell (/bin/sh). Wenn ein Hacker eindringt, kann er Befehle ausführen. Lösung: Google „Distroless“-Bilder. Sie enthalten nur Ihre App und ihre Abhängigkeiten. Keine Shell. Kein Paketmanager. Kein „ls“. Wenn ein Hacker eine Schwachstelle ausnutzt, bestätigt er: „Ich bin dabei!“ … und kann dann nichts tun. Verwenden Sie „gcr.io/distroless/nodejs“.

11. Pod-Unterbrechungsbudgets (PDB)

Sie haben 3 Replikate Ihrer API. Kubernetes möchte den Knoten aktualisieren (OS-Patch). Es entleert den Knoten. Es tötet alle 3 Replikate auf einmal. Die Website geht aus. Fix: Definieren Sie eine PDB. minVerfügbar: 2. K8s sind gezwungen, einen zu töten, auf den Start des neuen zu warten und dann den nächsten zu töten. Dies garantiert Bereitstellungen ohne Ausfallzeiten auch während der Wartung der Infrastruktur.

12. Die Sicht des Skeptikers

„Docker ist auf dem Mac langsam.“ Gegenpunkt: Stimmt. Es läuft in einer VM. Aber das Debuggen von „Warum schlägt „bcrypt“ unter Linux fehl?“ dauert länger als der Leistungseinbruch von 5 %. Konsistenz > Rohgeschwindigkeit.

FAQ

F: Docker vs. Virtual Machine (VM)? A: Eine VM erfasst die Hardware (schwer). Ein Container erfasst den OS User Space (Light). Sie können 100 Container auf einem Server ausführen, der nur 5 VMs aufnehmen kann.

F: Ist Docker sicher? A: Standardmäßig ja (Isolation). Wenn Sie jedoch als „root“ innerhalb des Containers ausgeführt werden und es einen Kernel-Exploit gibt, kann der Angreifer entkommen. Best Practice: Erstellen Sie einen generischen Benutzer („RUN adduser app“) und wechseln Sie tief in der Docker-Datei zu diesem („USER app“).

Fazit

Container sind die Versandbehälter des Codes. Vor der Einführung der Standardschiffscontainer war das Beladen eines Schiffes ein Chaos (Fässer, Säcke, Kisten). Jetzt passt alles in eine Standardbox. Dem Kran ist es egal, was drin ist. Docker macht Ihren Code zu einer Standardbox. AWS ist der Kran. Verpacken Sie es richtig und Sie können es überall hin versenden.

Alpträume bei der Bereitstellung?

Wenn es sich bei Ihren Bereitstellungen um unzuverlässige „Es hat auf meinem Computer funktioniert“-Situationen handelt, kann Maison Code Ihren Stack dockerisieren. Wir implementieren CI/CD-Pipelines, die Container automatisch erstellen, testen und versenden.

Kontaktieren Sie uns, um Ihre Ops zu stabilisieren.



Kopfschmerzen bei der Bereitstellung?

Wir Containerisieren Anwendungen mit Docker und orchestrieren sie mit Kubernetes für kugelsichere Bereitstellungen. Stellen Sie unsere Architekten ein.