← Zurück

Docker Grundlagen – Container verstehen und nutzen

docker container anfänger devops

Docker Grundlagen – Container verstehen und nutzen

Docker hat die Art, wie wir Software betreiben, revolutioniert. Dieses Guide erklärt dir von Grund auf, was Docker ist und wie du es nutzt.


Was ist Docker?

Stell dir vor, du entwickelst eine App auf deinem Laptop. Sie funktioniert perfekt. Dann willst du sie auf einen Server bringen – und plötzlich klappt nichts mehr. Andere Python-Version, fehlende Bibliotheken, falsche Konfiguration...

Docker löst dieses Problem.

Mit Docker packst du deine App zusammen mit allem, was sie braucht (Betriebssystem, Bibliotheken, Konfiguration) in einen Container. Dieser Container läuft überall gleich – auf deinem Laptop, auf dem Server, in der Cloud.

Die Analogie: Container sind wie Schiffscontainer

  • Schiffscontainer: Egal was drin ist (Schuhe, Bananen, Autos) – der Container passt auf jedes Schiff, jeden Zug, jeden LKW
  • Docker Container: Egal was drin ist (Python-App, Datenbank, Webserver) – der Container läuft auf jedem Linux-System

Die wichtigsten Begriffe

Begriff Erklärung Analogie
Image Vorlage/Bauplan für Container Backrezept
Container Laufende Instanz eines Images Der fertige Kuchen
Docker Hub Online-Bibliothek für Images Rezepte-Website
Dockerfile Anleitung zum Image-Erstellen Eigenes Rezept schreiben
Volume Dauerhafter Speicher Kühlschrank (bleibt auch wenn Kuchen weg)

Docker installieren

Ubuntu/Debian

# System aktualisieren
sudo apt update

# Docker installieren
sudo apt install docker.io docker-compose -y

# Docker beim Booten starten
sudo systemctl enable docker

# Deinen Benutzer zur Docker-Gruppe hinzufügen
sudo usermod -aG docker $USER

# Neu einloggen oder:
newgrp docker

# Testen
docker --version
docker run hello-world

Was passiert bei docker run hello-world?

  1. Docker sucht das Image hello-world lokal
  2. Findet es nicht → lädt es von Docker Hub herunter
  3. Erstellt einen Container aus dem Image
  4. Startet den Container
  5. Container gibt Text aus und beendet sich

Dein erster Container

Einen Webserver starten

# Nginx Webserver starten
docker run -d -p 8080:80 --name mein-webserver nginx

Was bedeuten die Parameter?

Parameter Bedeutung
-d Detached – läuft im Hintergrund
-p 8080:80 Port-Mapping: Dein Port 8080 → Container Port 80
--name mein-webserver Gibt dem Container einen Namen
nginx Das Image (wird von Docker Hub geladen)

Öffne jetzt http://localhost:8080 im Browser – du siehst die Nginx-Startseite! 🎉

Container verwalten

# Laufende Container anzeigen
docker ps

# Alle Container (auch gestoppte)
docker ps -a

# Container stoppen
docker stop mein-webserver

# Container starten
docker start mein-webserver

# Container löschen (muss gestoppt sein)
docker rm mein-webserver

# Container stoppen UND löschen
docker rm -f mein-webserver

Mit Containern interagieren

In einen laufenden Container gehen

# Bash-Shell im Container öffnen
docker exec -it mein-webserver bash

# Jetzt bist du IM Container
ls /usr/share/nginx/html
exit  # Wieder raus

Parameter erklärt: - -i = Interactive (Eingabe möglich) - -t = TTY (Terminal-Ansicht)

Logs eines Containers anzeigen

# Alle Logs
docker logs mein-webserver

# Live-Logs (wie tail -f)
docker logs -f mein-webserver

# Letzte 50 Zeilen
docker logs --tail 50 mein-webserver

Images verwalten

Images herunterladen

# Image von Docker Hub laden
docker pull ubuntu:22.04
docker pull mysql:8
docker pull python:3.11

# Geladene Images anzeigen
docker images

Image-Tags verstehen

docker pull nginx          # Lädt nginx:latest (neueste Version)
docker pull nginx:1.24     # Lädt spezifische Version
docker pull nginx:alpine   # Lädt Alpine-basierte Version (kleiner)

💡 Tipp: Alpine-Images sind viel kleiner (5-50 MB statt 100-500 MB).

Unbenutzte Images löschen

# Ein bestimmtes Image löschen
docker rmi nginx:latest

# Alle ungenutzten Images löschen
docker image prune

