Docker‑daemon globale instellingen voor een uniforme ontwikkelomgeving

Of je nu lokaal of op een server werkt, je zult vaak dezelfde configuratie in je docker-compose.yml kopiëren en plakken.

  • DNS altijd op 1.1.1.1, 8.8.8.8
  • Log‑driver vastzetten op json-file + max-size=10m
  • Proxy, insecure registry, standaard netwerk‑bereik, enz.

Deze zaken zijn niet per container, maar host‑breed te beheren. Dat is precies wat de Docker‑daemon globale instellingen (daemon.json) doen.

Hieronder:

  • Welke bestanden
  • Waar je ze plaatst
  • Hoe je ze schrijft
  • Voor wie en wanneer ze nuttig zijn

1. Twee manieren om de Docker‑daemon te configureren



De Docker‑daemon (dockerd) kan op twee manieren worden ingesteld.

  1. JSON‑configuratiebestand (daemon.json)aanbevolen
  2. CLI‑flags bij het starten van dockerd

Je kunt beide combineren, maar als je dezelfde optie in beide plaatsen definieert, stopt de daemon. Bijvoorbeeld, als je --log-driver zowel als flag als in daemon.json gebruikt, zal Docker een fout geven en niet opstarten.

Voor een uniforme team‑/server‑omgeving raden we aan:

“Verzamel zoveel mogelijk opties in daemon.json en houd de flags minimaal.”


2. Locatie van daemon.json

De standaardlocatie varieert per OS en installatie‑methode. Hieronder een overzichtstabel:

Omgeving Standaardpad Opmerking
Linux (standaardinstallatie) /etc/docker/daemon.json Meest voorkomende locatie
Linux (snap‑installatie) /var/snap/docker/current/config/daemon.json Ubuntu snap‑pakket
Windows Server / Docker Engine C:\ProgramData\Docker\config\daemon.json Mogelijk vereist beheerdersrechten
Docker Desktop (Mac / Windows) ~/.docker/daemon.json Interne locatie van de Desktop‑instellingen
  • Het bestand bestaat niet altijd; maak het aan als het ontbreekt.
  • Voor team‑/server‑standaarden gebruiken we meestal de Linux‑server‑locatie /etc/docker/daemon.json.

3. Standaardpatroon: “bestand maken → daemon herstarten”



