Eine Einführung in moderne Deployment-Technologien
1.0
Virtualisierung bezeichnet in der Informatik die Nachbildung eines Hard- oder Software-Objekts durch ein ähnliches Objekt vom selben Typ mit Hilfe einer Abstraktionsschicht.
Dadurch lassen sich virtuelle (d. h. nicht-physische) Geräte oder Dienste wie emulierte Hardware, Betriebssysteme, Datenspeicher oder Netzwerkressourcen erzeugen.
Dies erlaubt es etwa, Computer-Ressourcen (insbesondere im Server-Bereich) transparent zusammenzufassen oder aufzuteilen, oder ein Betriebssystem innerhalb eines anderen auszuführen. Dadurch können u. a. mehrere Betriebssysteme auf einem physischen Server oder „Host“ ausgeführt werden.
Ziel der Virtualisierung
Abstraktion der Hardware
Isolation zwischen Anwendungen
Optimale Ressourcennutzung
Flexibilität bei der Bereitstellung
Arten der Virtualisierung
Bare-Metal Virtualisierung: Virtualisierung direkt auf der Hardware
Hosted Virtualisierung: Virtualisierung auf einem Host-Betriebssystem
Containervirtualisierung: Virtualisierung von Systemressourcen eines Betriebssystems, teilt sich jedoch den Kernel mit dem Host-Betriebssytem.
Anwendungsvirtualisierung: Ausführung einer Anwendung in einer exclusiven, teilweise oder vollständig isolierten virtuellen Umgebung.
Bei der Bare-Metal Virtualisierung (auch Type-1 Hypervisor) läuft die Virtualisierungsschicht direkt auf der Hardware, ohne ein Host-Betriebssystem.
Vorteile
Bessere Performance: Kein Overhead durch Host-OS
Höhere Sicherheit: Weniger Angriffsfläche
Direkter Hardware-Zugriff: Optimale Ressourcennutzung
Enterprise-fähig: Für produktive Umgebungen geeignet
Nachteile
Komplexität: Schwerer zu installieren und zu verwalten
Hardware-Abhängigkeit: Hardware-Unterstützung erforderlich
Kosten: ggf. Lizenzkosten für Hypervisor-Software
Beispiele für Bare-Metal Hypervisoren:
Xen
VMware vSphere/ESXi
Microsoft Hyper-V (Server)
Citrix Hypervisor
...
Bei der Hosted Virtualisierung (auch Type-2 Hypervisor) läuft die Virtualisierungsschicht als Anwendung auf einem Host-Betriebssystem.
Vorteile
Einfache Installation: Wie normale Software
Flexibilität: Verschiedene Host-Betriebssysteme möglich (ggf. über Hardwarearchitekturgrenzen hinweg)
Entwicklungsumgebung: Ideal für Tests und Entwicklung
Benutzerfreundlich: Grafische Oberflächen verfügbar
Nachteile
Performance-Overhead: Host-OS verbraucht Ressourcen
Sicherheitsrisiken: Host-OS als zusätzliche Angriffsfläche
Begrenzte Skalierbarkeit: Weniger VMs pro Host möglich
Beispiele für Hosted Hypervisoren:
Qemu (Open Source - kann Virtualisierung und Emulation)[2]
VMware Workstation
Oracle VirtualBox
Parallels Desktop
...
Qemu kann auch zusammen mit KVM betrieben werden.
Definition
Container sind leichtgewichtige, portable Einheiten, die Anwendungen zusammen mit allen notwendigen Abhängigkeiten (Code, Runtime, Bibliotheken) verpacken. Sie teilen sich den Kernel des Host-Betriebssystems, bieten aber isolierte Prozess- und Nutzerbereiche, wodurch Anwendungen unabhängig voneinander laufen können.
Beispiele für die Isolierung (Linux)
Namespaces: Isolation von Nutzern, Prozessen, Netzwerk, Dateisystem
Control Groups (cgroups): Ressourcenbeschränkung (CPU, Speicher, ...)
Union File Systems: Effiziente Speicherung von Layern
Beispiele für Container-Isolierung unter Linux
Isolieren unterschiedliche Systemressourcen, sodass Prozesse in einem Container „ihre eigene Welt“ sehen: Jeder Container hat seine eigenen Benutzer- und Gruppen und sieht nur seine eigenen Prozesse. Prozesse aus anderen Containern oder dem Host sind unsichtbar. Container haben eigene Netzwerkschnittstellen, IP-Adressen und Ports und können z. B. auf Port 80 lauschen, ohne Host oder andere Container zu stören. Weiterhin hat jeder Container eine eigene Sicht auf das Dateisystem. Ein Container kann sein Root-Dateisystem haben, ohne den Host oder andere Container zu verändern.
Regeln und beschränken Ressourcennutzung, um fairen Zugriff zu gewährleisten: Insbesondere CPU-Zeit, Speicherbenutzung und Netzwerk und I/O Limits.
Ermöglichen effiziente, schichtweise Speicherung, da zum Beispiel das Basis-Image + Container-spezifische Änderungen als separate Layer gespeichert werden.
Virtual Machines
Vollständige Isolation
Verschiedene Betriebssysteme möglich
Hohe Sicherheit
Hoher Ressourcenverbrauch
Langsame Startzeiten
Komplexe Verwaltung
Weniger portabel
Container
Schneller Start
Geringer Ressourcenverbrauch
Hohe Portabilität
Einfache Skalierung
Weniger Isolation
Gleiches Betriebssystem erforderlich
Sicherheitsrisiken bei Root-Zugriff
Abhängigkeit vom Host-OS
Docker ist eine Open-Source-Plattform zur Entwicklung, Bereitstellung und Verwaltung von containerisierten Anwendungen.
Docker-Komponenten
Docker Engine: Runtime für Container
Docker Images: Vorlagen für Container
Docker Containers: Laufende Instanzen
Docker Registry: Repository für Images
Docker Compose: Orchestrierung mehrerer Container
Docker-Architektur
Docker Daemon: Hintergrundprozess der Images lädt sowie Container verwaltet und steuert
Docker Client: Kommandozeilen-Tool zum Interagieren mit dem Daemon.
Docker Registry: Speicher für Images
Docker Hub: Öffentliche Registry
Ein Docker-Image ist eine unveränderliche Vorlage, die alle notwendigen Komponenten für eine Anwendung enthält.
Image-Eigenschaften
Layered Architecture: Images bestehen aus mehreren Layern
Immutable: Images können nicht verändert werden
Portable: Funktionieren auf verschiedenen Systemen
Versioned: Verschiedene Versionen eines Images möglich
Container-Lifecycle
Create: Container aus Image erstellen
Start: Container starten
Run: Container ausführen
Stop: Container stoppen
Remove: Container löschen
docker pull <image>
- Image herunterladen
docker images
- Alle Images anzeigen
docker build -t <name> .
- Image erstellen
docker rmi <image>
- Image löschen
docker run <image>
- Container starten
docker ps
- Laufende Container anzeigen
docker stop <container>
- Container stoppen
docker rm <container>
- Container löschen
docker logs <container>
- Container-Logs anzeigen
docker exec -it <container> /bin/bash
- In Container einloggen
Container Orchestrierung ist die Automatisierung der Bereitstellung, Verwaltung, Skalierung und Vernetzung von Container-Anwendungen.
Gegenstand der Orchestrierung:
Deployment: Automatische Bereitstellung von Containern
Scaling: Dynamische Skalierung basierend auf Last
Load Balancing: Verteilung der Anfragen
Service Discovery: Auffinden von Services
Health Monitoring: Überwachung der Container-Gesundheit
Rolling Updates: Updates ohne Downtime
Kubernetes
Open Source von Google
De-facto Standard für Container Orchestrierung
Umfangreiche Features
Große Community
Komplexe Einrichtung
Docker Swarm
Native Docker-Lösung
Einfache Einrichtung
Weniger Features als Kubernetes
Gut für kleinere Projekte
Einfache Verwaltung
Apache Mesos
Distributed Systems Kernel
Unterstützt verschiedene Frameworks
Hochskalierbar
Komplexe Architektur
Weniger verbreitet
Docker-basiertes Deployment einer Web-Anwendung
Entwicklung und Deployment einer einfachen Web-Anwendung mit Docker.
Docker-Installation prüfen
Einfache Web-Anwendung erstellen
Dockerfile erstellen
Docker-Image bauen
Container starten und testen
[Docker Compose für Multi-Container-Setup]
Schritt 1: Docker-Installation prüfen
1# Docker-Version prüfen
2docker --version
34
# Docker-Status prüfen
5docker info
67
# Ersten Container testen
8docker run hello-world
Schritt 2: Web-Anwendung erstellen (index.html)
1<!DOCTYPE html>
2<html>
3<head><title>Docker Demo App</title></head>
4<body>
5<h2>Willkommen zur Docker-Demo!</h2>
6<p>Diese Anwendung läuft in einem Docker-Container.</p>
7<p>Aktuelle-Zeit: <span id="time"></span></p>
8<script>
9document.getElementById('time').textContent =
10new Date().toLocaleString();
11</script>
12</body>
13</html>
Schritt 3: Dockerfile erstellen
1# Basis-Image verwenden (Alpine-Linux mit einem vorinstallierten nginx)
2FROM nginx:alpine
34
# Arbeitsverzeichnis setzen innerhalb des Containers
5WORKDIR /usr/share/nginx/html
67
# HTML-Datei kopieren (kopiert lokale Datei in den Container relativ zum WORKDIR)
8COPY index.html .
910
# Port 80 freigeben
11EXPOSE 80
1213
# Nginx im Vordergrund starten (da sich sond der Docker-Container gleich beendet)
14CMD ["nginx", "-g", "daemon off;"]
Schritt 4: Docker-Image bauen
1# Image bauen mit dem Tag "webapp-demo"
2docker build -t webapp-demo .
34
# Images anzeigen
5docker images
67
# Image-Details anzeigen
8docker inspect webapp-demo
Schritt 5: Container starten und testen
1# Container mit dem Namen "webapp-container" im Hintergrund (-d) starten
2docker run -d -p 8080:80 --name webapp-container webapp-demo
34
# Container-Status prüfen
5docker ps
67
# In Browser testen: http://localhost:8080
89
# Container-Logs anzeigen
10docker logs webapp-container
1112
# Container stoppen
13docker stop webapp-container
1415
# Container (nicht Container-Image) löschen
16docker rm webapp-container
Schritt 6: Docker Compose für Multi-Container (docker-compose.yml)
1version: '3.8'
2services:
3web:
4build: .
5ports: ["8080:80"]
6depends_on: [db]
7environment: [DB_HOST=db]
89
db:
10image: postgres:13
11environment: [POSTGRES_DB=demo, POSTGRES_USER=demo, POSTGRES_PASSWORD=demo123]
12volumes: [postgres_data:/var/lib/postgresql/data] # persistent
1314
volumes: {postgres_data:}
Schritt 7: Anwendung (bestehend aus mehreren Containern) starten:
1# Multi-Container-Setup starten
2docker-compose up -d
34
# Status prüfen
5docker-compose ps
67
# Logs anzeigen
8docker-compose logs
910
# Setup stoppen
11docker-compose down
Virtualisierung ermöglicht effiziente Nutzung von Hardware-Ressourcen
Container bieten leichtgewichtige Alternative zu VMs
Docker ist der Standard für Container-Plattformen
Orchestrierung automatisiert das Management von Container-Anwendungen
Multi-Container-Setups ermöglichen komplexe Anwendungsarchitekturen
Image-Erstellung
Non-Root User für Sicherheit
Layer-Caching optimieren
Security Updates regelmäßig durchführen
Container-Management
Health Checks implementieren
Resource Limits setzen
Logging konfigurieren
Backup-Strategien für Volumes
Sicherheit
Minimale Images verwenden
Secrets nicht im Image speichern
Network Policies definieren
Regelmäßige Aktualisierungen durchführen
Die Container-Technologie entwickelt sich weiter:
Serverless Container (AWS Fargate, Azure Container Instances)
WebAssembly (WASM) als Alternative zu Container
Edge Computing mit Container-Technologie
GitOps für automatisiertes Deployment
Service Mesh für Microservice-Kommunikation
Schlussfolgerung
Container und Virtualisierung sind fundamentale Technologien für moderne Softwareentwicklung und -deployment. Die praktische Anwendung mit Docker bietet eine solide Grundlage für weiterführende Themen wie Kubernetes und Cloud-Native-Entwicklung.
Webserver im Docker Container
Loggen Sie sich auf dem Server ein und versuchen Sie alle Schritte nachvollzuziehen, die notwendig sind, um einen Docker Image mit Nginx zu bauen und danach zu starten. Orientieren Sie sich an dem Beispiel aus den Vorlesungsfolien, aber nutzen Sie eine eigene index.html.
Achtung!
Spezifzieren Sie beim Start des Containers ein Portmapping (z.B. 8100:80) passend zu den Ihnen zugeteilten Ports!
Stellen Sie sicher, dass Ihr Server läuft in dem Sie die Webseite aufrufen.
Verfolgen Sie das Log, um die Zugriffe auf Ihre Webseite zu sehen.
Node.js Server im Container laufen lassen
Kopieren Sie die Ressourcen (player.html, admin.html, game.js, package.json) auf Ihren Server in ein neu angelegtes Verzeichnis
Ihr Docker-Image soll node.js und alle Ressourcen enthalten.
D. h. Ihr Dockerfile muss eine Referenz auf ein entsprechendes Image mit node.js enhalten und die Ressource in das Dockerfile kopieren.
Passen Sie das Dockerfile so an, dass beim Bauen des Docker-Images die benötigten Bibliotheken mit installiert werden. Sie müssen dafür den Befehl npm install --production während des Bauens mit Hilfe von RUN im Dockerfile ausführen.
Passen Sie den Kommandozeilenbefehl (CMD) im Dockerfile so an, dass der Node Server passend gestartet wird.
Achtung!
Die Anwendung läuft Standardmäßig auf Port 8800.