Docker Container erstellen und bereitstellen

DockerDockerBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Dieses Tutorial führt Sie durch den Prozess der Erstellung effizienter Docker-Images mithilfe von Dockerfiles. Sie lernen, Docker-Images und Dockerfiles zu verstehen, Dockerfile-Layers für Leistung zu optimieren, den Docker-Image-Cache für schnellere Builds zu verwalten und mehrstufige Builds zu nutzen, um optimierte Images zu erstellen. Am Ende dieses Tutorials verfügen Sie über das Wissen, Docker-Images zu erstellen, die schlank, effizient und einfach zu warten sind.

Docker-Grundlagen

Was ist Docker?

Docker ist eine leistungsstarke Containerisierungstechnologie, die die Softwarebereitstellung und -entwicklung revolutioniert. Sie ermöglicht es Entwicklern, Anwendungen mit allen Abhängigkeiten in standardisierte Einheiten, sogenannte Container, zu verpacken und so eine konsistente Leistung in verschiedenen Computernumgebungen sicherzustellen.

Kernkonzepte der Containerisierung

Containerisierung ermöglicht es Anwendungen, in isolierten Umgebungen zu laufen, was mehrere entscheidende Vorteile bietet:

Konzept Beschreibung
Isolation Container laufen unabhängig voneinander, ohne sich gegenseitig zu beeinträchtigen
Portabilität Anwendungen können konsistent auf verschiedenen Systemen bereitgestellt werden
Effizienz Leichter als herkömmliche virtuelle Maschinen

Docker-Architektur

graph TD A[Docker Client] --> B[Docker Daemon] B --> C[Container Runtime] B --> D[Image Repository] C --> E[Containers]

Installation unter Ubuntu 22.04

## Paketindex aktualisieren
sudo apt update

## Abhängigkeiten installieren
sudo apt install apt-transport-https ca-certificates curl software-properties-common

## Offiziellen Docker GPG-Schlüssel hinzufügen
curl -fsSL | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

## Stable-Repository einrichten
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

## Docker Engine installieren
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

Überprüfung der Docker-Installation

## Docker-Version prüfen
docker --version

## Docker-Installation testen
sudo docker run hello-world

Wichtige Docker-Komponenten

  1. Docker Client: Befehlszeilenschnittstelle zur Interaktion mit Docker
  2. Docker Daemon: Hintergrunddienst, der Container und Images verwaltet
  3. Docker Images: Schreibgeschützte Vorlagen zur Erstellung von Containern
  4. Docker Container: Laufende Instanzen von Docker-Images

Grundlegende Docker-Befehle

## Liste der laufenden Container anzeigen
docker ps

## Liste aller Container anzeigen
docker ps -a

## Ein Image ziehen
docker pull ubuntu

## Einen Container starten
docker run -it ubuntu /bin/bash

Docker-Image-Erstellung

Docker-Images verstehen

Docker-Images sind schreibgeschützte Vorlagen, die als Grundlage für die Erstellung von Containern dienen. Sie enthalten alles, was zum Ausführen einer Anwendung benötigt wird, einschließlich Code, Laufzeitumgebung, Bibliotheken und Systemtools.

Dockerfile-Grundlagen

Ein Dockerfile ist eine Textdatei, die Anweisungen zum Erstellen eines Docker-Images enthält. Jede Anweisung erstellt eine neue Schicht im Image.

graph TD A[Dockerfile] --> B[Basis-Image] A --> C[Anwendung Dateien kopieren] A --> D[Abhängigkeiten installieren] A --> E[Umgebung konfigurieren] A --> F[Startbefehl definieren]

Beispiel-Dockerfile für eine Python-Anwendung

## Verwendung des offiziellen Python-Laufzeitumgebungs-Basis-Images
FROM python:3.9-slim

## Arbeitsverzeichnis im Container setzen
WORKDIR /app

## requirements.txt-Datei kopieren
COPY requirements.txt .

## Notwendige Pakete installieren
RUN pip install --no-cache-dir -r requirements.txt

## Anwendungscode kopieren
COPY . .

## Portnummer spezifizieren
EXPOSE 5000

## Befehl zum Ausführen der Anwendung definieren
CMD ["python", "app.py"]

Image-Erstellungsstrategien

