17 Docker Basics
Nach diesem Kapitel können Sie:
- Docker als Deployment-Werkzeug erklären
- Images und Container unterscheiden
- Container starten und verwalten
- Volumes einsetzen
- Docker Compose verwenden
17.1 Einführung
17.1.1 Wichtige Begriffe
| OT | Operational Technology |
| IT | Information Technology |
| Edge System | Industrie-PC oder Edge Gateway |
| Deployment | Bereitstellung einer Anwendung |
17.1.2 Ein typisches Problem aus der Praxis
Stellen wir uns eine moderne Produktionsanlage vor:
Ein Industrie PC (Edge Device) sammelt Prozessdaten aus mehreren Maschinen. Die Daten werden über MQTT übertragen, von einer Middleware verarbeitet, in einer Datenbank gespeichert und anschliessend visualisiert. Technisch besteht das System aus mehreren Anwendungen:
- MQTT Broker
- Node-RED
- Datenbank
- Dashboard
Während der Entwicklung auf dem Engineering-Laptop funktioniert alles problemlos. Bei der Inbetriebnahme auf dem Industrie-PC treten jedoch die ersten Schwierigkeiten auf:
- Die benötigte Python-Version fehlt.
- Bibliotheken besitzen andere Versionsstände.
- Eine Datenbank wurde anders konfiguriert.
- Nach einem Betriebssystemupdate funktioniert die Anwendung nicht mehr wie erwartet.
Je mehr Softwarekomponenten beteiligt sind, desto schwieriger wird die Bereitstellung und Wartung solcher Systeme.
17.1.3 Warum dieses Dokument?
Docker löst genau dieses Problem. Anstatt nur die eigentliche Anwendung auszuliefern, wird die komplette Laufzeitumgebung mitgeliefert. Dadurch kann dieselbe Anwendung auf unterschiedlichen Systemen mit identischem Verhalten betrieben werden. Ein Container, der auf dem Entwicklungslaptop funktioniert, verhält sich auf dem Industrie-PC oder in der Cloud gleich.
Dieses Dokument beschreibt Docker aus Sicht eines Automationsingenieurs. Ziel ist nicht die vollständige Beschreibung aller Docker-Funktionen, sondern das Verständnis von Docker als Werkzeug zur reproduzierbaren Bereitstellung von Software in der vertikalen Integration.
Viele Beispiele orientieren sich deshalb an typischen OT-Anwendungen wie:
- Node-RED
- MQTT Broker
- Historian-Systeme
- Datenbanken
- Dashboards
- Edge Gateways
17.2 Docker installieren
Bevor wir mit Docker arbeiten können, muss Docker auf dem lokalen System installiert werden.
Die folgenden Schritte beschreiben die Installation unter Windows. Für Linux und macOS stehen entsprechende Installationspakete auf der Docker Webseite zur Verfügung Docker Installation
Hinweis: Für Linux muss nicht zwingend Docker Desktop genutzt werden. Die normale Docker Engine reicht völlig.
17.2.1 Voraussetzungen für Docker Desktop Windows
Docker Desktop benötigt:
- Windows 10 (Version 2004 oder neuer)
- Windows 11
Zusätzlich wird das Windows Subsystem for Linux (WSL) verwendet.
17.2.2 WSL installieren
Öffnen Sie eine Eingabeaufforderung als Administrator und führen Sie folgenden Befehl aus:
wsl --installStarten Sie anschliessend den Computer neu.
WSL (Windows Subsystem for Linux) ermöglicht die Ausführung einer Linux-Umgebung innerhalb von Windows und dient Docker als Laufzeitumgebung.
17.2.3 Docker Desktop installieren
Laden Sie Docker Desktop herunter:
https://www.docker.com/products/docker-desktop/
Während der Installation:
- WSL 2 als Backend verwenden
- Standardoptionen übernehmen
- Es ist kein Docker-Konto erforderlich
Nach der Installation neustarten - Docker sollte automatisch gestartet werden.
17.2.4 Installation überprüfen
Öffnen Sie eine Eingabeaufforderung und führen Sie folgenden Befehl aus:
docker run hello-worldDocker lädt dabei automatisch ein Test-Image herunter und startet einen Container. Bei erfolgreicher Installation erscheint eine Meldung ähnlich zu:
Hello from Docker!
This message shows that your installation appears to be working correctly.
17.2.5 Docker Version prüfen
Die installierte Docker-Version kann mit folgendem Befehl angezeigt werden:
docker versionZusätzliche Informationen zum Docker-System:
docker info17.2.6 Häufige Probleme
17.2.6.1 Docker startet nicht
Prüfen:
- Ist Docker Desktop gestartet?
- Läuft WSL korrekt?
- Wurde der Rechner nach der Installation neu gestartet?
17.2.6.2 Der Befehl docker wird nicht gefunden
Prüfen:
- Docker Desktop wurde korrekt installiert.
- Ein neues Terminal wurde geöffnet.
- Docker Desktop läuft im Hintergrund.
17.3 Warum Docker?
Nachdem wir das Problem kennen, stellt sich die Frage:
Warum werden heute für solche Anwendungen zunehmend Container eingesetzt?
17.3.1 Moderne Anwendungen bestehen aus mehreren Diensten
Früher bestand eine Anwendung häufig aus einem einzigen Programm (Monolith). Heute werden Anwendungen meist in mehrere spezialisierte Dienste aufgeteilt.
Ein typisches Beispiel aus dem Automatisierungsumfeld:
Feldgeräte
│
MQTT Broker
│
Node-RED
│
Datenbank
│
Dashboard
Jede Komponente besitzt ihre eigene Aufgabe - Nach diesem Aufbau könnte z.B. ein Roboter Staubsauger funktionieren. Was auffällt: Es sind vorallem IT-Anwendungen. Denken wir an Steuerungssoftware ist diese oft noch als Monolith konzipiert - Natürlich ist der echtzeitfähige Teil in der Steuerung gelöst, genauso aber die Kommunikation zum Leitsystem oder die Datensammlung für eine Condition Monitoring Anwendung.
Durch die Aufteilung entstehen Vorteile:
- Komponenten können unabhängig aktualisiert werden.
- Fehler bleiben auf einzelne Dienste begrenzt.
- Systeme werden einfacher skalierbar.
- Einzelne Komponenten können bei Bedarf ersetzt werden.
- Fachpersonen einzelner Komponenten könnten ihr System optimal designen
- …
Gleichzeitig steigt jedoch die Komplexität der Bereitstellung.
17.3.2 Klassische Bereitstellung
Bei einer klassischen Installation muss jede Anwendung manuell installiert werden.
Dazu gehören oft:
- Betriebssystempakete
- Bibliotheken
- Laufzeitumgebungen
- Konfigurationsdateien
- Benutzerkonten
Bereits kleine Unterschiede zwischen Entwicklungs- und Zielsystem können zu Problemen führen.
Der bekannte Satz:
“Auf meinem Rechner funktioniert es.”
ist häufig das Ergebnis unterschiedlicher Laufzeitumgebungen.
17.3.3 Container als Lösung
Container verfolgen einen anderen Ansatz. Anstatt nur die Anwendung bereitzustellen, wird die komplette Laufzeitumgebung paketiert.
Ein Container enthält beispielsweise:
- die Anwendung
- benötigte Bibliotheken
- Konfigurationen
- Werkzeuge
- Laufzeitumgebung
Dadurch entsteht eine reproduzierbare Umgebung. Der Container verhält sich unabhängig vom Zielsystem immer gleich. Dies vereinfacht
- Entwicklung
- Test
- Inbetriebnahme
- Wartung
- Updates
erheblich.
17.3.4 Warum nicht einfach virtuelle Maschinen?
Virtuelle Maschinen lösen ein ähnliches Problem. Auch sie isolieren Anwendungen voneinander und ermöglichen den Betrieb mehrerer Systeme auf einer gemeinsamen Hardware.
Eine virtuelle Maschine ist im Grunde ein vollständiger Computer, der in Software nachgebildet wird. Auf einem einzigen physischen Computer lassen sich so mehrere voneinander unabhängige Systeme betreiben – jedes mit eigenem Betriebssystem, eigenen Treibern und eigenem Kernel. Eine Hypervisor-Schicht (z.B. VMware, Hyper-V oder VirtualBox) übernimmt dabei die Aufgabe, die physischen Ressourcen aufzuteilen und den virtuellen Maschinen zugänglich zu machen.
Physischer Host
│
|─ VM 1
│ |─ Betriebssystem
│
|─ VM 2
│ |─ Betriebssystem
│
|─ VM 3
|─ Betriebssystem
Der Preis dafür ist der Ressourcenbedarf. Jede VM trägt ihr vollständiges Betriebssystem mit sich – inklusive aller Systemdienste, die beim Start mitgestartet werden, unabhängig davon ob sie gebraucht werden oder nicht. Eine VM, die nur einen einzigen Dienst betreibt, belegt damit trotzdem mehrere Gigabyte RAM und Speicherplatz. Auf einem Industrie-PC mit 4 GB RAM lassen sich auf diese Weise kaum sinnvoll mehrere Dienste parallel betreiben. Hinzu kommt, dass VMs typischerweise Minuten zum Starten benötigen – für dynamischere Deployment-Szenarien ein spürbarer Nachteil.
Container teilen sich hingegen den Kernel des Hostsystems.
Physischer Host mit Linux Betriebssystem
│
|─ Container 1
|─ Container 2
|─ Container 3
│
|─ Gemeinsamer Kernel
Dadurch benötigen Container deutlich weniger Speicher und starten innerhalb weniger Sekunden. Für typische Edge-Anwendungen ist dies häufig ausreichend und deutlich effizienter.
Virtuelle Maschinen und Container lösen unterschiedliche Probleme. VMs bieten eine stärkere Isolation und eignen sich besonders für unterschiedliche Betriebssysteme oder streng getrennte Umgebungen.
Container eignen sich hervorragend für die Bereitstellung einzelner Dienste und Anwendungen.
In vielen Produktionsumgebungen werden beide Technologien gemeinsam eingesetzt.
17.3.5 Wo Docker heute eingesetzt wird
Docker stammt ursprünglich aus der IT-Welt. Heute wird Docker jedoch zunehmend auch in der OT eingesetzt.
Typische Anwendungsfälle sind:
- MQTT Broker
- Node-RED
- OPC-UA Gateways
- Historian-Systeme
- Datenbanken
- Dashboards
- Analyse- und KI-Anwendungen
- Edge Computing
Gerade auf Industrie-PCs und Edge-Systemen hat sich Docker als Standardwerkzeug für die Bereitstellung solcher Anwendungen etabliert.
17.3.6 Wie weiter…
Nachdem nun klar ist, warum Docker eingesetzt wird, betrachten wir im nächsten Kapitel die grundlegenden Bausteine von Docker.
Dabei lernen wir die wichtigsten Konzepte kennen:
- Images
- Container
- Volumes
- Netzwerke
- Docker Compose
Diese fünf Bausteine bilden die Grundlage für nahezu jede Docker-Anwendung.
Docker ist keine Anwendung zur Entwicklung von Software.
Docker ist ein Werkzeug zur reproduzierbaren Bereitstellung von Software.
Genau deshalb spielt Docker heute eine zentrale Rolle in der vertikalen Integration zwischen OT und IT.
17.4 Docker verstehen
Docker wird häufig als kompliziert wahrgenommen. Tatsächlich bestehen die meisten Installationen lediglich aus einigen wenigen Bausteinen. Für den tägliche Einsatz von Docker genügt es 6 Begriffe zu verstehen:
| Image | Vorlage eines Containers |
| Container | Laufende Instanz eines Images |
| Volume | Persistenter Datenspeicher |
| Netzwerk | Kommunikation zwischen Containern und nach aussen |
| Compose | Beschreibung eines Gesamtsystems |
| Registry | Speicherort für Images |
Wer diese 6 Konzepte verstanden hat, kann bereits die meisten Docker-Anwendungen betreiben und Fehler analysieren.
17.4.1 Die Docker Engine
Ein typischer Docker-Host könnte folgendermassen aussehen:
Docker Host
|- Docker Engine
│
|- Container Node-RED
|- Container InfluxDB
|- Container Grafana
│
|- Netzwerk
│
|- Volumes
Die Docker Engine verwaltet alle Container, Netzwerke und Volumes auf dem System. Die einzelnen Anwendungen laufen dabei als eigenständige Container. Sie wird in der Regel durch ein CLI (Command Line Interface) angesprochen. Anwendungen wie Portainer oder Docker Desktop liefern aber auch GUI Varianten dazu.
17.4.2 Images
Ein Image ist die Vorlage eines Containers. Man kann sich ein Image wie einen Bauplan vorstellen.
Das Image beschreibt:
- Welche Software installiert ist
- Welche Bibliotheken benötigt werden
- Welche Konfiguration vorhanden ist
- Welcher Prozess gestartet werden soll
Ein Image wird selbst niemals ausgeführt. Es dient lediglich als Vorlage zur Erzeugung eines Containers.
In einem Vergleich mit Objekt Orientierter Programmierung ist das Image die Klasse, woraus Objekte (Container) instanziert werden können.
17.4.3 Container
Ein Container ist eine laufende Instanz eines Images. Beim Start erstellt Docker eine isolierte Laufzeitumgebung.
Diese besitzt:
- eigene Prozesse
- eigenes Dateisystem
- eigene Netzwerkschnittstelle
- eigene Benutzer
Dadurch werden Anwendungen voneinander getrennt. Aus Sicht der Anwendung wirkt der Container wie ein eigenständiges System. Technisch laufen die Prozesse jedoch direkt auf dem Hostsystem.
17.4.3.1 Warum Container?
Container besitzen mehrere Vorteile:
- schnelle Startzeiten
- geringer Ressourcenbedarf
- reproduzierbare Umgebung
- einfache Verteilung
Für typische OT-Anwendungen bedeutet dies: Ein Container kann auf dem Engineering-Laptop entwickelt und anschliessend unverändert auf einem Industrie-PC oder Edge Gateway betrieben werden.
17.4.4 Volumes
Container sollten grundsätzlich als temporär betrachtet werden. Ein Container kann jederzeit gelöscht und neu erstellt werden. Wichtige Daten dürfen deshalb nicht ausschliesslich im Container gespeichert werden. Docker stellt dafür sogenannte Volumes bereit. Ein Volume ist ein Speicherbereich ausserhalb des Containers.
Typische Daten in Volumes:
- Konfigurationsdateien
- Datenbanken
- Zertifikate
- Benutzerdaten
- Logdateien
Wird ein Container gelöscht, bleiben die Daten im Volume erhalten.
17.4.5 Netzwerke
Container besitzen standardmässig ihre eigene Netzwerkschnittstelle. Docker stellt verschiedene Netzwerkmechanismen zur Verfügung.
Dadurch können Container:
- miteinander kommunizieren
- auf das Internet zugreifen
- Dienste für andere Systeme bereitstellen
Die Kommunikation erfolgt dabei häufig vollständig innerhalb eines Docker-Netzwerks. Dadurch müssen nicht alle Dienste nach aussen veröffentlicht werden.
17.4.5.1 Ports
Soll ein Dienst von ausserhalb des Containers erreichbar sein, muss ein Port veröffentlicht werden.
Beispiel:
docker run -p 1880:1880 imageDabei gilt:
HostPort : ContainerPort
In diesem Beispiel wird Port 1880 des Containers auf Port 1880 des Hosts veröffentlicht.
17.4.6 Compose
Sobald mehrere Container zusammenarbeiten, werden einzelne Docker-Befehle schnell unübersichtlich.
Stellen wir uns folgendes System vor:
- MQTT Broker
- Node-RED
- InfluxDB
- Grafana
Für jeden Container müssten:
- Ports
- Volumes
- Netzwerke
- Umgebungsvariablen
konfiguriert werden.
Docker Compose ermöglicht es, diese Beschreibung in einer einzigen Datei abzulegen.
Eine Compose-Datei beschreibt das gesamte System deklarativ.
services:
mqtt:
image: eclipse-mosquitto
nodered:
image: nodered/node-red
grafana:
image: grafana/grafanaDas komplette System kann anschliessend mit einem einzigen Befehl gestartet werden.
docker compose up -d17.4.7 Registries
Images werden typischerweise nicht lokal erstellt, sondern aus einer Registry heruntergeladen. Eine Registry ist vergleichbar mit einem Paketdepot für Container-Images.
Bekannte Beispiele sind:
- Docker Hub
- GitHub Container Registry
- GitLab Container Registry
- Private Unternehmensregistries
Der Docker Hub stellt beispielsweise Images für:
- Node-RED
- Grafana
- InfluxDB
- Eclipse Mosquitto
bereit.
17.5 Der Lebenszyklus eines Containers
Bisher haben wir die wichtigsten Docker-Bausteine kennengelernt. Bevor wir den ersten Container starten, betrachten wir den typischen Lebenszyklus eines Containers. Die folgenden Befehle zeigen dazu die wichtigsten Funktionen.
Hinweis: Container können in diesen Befehlen mittels Name oder der Container ID angesprochen werden. Bei der ID müssen nur soviele Zeichen eingegeben werden, bis diese eineindeutig von den anderen vorhandenen Containern unterschieden werden kann.
17.5.1 Container erstellen und starten
Der Befehl docker run erstellt einen neuen Container aus einem Image und startet ihn unmittelbar.
docker run imageExistiert das Image noch nicht lokal, wird es automatisch heruntergeladen.
17.5.2 Laufende Container anzeigen
docker ps
docker ps -aNur laufende Container werden angezeigt. Mit der Option -a werden alle angezeigt.
17.5.3 Container stoppen
docker stop <container>Der Container bleibt erhalten, wird jedoch nicht mehr ausgeführt.
17.5.4 Container starten
docker start <container>Ein bereits vorhandener Container wird erneut gestartet.
17.5.5 Container löschen
docker rm <container>Dadurch wird der Container entfernt. Volumes bleiben dabei erhalten.
Ein Container ist nicht dasselbe wie ein Image.
Ein Container kann gelöscht werden, ohne dass das zugrunde liegende Image verloren geht.
17.6 Der erste Container
Nachdem die Grundlagen bekannt sind, starten wir nun den ersten konkreten Container. Als Beispiel verwenden wir Node-RED.
17.6.1 Container starten
docker run -d --name nodered -p 1880:1880 nodered/node-redDocker führt dabei automatisch mehrere Schritte aus:
- Image suchen
- Image herunterladen
- Container erstellen
- Netzwerk konfigurieren
- Anwendung starten
17.6.2 Container anzeigen
docker ps17.6.3 Anwendung öffnen
http://localhost:1880
Node-RED sollte nun erreichbar sein.
17.6.4 Logs anzeigen
docker logs -f noderedLogs sind häufig die erste Anlaufstelle bei Problemen.
17.6.5 Shell öffnen
docker exec -it nodered shNun befindet man sich direkt innerhalb des Containers in der Standard Shell
17.6.6 Container stoppen
docker stop nodered17.6.7 Container starten
docker start nodered17.6.8 Container löschen
docker rm -f noderedDie Option -f steht für Force. Dies zwingt Docker den Container zu entfernen auch wenn dieser noch laufen würde.
17.6.9 Was haben wir gelernt?
- Image verwenden
- Container starten
- Logs lesen
- Container betreten
- Container stoppen
- Container löschen
17.7 Persistente Daten mit Volumes
Container sind grundsätzlich temporär. Wird ein Container gelöscht, gehen alle innerhalb des Containers gespeicherten Daten verloren. Ein klassischer Anwendungsfall: von einer Anwendung gibt es eine neue Image Version und ich möchte diese nutzen, mit meiner bestehenden Konfiguration. In diesem Fall sollte die Konfiguration persistent in einem Volume ausserhalb des Containers gespeichert werden, so dass der neue Container lediglich auf den gleichen Speicherbereich zeigen muss.
17.7.1 Named Volume erstellen
Bei einem Named Volume wie nodered-data übernimmt Docker den effektiven Speicherort. Der angegebene Text dient als Referenz zu diesem Speicher Ort. Im folgenden wird spezifisch ein Volume erstellt. Dies geht genauso beim Aufruf direkt in einem Container Kommando.
docker volume create nodered-dataIm folgenden Beispiel wird das Volume nodered-data auf den Ordner /data im Container gemappt.
docker run -d \
--name nodered \
-p 1880:1880 \
-v nodered-data:/data \
nodered/node-redHinweis: Wird das Volume neu erzeugt, wird Initial der Inhalt des verlinkten Ordners im Container an den Speicherort auf dem Hostsystem kopiert. Dies ist besonders praktisch wenn der Hersteller eine Default Konfiguration anbietet, die ich gerne selbst modifizieren möchte.
17.7.2 Bind Mounts
Alternativ kann ein bestehender Ordner eingebunden werden. Die dabei angegebenen Paramter hostpfad:contianerpfadsind effektive Dateipfade.
Linux:
docker run -v /opt/config:/config imageWindows:
docker run -v C:\config:/config image17.8 Container Netzwerk
Container arbeiten selten alleine. Typischerweise kommunizieren mehrere Dienste miteinander.
17.8.1 Bridge Netzwerk
Standardmässig verwendet Docker ein Default Bridge Netzwerk. Dieses Netzwerk kann man sich wie ein Switch vorstellen, an dem alle Container und ein virtuelles Interface des Hosts angeschlossen ist. Das Default Bridge Netzwerk erlaubt Kommunikation per IP zwischen den Teilnehmern. In dieser Bridge ist die Kommunikation per Hostnamen (DNS) nicht möglich.
Die erstellen Netzwerke haben ein NAT zum eigentlichen Host Interface, wodurch von Aussen nur die Host IP, nicht aber die Container IP sichtbar ist.
Container A
│
▼
Docker Bridge
▲
│
Container B
17.8.2 Eigenes Netzwerk erstellen
In Docker können eigene Netzwerke erstellt und den Containern entsprechend zugewiesen werden. Es existieren mehrere Adaptertypen wie z.B: Bridge, Host usw., per Default wird aber immer Bridge genutzt.
Hinweis: Ein User Bridge Netzwerk funktioniert gleich wie das Default Bridge Netzwerk, jedoch ist darin die Nutzung von DNS möglich.
docker network create fhnw-net17.8.3 Container verbinden
docker run -d \
--name influxdb \
--network fhnw-net \
influxdb:2.7docker run -d \
--name nodered \
--network fhnw-net \
nodered/node-red17.8.4 Ports veröffentlichen
Das veröffentlichen von Ports ist eine Dockeranweisung an die Firewall, den entsprechenden Port verfügbar zu machen.
Dieses Beispiel erlaubt den Zugriff auf den Port 1880 auf dem Host auf allen verfügbaren Schnittstellen:
docker run -p 1880:1880 imageNur lokal:
docker run -p 127.0.0.1:1880:1880 image17.9 Mehrere Container mit Compose
Sobald mehrere Container verwendet werden, wird die Konfiguration schnell unübersichtlich.
Docker Compose beschreibt ein gesamtes System in einer Datei.
17.9.1 Beispiel
services:
mosquitto:
image: eclipse-mosquitto
nodered:
image: nodered/node-red
ports:
- "1880:1880"17.9.2 Starten
docker compose up -d17.9.3 Status
docker compose ps17.9.4 Logs
docker compose logs -f17.9.5 Stoppen
docker compose down17.9.6 Warum Compose?
Vorteile:
- Dokumentation der Infrastruktur
- Reproduzierbare Deployments
- Versionskontrolle
- Einfaches Update von Diensten
17.10 Troubleshooting
17.10.1 Container startet nicht
Logs prüfen:
docker logs <container>17.10.2 Port nicht erreichbar
Prüfen:
docker ps17.10.3 Container findet anderen Container nicht
Netzwerk prüfen:
docker network lsContainer prüfen:
docker inspect <container>17.10.4 Volume funktioniert nicht
Volumes anzeigen:
docker volume lsDetails:
docker volume inspect <volume>17.10.5 Allgemeine Diagnose
docker statsdocker inspect <container>docker logs -f <container>17.11 Docker Cheat Sheet
17.11.1 Container
docker ps # Laufende Container
docker ps -a # Alle Container
docker run # Container starten
docker start <name> # Gestoppten Container starten
docker stop <name> # Container stoppen
docker restart <name> # Container neustarten
docker rm <name> # Container löschen
docker exec -it <name> sh # Shell im Container öffnen
docker inspect <name> # Details anzeigen
docker stats # CPU/RAM-Auslastung17.11.2 Images
docker images # Lokale Images
docker pull <image> # Image herunterladen
docker build -t <name> . # Image bauen
docker rmi <image> # Image löschen
docker save -o out.tar <img> # Image exportieren
docker load -i out.tar # Image importieren17.11.3 Logs
docker logs <name> # Logs anzeigen
docker logs -f <name> # Logs live verfolgen
docker logs --tail 50 <name> # Letzte 50 Zeilen17.11.4 Volumes
docker volume ls
docker volume create <name>
docker volume inspect <name>
docker volume prune17.11.5 Netzwerke
docker network ls
docker network create <name>
docker network connect <net> <container>17.11.6 Compose
docker compose up -d # Stack starten
docker compose down # Stack stoppen, Container entfernen
docker compose down -v # + Volumes löschen
docker compose ps # Status
docker compose logs -f # Live-Logs
docker compose pull # Neue Images holen
docker compose up -d --build # Neu bauen und starten17.11.7 Aufräumen
docker image prune # Ungenutzte Images
docker container prune # Gestoppte Container
docker volume prune # Ungenutzte Volumes
docker system prune -a # Alles Ungenutzte
docker system df # Speicherverbrauch