7.1 Einbindung von Volumes
Die Einbindung von Volumes und Netzwerken in Docker Compose macht es möglich, flexible und effiziente Multi-Container-Anwendungen zu erstellen. Volumes werden verwendet, um Daten zu speichern, die außerhalb von Containern erhalten bleiben sollen, während Netzwerke die Interaktion zwischen Containern ermöglichen. In dieser Vorlesung schauen wir uns im Detail an, wie man Volumes und Netzwerke in Docker Compose nutzt.
Volumes in Docker ermöglichen es, Daten außerhalb von Containern zu speichern, sodass sie auch nach dem Stoppen oder Löschen von Containern verfügbar bleiben. Das ist besonders nützlich für die Speicherung von Datenbanken, Logdateien und anderen langfristigen Daten.
Volume-Typen:
- Named Volumes (Benannte Volumes): Diese werden von Docker verwaltet und in einem speziellen Verzeichnis auf dem Host gespeichert.
- Bind Mounts (Gebundene Volumes): Diese werden aus einem angegebenen Verzeichnis auf dem Host in den Container eingebunden.
Definition von Volumes in Docker Compose
Beispiel für Named Volumes
In diesem Beispiel wird ein Named Volume postgres-data erstellt, das in das Verzeichnis /var/lib/postgresql/data innerhalb des Containers db eingebunden wird.
version: '3.8'
services:
db:
image: postgres:latest
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
Beispiel für Bind Mounts
In diesem Beispiel werden lokale Verzeichnisse und Dateien nginx.conf und html als Bind Mounts in den Container web eingebunden.
version: '3.8'
services:
web:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
7.2 Netzwerkeinbindung
Netzwerke in Docker Compose ermöglichen Containern, miteinander zu interagieren. Jeder Container kann mit einem oder mehreren Netzwerken verbunden sein, was Isolierung und Traffic-Kontrolle bietet.
Netzwerktypen:
- Bridge-Netzwerke: Standardmäßig werden Container mit einem Bridge-Netzwerk verbunden, das ihre Interaktion auf einem Host ermöglicht.
- Overlay-Netzwerke: Werden verwendet, um Container auf verschiedenen Hosts in einem Docker-Swarm-Cluster zu verbinden.
- Netzwerk-Plugins: Ermöglichen die Nutzung von Drittanbieter-Netzwerktreibern für komplexere Konfigurationen.
Beispiel für die Erstellung und Nutzung benutzerdefinierter Netzwerke
In diesem Beispiel werden zwei benutzerdefinierte Netzwerke erstellt: front-end und back-end. Der Service app ist mit beiden Netzwerken verbunden, der Service web nur mit front-end, und der Service db nur mit back-end.
version: '3.8'
services:
web:
image: nginx:latest
networks:
- front-end
app:
image: myapp:latest
networks:
- front-end
- back-end
db:
image: postgres:latest
networks:
- back-end
networks:
front-end:
back-end:
Praxistipps:
- Verwendung benannter Volumes: Benannte Volumes werden von Docker verwaltet und bieten einfache Nutzung und Datenverwaltung. Benannte Volumes können gleichzeitig an mehrere Dienste angeschlossen werden. Zum Beispiel schreibt der Backend-Service Logs, und der Monitoring-Service analysiert sie und benachrichtigt bei Fehlern auf
error-Ebene. - Trennung von Netzwerken: Die Nutzung mehrerer Netzwerke erlaubt es, verschiedene Teile der Anwendung zu isolieren und ihre Interaktion zu steuern.
- Speicherung von Konfigurationsdateien: Nutze gebundene Volumes, um Konfigurationsdateien zu mounten, was es ermöglicht, die Konfiguration einfach zu ändern, ohne Images neu aufzubauen.
- Netzwerksicherheit: Beschränke den Zugriff auf Netzwerke, sodass nur notwendige Container interagieren können. Das erhöht die Sicherheit der Anwendung.
7.3 Beispiele für die Nutzung von Volumes und Netzwerken
Beispiele für die Nutzung von Volumes und Netzwerken in Docker Compose:
Beispiel 1: Anwendung mit Webserver und Datenbank
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
networks:
- webnet
db:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- db-data:/var/lib/postgresql/data
networks:
- webnet
volumes:
db-data:
networks:
webnet:
In diesem Beispiel:
- Der Webserver nginx und die Datenbank PostgreSQL sind mit demselben Netzwerk webnet verbunden, was ihre Interaktion ermöglicht. Wenn nur ein Netzwerk verwendet wird, kann es ausgelassen werden – ein Standardnetzwerk wird automatisch erstellt.
- Die Daten der Datenbank werden in einem benannten Volume db-data gespeichert, was ihre Persistenz beim Neustart der Container sicherstellt.
Beispiel 2: Anwendung mit mehreren Ebenen
version: '3.8'
services:
frontend:
image: myfrontend:latest
networks:
- front-tier
- back-tier
backend:
image: mybackend:latest
networks:
- back-tier
volumes:
- backend-data:/var/lib/backend
database:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db-data:/var/lib/mysql
networks:
- back-tier
volumes:
backend-data:
db-data:
networks:
front-tier:
back-tier:
In diesem Beispiel:
- Es wurden zwei Netzwerke erstellt: front-tier und back-tier.
- Der Service frontend ist mit beiden Netzwerken verbunden, was ihm ermöglicht, sowohl mit backend als auch mit externen Clients zu interagieren.
- Die Services backend und database sind nur mit dem Netzwerk back-tier verbunden, um ihre Isolation und Interaktion zu gewährleisten.
- Die Daten der Services backend und database werden in separaten benannten Volumes backend-data und db-data gespeichert.
GO TO FULL VERSION