Docker selbst aktualisieren - ohne laufende Container zu verlieren

Docker selbst aktualisieren - ohne laufende Container zu verlieren

Den Docker-Daemon zu aktualisieren klingt riskanter als es ist – mit der richtigen Vorbereitung überleben alle Container den Update-Vorgang.

Container überleben den Daemon-Neustart

Standardmäßig werden Container gestoppt wenn der Daemon anhält. Mit live-restore in der daemon.json laufen Container auch während des Daemon-Neustarts weiter:

// /etc/docker/daemon.json
{
  "live-restore": true
}

Für Updates ohne Container-Downtime empfehlenswert. Für reguläre Nutzung ist restart: unless-stopped in Compose ausreichend – Container starten nach dem Update automatisch wieder.

Docker aktualisieren (Ubuntu/Debian)

# Aktuelle Version prüfen
docker version

# Paketliste aktualisieren
apt-get update

# Docker auf neueste Version aktualisieren
apt-get install --only-upgrade docker-ce docker-ce-cli containerd.io docker-compose-plugin

# Version nach Update prüfen
docker version

Docker folgt semantischer Versionierung. Minor-Updates (26.0 → 26.1) sind in der Regel sicher. Major-Updates (25.x → 26.x) sollte man im Changelog prüfen.

Docker Compose Plugin separat aktualisieren

# Compose-Plugin-Version prüfen
docker compose version

# Update
apt-get install --only-upgrade docker-compose-plugin

Falls Compose als Binary installiert ist:

# Aktuelle Version von GitHub laden
COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep '"tag_name"' | cut -d '"' -f 4)
curl -L "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-linux-x86_64" \
  -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Repository für aktuelle Versionen einrichten

Falls Docker aus dem Standard-Ubuntu-Repo installiert wurde (ältere Versionen), auf das offizielle Docker-Repo wechseln:

# Altes Docker entfernen
apt-get remove docker docker-engine docker.io containerd runc

# Offizielles Docker-Repo hinzufügen
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list

apt-get update && apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Vor dem Update: Backup

# Laufende Container und deren Konfiguration sichern
docker ps --format "{{.Names}}" > /tmp/running-containers.txt
docker compose config > /tmp/compose-config.yml

# Wichtige Volumes sichern (Datenbanken zuerst stoppen!)
docker compose stop db
docker run --rm -v dbdata:/data -v /backup:/backup alpine tar czf /backup/db-before-update.tar.gz -C /data .
docker compose start db

Nach dem Update prüfen

# Docker-Info anzeigen
docker info

# Alle Container laufen noch?
docker ps

# Test-Container starten
docker run --rm hello-world

Compose-Projekte nach Update

In der Regel müssen Compose-Container nach einem Docker-Update nicht neu erstellt werden. Ausnahme: wenn sich das Netzwerk-Subsystem geändert hat – dann hilft:

docker compose down
docker compose up -d