Docker
Was ist docker?
Weiter Infos auch unter https://www.docker.com/resources/what-container/.
Docker ist eine Plattform für das Entwickeln, Ausführen von Anwendungen in Containern. Es ermöglicht es Entwicklern, ihre Anwendungen und die damit verbundenen Abhängigkeiten in einen “Container” zu verpacken, der überall ausgeführt werden kann, unabhängig davon, ob es sich um einen lokalen Desktop, einen QA-Server oder einen Cloud-Server handelt. Hier sind einige Kernpunkte zu Docker:
Hauptmerkmale und Vorteile von Docker:
Isolation: Jeder Docker-Container läuft isoliert und hat seine eigenen Systemressourcen, seine eigenen Dateisysteme und seine eigenen Netzwerk-Interfaces.
Portierbarkeit: Ein Docker-Container, der auf einem Entwicklungsrechner erstellt wurde, kann ohne Änderungen auf einem Server, in einer Cloud-Umgebung oder sogar auf einem anderen Betriebssystem ausgeführt werden.
Mikroservice-Architektur: Docker eignet sich besonders gut für Mikroservices, da jeder Service in einem eigenen Container ausgeführt werden kann, was Isolation, Skalierbarkeit und Verwaltbarkeit erleichtert.
Versionierung und Wiederverwendbarkeit: Docker-Images können versioniert und wiederverwendet werden, sodass Entwicklerteams leicht bestimmte Versionen ihrer Anwendungen verteilen und bereitstellen können.
Integration und Deployment: Es erleichtert CI/CD (Continuous Integration und Continuous Deployment), da neue Codeänderungen in Docker-Containern verpackt und leicht zu Test- oder Produktionsumgebungen übertragen werden können.
Dichte: Da Docker-Container leichtgewichtig sind (d.h., sie teilen denselben Betriebssystem-Kern, benötigen jedoch nicht ein ganzes Betriebssystem für sich allein), können Sie viele Anwendungen auf einer einzigen Maschine ausführen, ohne viel Overhead.
Grundkonzepte:
Docker-Images: Ein Docker-Image ist eine schreibgeschützte Vorlage, die die Anwendung und alle ihre Abhängigkeiten enthält. Sie wird verwendet, um Docker-Container zu erstellen.
Docker-Container: Ein laufbarer Instanz eines Docker-Images. Es enthält den ausführbaren Anwendungscode sowie alles, was für die Ausführung der Anwendung erforderlich ist.
Dockerfile: Eine Textdatei mit einer Reihe von Anweisungen, um ein Docker-Image zu erstellen.
Docker Compose: Ein Tool zum Definieren und Verwalten von Multi-Container Docker-Anwendungen. Mit Docker Compose können Sie Dienste, Netzwerke und Volumes in einer einzigen Datei definieren und dann mit einem einzigen
docker-compose up-Befehl alle Dienste starten.Docker Hub: Ein Cloud-basierter Registry-Service zum Teilen von Docker-Images. Hier können Sie Ihre eigenen Images speichern oder die von anderen verwenden.
Zusammengefasst: Docker hat die Art und Weise revolutioniert, wie Entwickler Software erstellen, versenden und ausführen, indem es Konsistenz zwischen Entwicklungsumgebungen bietet und die Barrieren zwischen Entwicklung, Test und Produktion verringert. Es hat sich zu einem Standardwerkzeug in der modernen Softwareentwicklung und -bereitstellung entwickelt.
Nutzung
Durch die Verwendung von Docker und Docker Compose hast du Zugriff auf eine Reihe von Befehlen, die es dir ermöglichen, mit deinen Containern und Diensten zu interagieren. Lass uns einige dieser Aktionen und die zugehörigen Befehle durchgehen:
Docker
Container neustarten:
docker restart [CONTAINER_ID oder CONTAINER_NAME]Logs eines Containers anzeigen:
docker logs [CONTAINER_ID oder CONTAINER_NAME]In einen laufenden Container gehen (z.B. für Debugging-Zwecke):
docker exec -it [CONTAINER_ID oder CONTAINER_NAME] /bin/sh
Docker Compose
Einen Dienst neustarten: Du kannst einen bestimmten Dienst (z.B. “web”) oder alle Dienste neu starten:
docker-compose restart docker-compose restart webLogs eines Dienstes anzeigen:
Du kannst die Logs eines bestimmten Dienstes oder aller Dienste anzeigen:
docker-compose logs docker-compose logs webWenn du die Logs in Echtzeit sehen möchtest:
docker-compose logs -f docker-compose logs -f webIn einen laufenden Dienst gehen: Angenommen, du möchtest dich in den “web” Dienst einloggen:
docker-compose exec web /bin/shDienste starten und stoppen:
docker-compose up # Startet Dienste basierend auf der docker-compose.yml Datei docker-compose down # Stoppt und entfernt die von "up" gestarteten RessourcenEinzelnen Dienst starten oder stoppen:
docker-compose start web docker-compose stop web
Diese Befehle sind nur einige der häufigsten Aktionen, die du mit Docker und Docker Compose durchführen würdest. Es gibt viele weitere Befehle und Optionen, mit denen du deine Container und Dienste verwalten kannst.
Beispiel
Wie man eine Python-Webanwendung in einem Container laufen lässt.
Dies ist ein einfacher Einstieg, um zu sehen, wie Docker funktioniert. In realen Anwendungen können Docker und insbesondere Docker Compose dazu verwendet werden, komplexe Umgebungen mit vielen Diensten (z. B. Datenbanken, Caches, Worker, etc.) zu orchestrieren.
Wir erweitern dieses Beispiel unten um docker-compose.
1. Erstelle ein einfaches Python-Flask-Web-App:
app.py:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hallo Welt von Docker!"
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')2. Erstelle ein Dockerfile:
Dockerfile:
FROM python:3.8
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]3. Erstelle eine requirements.txt-Datei:
requirements.txt:
Flask==1.1.24. Baue das Docker-Image:
Navigiere im Terminal oder in der Eingabeaufforderung zum Verzeichnis, in dem sich dein Dockerfile befindet, und führe den folgenden Befehl aus:
docker build -t flask-docker-app .-tgibt dem Image einen Namen (in diesem Fall “flask-docker-app”).- Der Punkt
.am Ende des Befehls gibt an, dass das aktuelle Verzeichnis als Kontext für den Docker-Build verwendet werden soll.
5. Führe die App in einem Docker-Container aus:
docker run -p 5000:5000 flask-docker-app-p 5000:5000leitet den Port 5000 des Hosts an den Port 5000 des Containers weiter. Dies ist notwendig, da unsere Flask-App standardmäßig auf Port 5000 lauscht.
Nachdem du diesen Befehl ausgeführt hast, sollte deine Flask-App laufen! Du kannst sie besuchen, indem du in einem Webbrowser zur Adresse http://localhost:5000 gehst. Du solltest die Nachricht “Hallo Welt von Docker!” sehen.
Drücke Ctrl+c (halte die Ctrl-Taste (Strg auf deutschem Layout) und drücke c) um den docker service anzustellen.
Dasselbe wie oben, jedoch mit der Nutzung von docker compose:
1. Erstelle eine docker-compose.yml Datei:
In dem gleichen Verzeichnis, in dem dein Dockerfile und die anderen Dateien liegen, erstelle eine Datei namens docker-compose.yml:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"In diesem einfachen Beispiel haben wir einen Dienst namens web definiert, der das aktuelle Verzeichnis als Build-Kontext verwendet und Port 5000 des Hosts an Port 5000 des Containers weiterleitet.
Optionale Erweiterung: Eine Datenbank hinzufügen:
Lass uns dem Beispiel eine PostgreSQL-Datenbank hinzufügen:
Aktualisiere die docker-compose.yml Datei:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
db:
image: "postgres:15"
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydatabaseHier haben wir einen zusätzlichen Service namens db hinzugefügt, der das offizielle PostgreSQL-Image von Docker Hub verwendet. Der web-Service wurde aktualisiert, um eine Abhängigkeit von db zu haben, sodass Docker sicherstellt, dass die Datenbank vor der Webanwendung gestartet wird.
2. Starte die Dienste mit Docker Compose:
Im Terminal oder in der Befehlszeile, im selben Verzeichnis wie die docker-compose.yml Datei, führe aus:
docker-compose upDocker Compose wird das Image (falls noch nicht vorhanden) bauen und dann beide Dienste (in unserem erweiterten Beispiel web und db) starten.
3. Beenden und Aufräumen:
Um die laufenden Dienste zu stoppen, kannst du Ctrl + C drücken. Wenn du die Dienste vollständig entfernen möchtest, führe aus:
docker-compose downSolltest du auch die Volumes der Datenbank löschen wollen (Inhalt ist dann weg!), musst du ein -v anhängen (v für volumes).
docker-compose down -vDurch die Kombination von Docker und Docker Compose kannst du komplexe Anwendungsarchitekturen definieren und ausführen, die aus vielen miteinander verbundenen Diensten bestehen. Es bietet eine konsistente Umgebung für die Entwicklung, das Testen und die Produktion und erleichtert die Bereitstellung und Skalierung von Anwendungen.