Was ist Docker?
Docker ist eine Plattform, die Anwendungen und ihre Abhängigkeiten verpackt und so sicherstellt, dass sie in jeder Umgebung konsistent laufen. Diese Pakete werden Container genannt. Docker erleichtert es Entwicklern, ihre Anwendungen zu entwickeln, zu versenden und auszuführen. Es ähnelt der Virtualisierungstechnologie, ist aber leichter und nutzt Ressourcen effizienter.
- Grundlegende Konzepte: Docker-Images, Container, Dockerfile, Docker Hub, Docker Compose
- Vorteile: Portabilität, Isolation, Skalierbarkeit, Effizienz
Was ist ein Container? Was ist der Unterschied zu einer virtuellen Maschine?
Ein Container ist eine isolierte Umgebung, die alles enthält, was eine Anwendung zum Ausführen benötigt (Code, Laufzeitumgebung, Systemwerkzeuge, Systembibliotheken, Einstellungen). Virtuelle Maschinen (VMs) hingegen sind virtualisierte Kopien einer physischen Hardware und haben ihre eigenen Betriebssysteme.
Hauptunterschiede:
- Größe und Gewicht: Container sind viel kleiner als VMs und verbrauchen weniger Ressourcen. VMs sind größer und benötigen mehr Ressourcen, da sie ein vollständiges Betriebssystem enthalten.
- Startzeit: Container können in Sekundenschnelle gestartet werden, während das Starten von VMs länger dauert.
- Ressourcennutzung: Container teilen sich den Kernel des Host-Betriebssystems und nutzen Ressourcen effizienter. VMs hingegen verbrauchen mehr Ressourcen, da sie ihre eigenen Betriebssysteme haben.
Merkmal | Container | Virtuelle Maschine (VM) |
---|---|---|
Größe | Klein (MB) | Groß (GB) |
Startzeit | Schnell (Sekunden) | Langsam (Minuten) |
Ressourcennutzung | Niedrig | Hoch |
Isolation | Auf Prozessebene | Auf Hardwareebene |
Betriebssystem | Teilt sich den Host-OS-Kernel | Hat ein eigenes OS |
Beispiel: Betrachten wir eine Webanwendung. Mit Containern können wir alle Abhängigkeiten der Anwendung (z. B. Python-Laufzeitumgebung, erforderliche Bibliotheken) in einem Container verpacken. Dieser Container läuft in jeder Docker-Umgebung konsistent. Mit VMs müssten wir ein vollständiges Betriebssystem (z. B. Ubuntu) installieren und dann die Abhängigkeiten der Anwendung auf diesem Betriebssystem installieren.
Was ist ein Docker-Image? Was ist ein Dockerfile?
Ein Docker-Image ist eine schreibgeschützte Vorlage, die zum Erstellen eines Containers verwendet wird. Es enthält den Code der Anwendung, die Laufzeitumgebung, Systemwerkzeuge, Systembibliotheken und Einstellungen. Images können in einer Registry wie Docker Hub gespeichert und freigegeben werden.
Dockerfile ist eine Textdatei, die zum Erstellen eines Docker-Images verwendet wird. Sie enthält Anweisungen, die festlegen, wie das Image erstellt werden soll. Diese Anweisungen umfassen Vorgänge wie das Angeben des Basis-Images, das Kopieren von Dateien, das Ausführen von Befehlen und das Festlegen von Umgebungsvariablen.
Dockerfile Beispiel:
# Verwende Ubuntu als Basis-Image
FROM ubuntu:latest
# Installiere die erforderlichen Pakete
RUN apt-get update && apt-get install -y python3 python3-pip
# Kopiere die Anwendungsdateien
COPY . /app
# Setze das Arbeitsverzeichnis
WORKDIR /app
# Installiere die Abhängigkeiten
RUN pip3 install -r requirements.txt
# Starte die Anwendung
CMD ["python3", "app.py"]
Schrittweise Image-Erstellung:
- Erstelle eine Dockerfile.
- Erstelle das Image mit dem Befehl
docker build
:docker build -t my-app .
- Du kannst das erstellte Image mit dem Befehl
docker images
auflisten. - Du kannst das Image in Docker Hub hochladen (optional).
Schritte zum Erstellen und Verwalten von Containern in Linux
Die Schritte zum Erstellen und Verwalten von Containern in Linux sind wie folgt:
- Docker-Installation: Führe die Docker-Installation aus, die für deine Linux-Distribution geeignet ist. Zum Beispiel für Ubuntu:
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
- Docker-Dienst starten:
sudo systemctl start docker
- Docker-Image herunterladen: Lade ein Image von Docker Hub herunter (z. B. Ubuntu):
docker pull ubuntu:latest
- Container erstellen: Erstelle einen Container aus dem heruntergeladenen Image:
docker run -it ubuntu:latest /bin/bash
-it
: Interaktiver Terminalmodusubuntu:latest
: Image-Name und Tag/bin/bash
: Befehl, der im Container ausgeführt werden soll
- Container-Verwaltung: Du kannst die folgenden Befehle verwenden, um Container zu verwalten:
docker ps
: Listet die laufenden Container auf.docker ps -a
: Listet alle Container auf (laufende und gestoppte).docker stop [container_id]
: Stoppt den Container.docker start [container_id]
: Startet den Container.docker restart [container_id]
: Startet den Container neu.docker rm [container_id]
: Löscht den Container.docker exec -it [container_id] /bin/bash
: Verbindet sich mit einem laufenden Container.
Beispiel: Um einen Nginx-Webserver auszuführen:
- Nginx-Image herunterladen:
docker pull nginx:latest
- Container erstellen und Port 80 dem Port 80 des Host-Rechners zuordnen:
docker run -d -p 80:80 nginx:latest
-d
: Im Hintergrund ausführen-p 80:80
: Port 80 des Host-Rechners dem Port 80 des Containers zuordnen
- Überprüfen Sie, ob Nginx läuft, indem Sie in Ihrem Webbrowser zu
http://localhost
gehen.
Was ist Docker Compose? Wie wird es verwendet?
Docker Compose ist ein Tool, mit dem Anwendungen definiert und ausgeführt werden können, die aus mehreren Containern bestehen. Mithilfe einer YAML-Datei können Sie die Dienste, Netzwerke und Volumes der Anwendung definieren. Docker Compose ermöglicht die einfache Verwaltung komplexer Anwendungen.
Beispiel für eine Compose-Datei (docker-compose.yml):
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: postgres:13
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: mydb
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
Beschreibung:
version
: Version des Docker Compose-Dateiformatsservices
: Definiert die Dienste der Anwendung (z. B. web, db)image
: Zu verwendendes Docker-Image für den Dienstports
: Portzuordnungen zwischen dem Host-Rechner und dem Containervolumes
: Volumezuordnungen zwischen dem Host-Rechner und dem Containerenvironment
: Umgebungsvariablen innerhalb des Containers
Verwendung von Docker Compose:
- Erstellen Sie eine
docker-compose.yml
-Datei. - Führen Sie den folgenden Befehl im Verzeichnis aus, in dem sich die Datei befindet:
docker-compose up -d
up
: Startet die Anwendung-d
: Führt sie im Hintergrund aus
- Um die Anwendung zu stoppen:
docker-compose down
Was ist Docker Hub? Image-Veröffentlichungs- und -Abrufvorgänge
Docker Hub ist ein Cloud-basierter Registry-Dienst zum Speichern und Freigeben von Docker-Images. Entwickler können Docker Hub verwenden, um ihre eigenen Images zu veröffentlichen und die Images anderer abzurufen. Docker Hub unterstützt sowohl öffentliche als auch private Image-Repositories.
Verwendung von Docker Hub:
- Erstellen Sie ein Docker Hub-Konto.
- Melden Sie sich in Ihrem Terminal bei Ihrem Docker Hub-Konto an:
docker login
- Erstellen Sie Ihr eigenes Image oder kennzeichnen Sie ein vorhandenes Image:
docker tag my-app username/my-app:v1
my-app
: Der Name des vorhandenen Imagesusername
: Ihr Docker Hub-Benutzernamemy-app:v1
: Der Name und das Tag des neuen Images
- Senden Sie das Image an Docker Hub:
docker push username/my-app:v1
- So ziehen Sie ein anderes Image:
docker pull username/other-app:latest
Sicherheitsaspekte und Best Practices im Umgang mit Docker
Sicherheit ist ein wichtiges Thema bei der Verwendung von Docker. Hier sind einige Sicherheitsaspekte und Best Practices, die Sie beachten sollten:
- Sicherheit des Basis-Images: Verwenden Sie vertrauenswürdige und aktuelle Basis-Images. Bevorzugen Sie offizielle und verifizierte Images auf Docker Hub.
- Image-Scannen: Scannen Sie Ihre Images regelmäßig auf Sicherheitslücken. Docker Hub bietet Funktionen zur automatischen Image-Überprüfung. Sie können auch Tools von Drittanbietern wie Clair verwenden.
- Benutzerautorisierung: Vermeiden Sie es, Container als Root-Benutzer auszuführen. Erstellen Sie nach Möglichkeit einen dedizierten Benutzer und führen Sie den Container unter diesem Benutzer aus.
- Ressourcenbeschränkungen: Beschränken Sie die Ressourcen, die Container nutzen können, wie z. B. CPU, Speicher und Festplatte. Dies verhindert, dass ein Container übermäßig viele Ressourcen verbraucht und andere Container beeinträchtigt.
- Netzwerksicherheit: Beschränken Sie die Kommunikation zwischen Containern. Mithilfe von Docker-Netzwerken können Sie Container isolieren und nur zulassen, dass die erforderlichen Container miteinander kommunizieren.
- Verwaltung geheimer Informationen: Vermeiden Sie es, geheime Informationen wie API-Schlüssel, Passwörter und Zertifikate direkt in Container einzubetten. Verwenden Sie Tools wie Docker Secrets oder HashiCorp Vault, um geheime Informationen sicher zu verwalten.
- Dockerfile-Sicherheit: Vermeiden Sie es, unnötige Pakete in Ihren Dockerfiles zu installieren. Kopieren Sie außerdem beim Verwenden des Befehls
COPY
nur die erforderlichen Dateien. - Bleiben Sie auf dem Laufenden: Aktualisieren Sie Docker und zugehörige Tools regelmäßig. Sicherheitslücken werden in der Regel durch Updates behoben.
Sicherheitsthema | Bewährte Methode | Werkzeuge/Techniken |
---|---|---|
Grundlegende Image-Sicherheit | Verwenden Sie vertrauenswürdige und aktuelle Images | Offizielle Images, Verifizierte Images |
Image-Scanning | Scannen Sie Images auf Sicherheitslücken | Docker Hub automatisches Scannen, Clair |
Benutzerautorisierung | Führen Sie Container als Nicht-Root-Benutzer aus | USER Befehl |
Ressourcenbeschränkungen | Beschränken Sie CPU-, Speicher- und Festplattennutzung | docker run --cpus , --memory |
Netzwerksicherheit | Beschränken Sie die Kommunikation zwischen Containern | Docker-Netzwerke |
Geheimnismanagement | Verwalten Sie Geheimnisse sicher | Docker Secrets, HashiCorp Vault |