Die Erstkonfiguration des Docker-Daemons - daemon.json erklärt

Die Erstkonfiguration des Docker-Daemons - daemon.json erklärt

Die /etc/docker/daemon.json ist die zentrale Konfigurationsdatei für Docker – wer sie kennt, hat volle Kontrolle über das Verhalten des Daemons.

Grundstruktur

# Datei erstellen oder bearbeiten
nano /etc/docker/daemon.json

Die Datei muss valides JSON sein. Syntaxfehler verhindern den Start des Daemons.

# Konfiguration validieren bevor Docker neu gestartet wird
dockerd --validate

Datenpfad ändern

Standardmäßig speichert Docker alles unter /var/lib/docker/ – oft auf der Root-Partition. Bei vollen Disks oder wenn Daten auf einer anderen Partition liegen sollen:

{
  "data-root": "/mnt/data/docker"
}

Bestehende Daten müssen manuell migriert werden:

systemctl stop docker
rsync -aP /var/lib/docker/ /mnt/data/docker/

Log-Konfiguration

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

DNS-Server

Wenn Container DNS-Probleme haben (Standard ist der Google-DNS 8.8.8.8):

{
  "dns": ["1.1.1.1", "1.0.0.1"]
}

Oder eigenen DNS-Server für interne Domains:

{
  "dns": ["192.168.1.1", "8.8.8.8"]
}

Interne Registry ohne HTTPS

Für lokale Docker-Registries ohne TLS-Zertifikat:

{
  "insecure-registries": ["registry.intern:5000", "192.168.1.50:5000"]
}

Container-Subnetz ändern

Docker nimmt sich standardmäßig 172.17.0.0/16 – das kann mit bestehenden Netzwerken kollidieren:

{
  "default-address-pools": [
    {
      "base": "10.10.0.0/16",
      "size": 24
    }
  ]
}

Userland-Proxy deaktivieren

Docker nutzt standardmäßig einen Userland-Proxy für Port-Mappings. Das kostet Performance. Auf Linux kann man direkt iptables-Regeln nutzen:

{
  "userland-proxy": false
}

Achtung: Auf manchen Systemen kann das Probleme mit IPv6 oder bestimmten Netzwerkkonfigurationen verursachen. Testen bevor man das auf Produktion einsetzt.

Vollständiges Beispiel

{
  "data-root": "/mnt/data/docker",
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "dns": ["1.1.1.1", "1.0.0.1"],
  "userland-proxy": false,
  "default-address-pools": [
    {
      "base": "10.10.0.0/16",
      "size": 24
    }
  ]
}

Änderungen übernehmen

# Daemon neu starten
systemctl restart docker

# Effektive Konfiguration prüfen
docker info

docker info zeigt unter anderem Docker Root Dir, Logging Driver und DNS – damit kann man verifizieren dass die Änderungen übernommen wurden.

Gefährliche Einstellungen

  • "live-restore": true – Container überleben einen Daemon-Neustart. Klingt gut, kann aber bei Netzwerk- oder Volume-Problemen dazu führen dass Container in inkonsistenten Zuständen weiter laufen.
  • "experimental": true – Aktiviert experimentelle Features die sich ohne Vorwarnung ändern können.

Diese Einstellungen nur verwenden wenn man die Implikationen versteht.