Docker ohne Internetzugang betreiben - Air-Gap-Setups
Docker ohne Internetzugang betreiben - Air-Gap-Setups
Wenn der Produktionsserver kein Internet hat, müssen Images vor dem Deployment vorbereitet und transferiert werden.
Das grundlegende Problem
Docker pulled Images standardmäßig von Docker Hub oder einer anderen Registry. Ohne Internet schlägt jeder docker pull fehl. Die Lösung: Images vorher auf einem verbundenen Rechner laden, exportieren und auf den Zielserver transferieren.
Methode 1: Images exportieren und importieren
# Auf dem verbundenen Rechner:
docker pull nginx:1.25
docker pull postgres:15
docker pull myapp:1.0
# Einzelnes Image exportieren
docker save nginx:1.25 | gzip > nginx-1.25.tar.gz
# Mehrere Images in ein Archiv
docker save nginx:1.25 postgres:15 myapp:1.0 | gzip > all-images.tar.gz
# Transfer auf den Air-Gap-Server (USB, scp, rsync, etc.)
scp all-images.tar.gz deploy@airserver:/opt/images/
# Auf dem Air-Gap-Server importieren
docker load < /opt/images/all-images.tar.gz
# Prüfen ob Images geladen sind
docker images
Methode 2: Lokale Registry als Mirror
Für regelmäßige Deployments ist eine interne Registry effizienter als einzelne Tarballs:
# Registry auf einem verbundenen Rechner betreiben
docker run -d -p 5000:5000 --name registry -v ./registry-data:/var/lib/registry registry:2
# Images in die lokale Registry pushen
docker tag nginx:1.25 localhost:5000/nginx:1.25
docker push localhost:5000/nginx:1.25
Registry-Daten auf den Air-Gap-Server kopieren:
# Registry-Volume-Daten transferieren
rsync -avz ./registry-data/ deploy@airserver:/opt/registry-data/
# Registry auf dem Air-Gap-Server starten
docker run -d -p 5000:5000 --name registry \
-v /opt/registry-data:/var/lib/registry \
registry:2
Daemon-Konfiguration für lokale Registry
Auf dem Air-Gap-Server in /etc/docker/daemon.json:
{
"registry-mirrors": ["http://localhost:5000"],
"insecure-registries": ["localhost:5000"]
}
sudo systemctl restart docker
Jetzt werden Images zuerst in der lokalen Registry gesucht.
Image-Abhängigkeiten beachten
Ein Image FROM ubuntu:22.04 AS build benötigt das Ubuntu-Base-Image. Beim Export mit docker save werden alle Layer mitgespeichert — auch das Base-Image ist enthalten, sofern es im lokalen Cache liegt.
# Sicherstellen dass alle Base-Images gepullt sind
docker pull ubuntu:22.04
docker pull python:3.11-slim
# Dann alle zusammen exportieren
docker save myapp:1.0 ubuntu:22.04 python:3.11-slim | gzip > stack.tar.gz
Compose-Workflow im Air-Gap-Betrieb
# docker-compose.yml auf dem Air-Gap-Server
services:
app:
image: localhost:5000/myapp:1.0 # lokale Registry
# oder nach docker load:
image: myapp:1.0 # direkt im lokalen Cache
Update-Prozess
- Neue Image-Version auf verbundenem Rechner bauen/pullen
- Exportieren:
docker save neuesimage:version | gzip > update.tar.gz - Auf den Air-Gap-Server transferieren
- Importieren:
docker load < update.tar.gz - Compose-Datei anpassen, Stack neu starten
Zusammenfassung
Air-Gap-Docker-Betrieb ist mit docker save und docker load straightforward. Für häufige Updates lohnt eine interne Registry — einmal aufgesetzt, ist der Update-Prozess auf ein rsync und docker load reduziert.