Docker-Befehle. Du wirst sie benötigen – jeden einzelnen Tag. Das Problem besteht nicht darin, Docker zu lernen. Das Problem ist, sich daran zu erinnern, welcher Befehl was macht, wenn man mitten im Chaos steckt und die Produktionsumgebung gerade quasi brennt. In diesem Guide werden die Befehle, die du wirklich verwendest, aufgeschlüsselt und nach ihrer Funktion statt alphabetisch sortiert, da dein Gehirn es unter Druck genauso verarbeitet.
Befehle fallen in mehrere Kategorien: Images erstellen und verwalten, Chaos bereinigen, Container starten und stoppen und überprüfen, was gerade läuft. Du kannst Container konfigurieren, Images in Registries hochladen, Services orchestrieren und Netzwerke einrichten. Legen wir los.
Docker Build-Befehle
Der Docker Build-Befehl verwandelt deine Docker-Datei in ein Image. Das ist alles. Alles Weitere ist optional.
Erstelle aus deinem aktuellen Verzeichnis mit docker build. Möchtest du es markieren, damit du es später finden kannst? Füge -t imagename/tag hinzu. Dieser Tag ist nicht optional, wenn du eine Push-Übermittlung an eine Registry planst.
Es ist auch möglich, Builds aus Remote-Quellen zu erstellen. Verweise auf ein Git-Repo mit docker build https://github.com/user/repo.git#branch:folder. Oder hole dir ein Tar-Archiv von deinem Server mit docker build https://yourserver/file.tar.gz.
Musst du den Cache überspringen? Verwende --no-cache. Gebe Build-Argumente mit --build-arg KEY=value weiter. Diese werden in deiner Docker-Datei als ARG-Variablen angezeigt.
Der Build-Prozess liest deine Docker-Datei Zeile für Zeile. Jede Anweisung erstellt eine Schicht. Schichten werden zwischengespeichert. Aus diesem Grund dauert dein erster Build ewig und nachfolgende Builds sind in Sekundenschnelle abgeschlossen. Es sei denn, du änderst etwas im oberen Bereich der Docker-Datei. Dann wird alles unterhalb dieser Linie neu aufgebaut.
Docker Prune- und Cleanup-Befehle
Docker füllt deine Festplatte. Schnell. Verwaiste Images, gestoppte Container, ungenutzte Volumes. Sie häufen sich an.
Führe docker system prune aus, um gestoppte Container, ungenutzte Netzwerke, verwaiste Images und Build-Cache zu leeren. Füge -a hinzu, um alle ungenutzten Images zu entfernen, nicht nur die verwaisten. Damit werden Gigabytes freigegeben.
Verwende für gezielte Bereinigungen docker image prune, um untagged Images zu löschen. Bereinige Volumes mit docker volume rm $(docker volume ls -f dangling=true -q). Entferne spezifische Images mit docker image rm imagename.
Willst du alles plattmachen? Stoppe alle laufenden Container mit docker kill $(docker ps -q), und entferne sie dann mit docker rm $(docker ps -a -q). Mach das nicht in der Produktionsumgebung.
Plane Prune-Befehle in deiner Deployment-Pipeline. Dein DevOps-Team wird es dir danken, wenn es nicht um 2 Uhr morgens nach Speicherplatz suchen muss.
Container verwalten: Starten, Stoppen und Neustarten
Container-Lifecycle-Management. Starten, stoppen, pausieren, neu starten. Diese Befehle steuern, was ausgeführt wird.
Verwende docker start containername, um einen gestoppten Container zu starten. Stoppe ihn mit docker stop containername. Neustarten mit docker restart containername. Ganz einfach.
Musst du einen Container vorübergehend stoppen? docker pause containername sperrt alle Prozesse. Setze sie mit fort docker restart containername. Der Zustand des Containers bleibt im Speicher erhalten.
Das gleichzeitige Stoppen aller Container erfordert eine Befehlskette. docker stop $(docker ps -q) stoppt alles, was derzeit läuft. Die -q-Option gibt nur Container-IDs aus.
Lege Neustartrichtlinien fest, wenn du Container startest. Verwende --restart=always für Dienste, die Systemneustarts überstehen sollen. Oder --restart=on-failure, um nur nach Abstürzen neu zu starten.
Docker-Logs und Containerinspektion
Etwas ist kaputtgegangen. Du benötigst Protokolle.
Führe docker logs containername aus, um alles auszugeben, was der Container nach stdout und stderr geschrieben hat. Füge -f hinzu, um Logs in Echtzeit zu verfolgen. Verwende --tail 100, um nur die letzten 100 Zeilen anzuzeigen.
Liste laufende Container mit docker ps auf. Siehe alles, einschließlich gestoppter Container, mit docker ps -a. Die Ausgabe zeigt Container-IDs, Images, Befehle, Status und Ports.
Gehe tiefer ins Detail mit docker inspect containername. Dadurch wird ein JSON-Blob ausgegeben, der alle Details enthält: Netzwerkeinstellungen, Bereitstellungen, Umgebungsvariablen, Ressourcenbeschränkungen. Leite es an grep oder jq weiter, um das zu finden, was du benötigst.
Überprüfe die Ressourcennutzung mit docker stats. Es zeigt den CPU-Anteil, die Speichernutzung, das Netzwerk-I/O und das Block-I/O für jeden laufenden Container an. Überwache den Stream in Echtzeit oder erstelle einen Snapshot.
Überprüfen, was sich im Dateisystem eines Containers geändert hat? docker diff containername listet hinzugefügte, gelöschte und modifizierte Dateien auf. Nützlich zum Debuggen von Containern, die ihre eigenen Dateisysteme ändern.
Docker-Images-Verwaltung
Images sind Vorlagen. Container sind laufende Instanzen. Das Verwalten von Images bedeutet, dass dein lokales Repository sauber und korrekt getaggt ist.
Liste alle Images mit docker images oder docker image ls auf. Du wirst Repository-Namen, Tags, Image-IDs, Erstellungsdaten und Größen sehen. Filtere nach Namen mit docker images imagename.
Kennzeichne Images mit docker tag source target. Dadurch wird ein neuer Verweis auf dasselbe Image erstellt. Typische Muster: docker tag myapp:latest myapp:v1.2.3. Jetzt hast du ein versionspezifisches Tag und ein Latest-Tag, die auf dasselbe Image verweisen.
Entferne Images mit docker image rm imagename oder docker rmi imagename. Lösche mehrere Images, indem du sie auflistest: docker rmi image1 image2 image3.
Überprüfe die Image-Historie mit docker history imagename. Jede Zeile zeigt eine Schicht: den Befehl, der sie erstellt hat, wann sie erstellt wurde und wie viel Speicherplatz sie nutzt. Aufgeblähte Images? Hiermit siehst du wo.
Bereinige ungenutzte Images mit docker image prune. Füge -a hinzu, um alle Images zu entfernen, die von keinem Container referenziert werden. Dies ist nicht rückgängig zu machen, gehe also auf deinem Build-Server behutsam mit der Ausführung vor.
Optionen für den Docker-Run-Befehl
Der Docker-Run-Befehl erstellt und startet einen Container aus einem Image. Ein Befehl, dutzende Flags.
Basissyntax: docker run imagename. Dadurch wird der Container im Vordergrund ausgeführt und dein Terminal blockiert. Füge -d hinzu, um ihn zu trennen und im Hintergrund auszuführen.
Benenne deinen Container mit --name containername. Andernfalls generiert Docker zufällige Namen wie ‚quirky_tesla‘, an die du dich nie erinnern wirst. Ordne Ports mit -p hostport:containerport zu. Beispiel: -p 8080:80 ordnet dem Containerport 80 den Hostport 8080 zu.
Legte Umgebungsvariablen mit -e KEY=value fest. Binde Volumes mit -v /host/path:/container/path ein. Lege das Dateisystem des Containers aus Sicherheitsgründen mit --read-only als schreibgeschützt fest.
Entferne Container automatisch, wenn sie mit --rm gestoppt werden. Perfekt für einmalige Aufgaben. Verbinde dich mit spezifischen Netzwerken unter Verwendung von --network networkname. Lege Ressourcengrenzen mit --memory und --cpus fest.
Der interaktive Modus erfordert zwei Flags: -i hält stdin offen und -t weist ein Pseudo-TTY zu. Kombiniere sie als -it für Shell-Zugriff: docker run -it ubuntu bash.
Docker Hub und Registry-Befehle
Docker Hub hostet Millionen von Images. Deine private Registry könnte deine hosten. In jedem Fall musst du die Befehle pull, push und authenticate anwenden.
Melde dich mit docker login an. Du wirst zur Eingabe von Benutzername und Passwort aufgefordert. Verwende für automatisierte Systeme die Anmeldeinformationen über stdin oder nutze Token für den Zugriff. Melde dich mit docker logout ab.
Lade Images vom Docker Hub mit docker pull imagename herunter. Spezifiziere Tags wie docker pull nginx:1.21. Ohne ein Tag wird standardmäßig „latest“ verwendet. Das ist oft nicht das, was man in der Produktion will.
Lade Images mit docker push username/imagename:tag hoch. Der Imagename muss deinen Docker Hub-Benutzernamen oder deine Registry-URL enthalten. Kennzeichne es korrekt, bevor du es hochlädst, sonst schlägt es fehl.
Durchsuche Docker Hub von der Befehlszeile aus mit docker search searchterm. Es gibt offizielle Images, automatisierte Builds und Sternbewertungen zurück. Die Weboberfläche bietet dir jedoch weitere Details.
Stelle für eine private Registry dem Imagenamen die Registry-URL voran: registry.example.com/imagename. Login, Pull und Push funktionieren auf die gleiche Weise. Verweise einfach auf eine andere Registry.
Docker Swarm Service Management
Docker Swarm orchestriert Container über mehrere Hosts hinweg. Dienste legen fest, wie deine Container im Schwarm laufen sollen.
Liste Dienste mit docker service ls auf. Dies zeigt Dienstnamen, Modi, Replikate, Bilder und Ports. Für detaillierte Informationen zu einem bestimmten Dienst, führe docker service ps servicename aus.
Erstelle einen Dienst mit docker service create. Beispiel: docker service create --name web --replicas 3 -p 80:80 nginx. Dadurch werden drei Nginx-Replikate in deinem Schwarm bereitgestellt.
Skaliere Dienste mit docker service scale servicename=5 hoch oder runter. Swarm kümmert sich um die Verteilung der Replikate. Aktualisiere laufende Dienste mit docker service update und Flags wie --image für fortlaufende Updates.
Überprüfe die Dienstprotokolle mit docker service logs servicename. Dadurch werden Protokolle aller Replikate zusammengefasst. Stelle gesamte Stacks unter Verwendung von docker stack deploy mit einer Compose-Datei bereit.
Kubernetes hat den Orchestrierungskrieg gewonnen. Für kleinere Deployments ist Swarm jedoch noch einfacher. Keine Lernkurve. Funktioniert einfach.
Docker-Netzwerkkonfiguration
Container müssen miteinander und mit der Außenwelt kommunizieren. Netzwerke ermöglichen das.
Liste Netzwerke mit docker network ls auf. Du siehst standardmäßig ‚bridge‘, ‚host‘ und ’none‘. Erstelle benutzerdefinierte Netzwerke mit docker network create networkname. Spezifiziere Treiber für Swarm mit --driver bridge oder --driver overlay.
Verbinde laufende Container mit Netzwerken über docker network connect networkname containername. Trenne mit docker network disconnect. Container können mehreren Netzwerken angehören.
Das Bridge-Netzwerk ist der Standard. Container im selben Bridge-Netzwerk können sich gegenseitig über Namen erreichen. Der Host-Netzwerkmodus gibt Containern direkten Zugriff auf den Netzwerstack des Hosts. Verwende --network host beim Starten von Containern, die maximale Netzwerkleistung benötigen.
Untersuche die Netzwerkinformationen mit docker network inspect networkname. Hier werden verbundene Container, IP-Adressen, Subnetzkonfiguration und Gateway-Einstellungen angezeigt. Entferne ungenutzte Netzwerke mit docker network rm networkname.
Mit benutzerdefinierten Netzwerken können sich Container via DNS erreichen. Erstelle sie aus diesem Grund, anstatt die Standard-Bridge zu verwenden. Name-Resolution ist praktischer als feste IP-Adressen.
Docker-Tutorial und Best Practices
Befehle sind eine Sache. Sie richtig einzusetzen ist eine andere.
- Beginne mit den Grundlagen. Installiere Docker. Führe
docker run hello-worldaus. Wenn das funktioniert, bist du startklar. Erstelle eine einfache Docker-Datei. Erstelle ein Image. Führe einen Container aus. Experimentiere. Behebe Fehler. - Halte die Images klein. Jede Schicht erhöht die Größe. Kombiniere RUN-Befehle. Bereinige die Paketcaches in derselben Schicht, in der du sie installierst. Verwende Multistage-Builds, um Build-Abhängigkeiten von Laufzeitabhängigkeiten zu trennen.
- Führe Container nicht als Root aus. Erstelle einen Benutzer in deinem Dockerfile mit
RUN useradd. Wechsle zu ihm mitUSER username. Sicherheit ist auch in Containern wichtig. - Kennzeichne deine Images richtig. Verwende semantische Versionierung. Verlassen dich in der Produktion niemals auf „latest“. Lege genaue Versionen in deinen Deployment-Konfigurationen fest. Wenn ein Image aktualisiert wird und deine App funktionsunfähig macht, wirst du verstehen, warum.
- Überwache den Ressourcenverbrauch. Setze Speichergrenzen mit
--memory. Begrenze die CPU mit--cpus. Ein Container, der alle verfügbaren Ressourcen verbraucht, bringt den gesamten Host zum Stillstand. - Verwende Gesundheitschecks. Füge
HEALTHCHECKAnweisungen deinem Dockerfile hinzu. Docker kann dann fehlerhafte Container automatisch neu starten. Besser, als darauf zu warten, dass dich dein Überwachungssystem alarmiert. - Bewahre sensible Daten richtig auf. Bette sie nicht in Images ein. Gib sie nicht als Umgebungsvariablen weiter, die im
docker inspectangezeigt werden. Verwende Docker-Secrets für Swarm oder externe Secret-Management-Tools.
Die Befehle in diesem Guide decken 90 % der täglichen Docker-Arbeit ab. Die anderen 10 %? Hierfür liest du die Dokumentation, suchst nach GitHub-Problemen und stellst Lösungen von Stack Overflow zusammen. Willkommen bei der Containerisierung!