# ALLES aufräumen (Images, Container, Netzwerke)
docker system prune

Daten persistent speichern mit Volumes

Container sind vergänglich – wenn du sie löschst, sind alle Daten weg. Volumes lösen das Problem.

Volume erstellen und nutzen

# Volume erstellen
docker volume create meine-daten

# Container mit Volume starten
docker run -d \
  --name mysql-db \
  -v meine-daten:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=geheim \
  mysql:8

Jetzt sind die Datenbank-Daten im Volume gespeichert. Selbst wenn du den Container löschst und neu erstellst – die Daten bleiben!

Lokalen Ordner einbinden

# Deinen Ordner in den Container einbinden
docker run -d \
  --name webserver \
  -p 8080:80 \
  -v /home/max/website:/usr/share/nginx/html \
  nginx

Jetzt werden Änderungen in /home/max/website sofort im Container sichtbar!


Docker Compose – Mehrere Container verwalten

Für komplexere Setups (z.B. Webserver + Datenbank) nutzt du Docker Compose.

Beispiel: WordPress mit MySQL

Erstelle eine Datei docker-compose.yml:

version: '3.8'

services:
  wordpress:
    image: wordpress:latest
    container_name: wordpress
    restart: unless-stopped
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: geheim123
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_data:/var/www/html
    depends_on:
      - mysql

  mysql:
    image: mysql:8
    container_name: mysql
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: geheim123
      MYSQL_ROOT_PASSWORD: root_geheim
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  wp_data:
  mysql_data:

Docker Compose Befehle

# Alle Container starten
docker-compose up -d

# Status anzeigen
docker-compose ps

# Logs anzeigen
docker-compose logs -f

# Alle Container stoppen
docker-compose down

# Stoppen UND Volumes löschen
docker-compose down -v

Nützliche Docker Befehle

Schnellreferenz

Befehl Funktion
docker run -d IMAGE Container im Hintergrund starten
docker ps Laufende Container
docker ps -a Alle Container
docker stop NAME Container stoppen
docker rm NAME Container löschen
docker logs NAME Logs anzeigen
docker exec -it NAME bash Shell im Container
docker images Lokale Images
docker pull IMAGE Image herunterladen
docker rmi IMAGE Image löschen
docker volume ls Volumes anzeigen
docker system prune Aufräumen

Praktische Einzeiler

# Alle gestoppten Container löschen
docker container prune

# Ressourcenverbrauch aller Container
docker stats

# Welche Ports nutzt ein Container?
docker port mein-container

# Detaillierte Container-Infos
docker inspect mein-container

Best Practices

1. Nutze spezifische Tags

# SCHLECHT – kann sich jederzeit ändern
docker pull mysql:latest

# GUT – reproduzierbar
docker pull mysql:8.0.35

2. Nutze Alpine-Images wenn möglich

# Groß (~ 140 MB)
docker pull python:3.11

# Klein (~ 50 MB)
docker pull python:3.11-alpine

3. Container immer mit Namen starten

# SCHLECHT – bekommt zufälligen Namen
docker run -d nginx

# GUT – leicht wiederzufinden
docker run -d --name webserver nginx

4. Volumes für wichtige Daten

Datenbanken, Uploads, Konfigurationen – alles was bleiben soll, gehört in Volumes!


Typische Probleme und Lösungen

"Port is already in use"

# Welcher Prozess nutzt Port 8080?
sudo lsof -i :8080

# Anderen Port wählen
docker run -d -p 8081:80 nginx

Container startet nicht

# Logs prüfen
docker logs container-name

# Container ohne -d starten um Fehler zu sehen
docker run --rm nginx

"Permission denied" bei Volumes

# Berechtigungen im Container-Ordner setzen
docker exec container-name chown -R 1000:1000 /data

Zusammenfassung

Docker macht es einfach, Software zu verpacken und überall gleich laufen zu lassen:

  1. Images sind Baupläne/Vorlagen
  2. Container sind laufende Instanzen von Images
  3. Volumes speichern Daten dauerhaft
  4. Docker Compose verwaltet mehrere Container

Mit diesem Wissen kannst du: - Fertige Images von Docker Hub nutzen - Container starten, stoppen und verwalten - Daten persistent speichern - Multi-Container-Setups mit Docker Compose erstellen


Nächste Schritte

  • Dockerfile schreiben – Eigene Images erstellen
  • Nginx Reverse Proxy – Container hinter Nginx
  • Docker Netzwerke – Container miteinander verbinden
  • Container-Monitoring – Portainer, ctop