De meest voorkomende workflow op Linux is als volgt.

  1. daemon.json schrijven/bijwerken
{
  "dns": ["1.1.1.1", "8.8.8.8"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
  1. Valideer het configuratiebestand
sudo dockerd --validate --config-file=/etc/docker/daemon.json
# Als je "configuration OK" ziet, is alles in orde
  1. Docker‑daemon herstarten
sudo systemctl restart docker

Vanaf nu ervaart elke nieuwe container de globale instellingen als standaardwaarden.


4. Voorbeeld 1 – DNS‑servers globaal vastzetten

4.1 Waarom DNS globaal?

Als containers vaak problemen melden zoals "externe API niet gevonden" of "interne domeinen niet resolvable", ligt het meestal aan de DNS‑configuratie van de host.

Voorbeeld:

  • Het hele team wil Cloudflare DNS (1.1.1.1) gebruiken
  • Er zijn interne DNS‑servers die alleen via het bedrijfsnetwerk bereikbaar zijn

In plaats van dns: per project in docker-compose.yml te zetten, kun je dit op daemon‑niveau uniform maken.

4.2 Configuratievoorbeeld (daemon.json)

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

Als er al een daemon.json bestaat, voeg je het "dns": [...]‑element toe binnen het hoofdelement { ... } (let op de komma’s).

⚠️ Let op: DNS‑instellingen worden in /etc/resolv.conf binnen de container weerspiegeld. Bestaande containers worden niet meteen bijgewerkt; alleen nieuwe containers krijgen de nieuwe DNS‑instellingen.

4.3 Wie profiteert?

  • Ontwikkelaars in een bedrijf met proxy of interne DNS
  • Platform‑teams die in een multi‑cloud‑omgeving een specifieke DNS moeten afdwingen
  • Persoonlijke ontwikkelaars die meerdere VPN‑verbindingen wisselen

5. Voorbeeld 2 – Log‑driver & opties globaal instellen

Container‑logs worden standaard opgeslagen met de json-file driver in /var/lib/docker/containers/.... Door dit globaal te wijzigen kun je:

  • Log‑formaat
  • Opslaglocatie
  • Rotatiebeleid

5.1 Standaard json-file driver + rotatie

Een veelgebruikt patroon is het gebruik van json-file met een rotatie‑beleid om schijfruimte te besparen.

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

Dit zorgt ervoor dat:

  • Elke containerlog maximaal 10 MB is
  • Er maximaal 5 log‑bestanden worden bewaard
  • Overbodige logs worden automatisch verwijderd

5.2 Centrale log‑verzamelings‑driver (fluentd, journald, etc.)

Platform‑teams of infra‑teams willen vaak alle container‑logs naar een centrale log‑verzamelaar sturen.

Voorbeeld met Fluentd:

{
  "log-driver": "fluentd",
  "log-opts": {
    "fluentd-address": "localhost:24224",
    "tag": "{{.Name}}"
  }
}

Met deze instelling worden alle container‑logs automatisch naar Fluentd gestuurd, zonder docker run --log-driver=... per container.

Een andere populaire keuze is de journald driver. In een systemd‑gebaseerde Linux‑omgeving kun je hiermee Docker‑logs en applicatielogs in één plek beheren.

{
  "log-driver": "journald",
  "log-opts": {
    "tag": "{{.Name}}"
  }
}

Met tag op de containernaam kun je eenvoudig:

  • journalctl -f | grep {container_name} voor realtime logs
  • journalctl --since "10m ago" voor logs na een bepaald tijdstip
  • journalctl -f -t {container_name} voor alleen de logs van een specifieke container

5.3 Relatie met Compose / docker run

  • Globale log-driver + log-opts fungeren als standaardwaarden.
  • Als je in Compose logging: of in docker run --log-driver/--log-opt specificeert, wordt alleen die container overschreven.

Strategie: zet algemene waarden in daemon.json en laat uitzonderlijke services hun eigen log‑instellingen overschrijven.


6. Voorbeeld 3 – Proxy, insecure registry en andere globale netwerk‑instellingen

6.1 Proxy‑instellingen

Als je alleen via een bedrijfsproxy toegang hebt tot het internet, kun je de proxy op daemon‑niveau instellen in plaats van telkens omgevingsvariabelen te definiëren.

{
  "proxies": {
    "http-proxy": "http://proxy.example.com:3128",
    "https-proxy": "http://proxy.example.com:3128",
    "no-proxy": "localhost,127.0.0.1,.corp.example.com"
  }
}

Docker gebruikt deze proxy bij het ophalen van images en tijdens builds.

6.2 Insecure registry

Voor een TLS‑vrije registry (bijv. interne test‑registry) kun je:

{
  "insecure-registries": ["my-registry.local:5000"]
}

Gebruik dit alleen in een interne testomgeving vanwege veiligheidsrisico’s.


7. Voorbeeld 4 – Standaard netwerk‑bereik, storage‑driver, enz.

7.1 Standaard bridge‑netwerk‑bereik aanpassen

Om IP‑conflicten met VPN of bedrijfsnetwerken te voorkomen:

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

Docker gebruikt dan 10.20.x.0/24 voor nieuwe bridge‑netwerken.

7.2 Storage‑driver afdwingen

Afhankelijk van je Linux‑distributie kan de standaard storage‑driver verschillen. Als je team alleen overlay2 wil gebruiken:

{
  "storage-driver": "overlay2"
}

Controleer altijd de ondersteunde drivers voor je OS en kernel via de Docker‑documentatie.


8. Wanneer en voor wie is dit vooral nuttig?

8.1 Persoonlijke ontwikkelaars

  • Werken met meerdere side‑projects met dezelfde Docker‑opties
  • Frequent wisselen tussen VPN of bedrijfsproxy
  • Moeite hebben met log‑ en schijfruimtebeheer op lokale machines

→ Eén daemon.json zorgt voor een uniforme omgeving en elimineert herhaalde configuratie.

8.2 Kleine/medium teams

  • Teamleden hebben verschillende lokale Docker‑instellingen, waardoor “werkt op mijn machine” vaak voorkomt
  • CI‑servers en lokale ontwikkelomgevingen moeten zo veel mogelijk gelijk zijn
  • Bedrijfs‑standaard DNS, proxy en registry afdwingen

→ Definieer een team‑policy in daemon.json en distribueer het via Ansible, Chef, Terraform of Cloud‑Init.

8.3 Platform‑teams / DevOps / SRE

  • Beheren tientallen of honderden containers op een node
  • Log‑, storage‑ en netwerk‑beleid consistent moeten zijn
  • Log‑verzameling, monitoring en beveiligingsregels moeten host‑breed gestandaardiseerd zijn

daemon.json fungeert als het beleid‑bestand voor een Docker‑node.


9. Debug‑tips

  1. Flags en dubbele configuratie - Controleer of de systemd‑unit (/lib/systemd/system/docker.service) al een --log-driver of andere flag bevat. - Duplicatie tussen flag en daemon.json leidt tot daemon‑fouten.
  2. Docker Desktop - De GUI heeft prioriteit; wijzigingen via de UI schrijven naar ~/.docker/daemon.json. - Als je handmatig het bestand wijzigt, kan de UI het overschrijven. Houd één bron van waarheid.

Samenvatting

  • De globale standaardwaarden van Docker worden beheerd via daemon.json.
  • Locaties:
  • Linux: /etc/docker/daemon.json
  • Windows: C:\ProgramData\Docker\config\daemon.json
  • Docker Desktop: ~/.docker/daemon.json
  • Typische globale instellingen:
  • DNS: "dns": ["1.1.1.1", "8.8.8.8"]
  • Log‑driver: "log-driver": "json-file", "log-opts": {...}
  • Proxy, insecure registry, standaard netwerk‑bereik, storage‑driver, enz.
  • Globale instellingen bieden gemak voor individuele ontwikkelaars en standaardisatie voor teams en platform‑teams.
  • Als je dezelfde opties steeds in docker-compose.yml of docker run herhaalt, overweeg dan om ze naar daemon.json te verplaatsen.

image of docker daemon json setting