Strategie Beschreibung Anwendungsfall
Einstufiger Build Einfache, direkte Builds Kleine, unkomplizierte Anwendungen
Mehrstufiger Build Optimierung von Imagegröße und Sicherheit Komplexe Anwendungen mit Build-Abhängigkeiten

Beispiel für einen mehrstufigen Build

## Stufe 1: Build-Stufe
FROM maven:3.8.1-openjdk-11 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn package

## Stufe 2: Laufzeit-Stufe
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=build /app/target/myapp.jar .
EXPOSE 8080
CMD ["java", "-jar", "myapp.jar"]

Docker-Images erstellen und verwalten

## Image erstellen
docker build -t myapp:v1 .

## Lokale Images auflisten
docker images

## Image entfernen
docker rmi myapp:v1

## Image taggen
docker tag myapp:v1 myregistry/myapp:latest

Optimierungsmethoden für Images

  1. Verwendung minimaler Basis-Images
  2. Minimierung der Schichtanzahl
  3. Nutzung des Build-Cache
  4. Entfernen unnötiger Dateien
  5. Verwendung der .dockerignore-Datei

Docker-Image-Schichten

graph TD A[Basis-Image-Schicht] --> B[Abhängigkeits-Installationsschicht] B --> C[Anwendungsschicht] C --> D[Konfigurationsschicht] D --> E[Eingangs-Schicht]

Container-Verwaltung

Container-Lebenszyklus-Verwaltung

Docker-Container haben einen komplexen Lebenszyklus mit mehreren Zuständen und Verwaltungsstrategien. Das Verständnis dieser Zustände ist entscheidend für eine effektive Container-Orchestrierung.

graph LR A[Erstellt] --> B[Läuft] B --> C[Pausiert] B --> D[Angehalten] D --> E[Entfernt]

Grundlegende Container-Operationen

Operation Befehl Beschreibung
Start docker start <container> Einen angehaltenen Container starten
Stopp docker stop <container> Einen laufenden Container sauber stoppen
Neustart docker restart <container> Einen Container stoppen und starten
Entfernen docker rm <container> Einen Container löschen

Erweiterte Container-Verwaltung

## Container im losgelösten Modus ausführen
docker run -d --name webserver nginx

## Containerdetails anzeigen
docker inspect webserver

## Container-Logs anzeigen
docker logs webserver

## Befehle innerhalb eines laufenden Containers ausführen
docker exec -it webserver /bin/bash

Ressourcenverwaltung und Einschränkungen

## CPU und Speicher begrenzen
docker run -d \
  --cpus="1.5" \
  --memory="512m" \
  --name limited-container \
  nginx

Container-Netzwerke

graph TD A[Host-Netzwerk] --> B[Bridge-Netzwerk] B --> C[Benutzerdefiniertes Netzwerk] C --> D[Overlay-Netzwerk]

Beispiel für die Netzwerkkonfiguration

## Benutzerdefiniertes Netzwerk erstellen
docker network create myapp-network

## Container im benutzerdefinierten Netzwerk ausführen
docker run -d --network=myapp-network --name db postgres
docker run -d --network=myapp-network --name webapp nginx

Skalierung von Containern

## Verwenden Sie Docker Compose für die Skalierung
version: '3'
services:
webapp:
image: nginx
deploy:
replicas: 5

Leistungsüberwachung

## Echtzeit-Containerstatistiken
docker stats

## Liste der laufenden Container mit Ressourcenverbrauch
docker ps -q | xargs docker stats --no-stream

Container-Backup und -Migration

## Container als Tar-Archiv exportieren
docker export container_name > container.tar

## Container aus dem Archiv importieren
docker import container.tar new_image_name

Zusammenfassung

In diesem umfassenden Tutorial haben Sie gelernt, wie Sie effiziente Docker-Images mithilfe von Dockerfiles erstellen. Sie haben die Grundlagen von Docker-Images und Dockerfiles erkundet und Techniken zur Optimierung von Dockerfile-Layern, zur Verwaltung des Docker-Image-Cache und zur Nutzung von Multi-Stage-Builds entdeckt. Indem Sie diese Best Practices befolgen, können Sie Docker-Images erstellen, die kleiner, schneller zu erstellen und einfacher zu warten sind, was letztendlich Ihre Docker-basierten Anwendungsentwicklungs- und Bereitstellungs-Workflows verbessert.