Chapter 33Lesson 01~160 minutes

Daemon Configuration, daemon.json, systemd, Proxies, Registry Mirrors, Live Restore, and Host Integration: Concepts, Architecture, and Mental Model

Model Docker daemon configuration as host policy: service-manager state, startup flags, daemon.json, proxy and registry trust, reload/restart effects, live restore, and verifiable container continuity.

dockerddaemon.jsonsystemdHost policyLive restore

Learning objectives

  • Explain how service-manager state, environment variables, startup flags, and daemon.json combine into Docker daemon policy.
  • Distinguish daemon configuration from Docker CLI, build, and container configuration so proxy and trust settings are applied to the correct layer.
  • Inventory configuration paths, systemd ownership, registry/mirror policy, data-root, live restore, and effective daemon state before changing anything.
  • Predict whether a candidate setting can be reloaded or requires a daemon restart, and what continuity evidence must be captured.
  • Treat proxy credentials, registry trust, remote API settings, and daemon restarts as host-wide security/availability changes rather than convenience toggles.

1. The practical problem: Docker is a host service, not just a CLI

Most Docker commands feel local: a developer types docker run, docker pull, or docker compose up. But the durable policy is owned by the Docker daemon on the selected context. If that daemon is started by systemd, its executable arguments, environment, drop-in files, and daemon.json all affect every workload attached to that Engine.

This is why a “simple” change such as adding a proxy, changing a registry mirror, moving data storage, enabling live restore, or adding a daemon label can have host-wide consequences. The safe workflow is identify owner → capture current effective state → validate proposed state → classify reload/restart impact → apply in an authorized scope → verify → roll back deliberately.

2. Causal daemon-policy model

Host configuration becomes daemon behavior; reload and restart are different state transitions
flowchart TD
  A[Host service manager + environment] --> D[dockerd startup]
  B[dockerd CLI flags] --> D
  C[daemon.json] --> D
  D --> E[Effective daemon policy]
  E --> F[Networking / storage / registry / logging / security]
  E --> G[Running containers]
  H[SIGHUP or systemd reload] --> E
  I[Daemon restart or outage] --> G
  J[live-restore when eligible] --> G
            

Service manager + environment decides how dockerd is launched. CLI flags provide startup configuration. daemon.json is Docker’s preferred persistent configuration source for regular Engine installations. The daemon merges allowed sources, rejects duplicate ownership of the same option, and then applies the resulting policy to registry access, networking, storage, logging, security defaults, and container lifecycle.

A reload asks an already-running daemon to re-read only settings Docker declares reloadable. A restart replaces the daemon process and may interrupt management or containers unless continuity mechanisms and the specific configuration transition support survival. Live restore helps in a bounded set of scenarios; it is not a universal “safe restart” switch.

3. State map: what belongs to which layer?

Layer Examples Read-only evidence Common mistake
Client/context selected endpoint, CLI config, credentials docker context show, docker context inspect Editing local files while the CLI targets a remote daemon
Host/service manager unit file, drop-ins, environment, ExecStart systemctl show, systemctl cat in a private terminal Assuming JSON is the only source of daemon flags
Daemon config daemon.json, effective registry/proxy/live-restore policy config file + docker info + daemon logs Setting the same option in JSON and a startup flag
Container/build environment, mounts, ports, per-container settings docker inspect, Compose config, build logs Using daemon proxy settings to solve application proxy needs
External trust registry CA, mirror endpoint, proxy server certificate/config inventory and successful bounded request Adding an insecure-registry entry instead of fixing TLS trust

4. Configuration files and ownership

On a regular Linux Engine installation, Docker looks for /etc/docker/daemon.json by default. Rootless Docker uses per-user configuration rather than the system path. Docker Desktop exposes Engine JSON through Desktop settings and is not managed like a native Linux systemd service.

Docker recommends the configuration file because it centralizes persistent settings. Flags remain useful for packaging, service-manager ownership, testing, or settings the distribution already provides. The rule is strict: do not specify the same option in both places. Docker documents that a duplicate flag/JSON option prevents daemon startup.

5. Systemd is part of the effective configuration

On mainstream Linux distributions, systemd often owns dockerd. A packaged unit can already supply flags such as socket activation or host configuration. Drop-ins under the systemd hierarchy can add environment variables or override ExecStart. Therefore an incident review should capture the unit and drop-in paths before editing JSON.

Credential hygiene: systemctl cat docker or systemctl show ... Environment can reveal proxy URLs or credentials if an administrator embedded them in unit files. Inspect privately and redact before saving or sharing evidence.

6. Read-only host inventory before any mutation

docker context show
docker version
docker info
docker info --format 'DockerRootDir={{.DockerRootDir}} Driver={{.Driver}} Logging={{.LoggingDriver}}'

docker context inspect "$(docker context show)"

# Native Linux/systemd host only:
systemctl show docker --property=FragmentPath,DropInPaths,MainPID,ActiveEnterTimestamp
systemctl status docker --no-pager
ps -eo pid,args | grep '[d]ockerd'

# Inspect these privately if authorized; redact credentials before archiving:
# sudo systemctl cat docker
# sudo cat /etc/docker/daemon.json

These commands establish endpoint identity, daemon/server version, storage/logging baselines, service-manager ownership, and startup arguments. If the context is remote, the shell commands describe the client host, not the remote daemon host; do not mix those evidence sets.

7. Validate proposed JSON before starting or restarting

dockerd --validate --config-file=<path> parses a candidate configuration without starting a daemon. Invalid directives or malformed configuration return a non-zero status. Engine 29 validation also performs more system-requirement checks than older tutorials may imply, so validation can surface host prerequisites in addition to JSON syntax.

cat > /tmp/dca33-valid.json <<'EOF'
{
  "labels": ["devops-academy.chapter=33"]
}
EOF
sudo dockerd --validate --config-file=/tmp/dca33-valid.json

This validates a harmless candidate. It does not prove that a later reload/restart will preserve every workload, nor does it prove an external proxy or registry is reachable. Validation is one gate, not the whole rollout.

8. Daemon proxy is not container proxy

The daemon needs outbound proxy configuration when dockerd itself must reach registries or other Engine-side endpoints. Current Docker Engine supports daemon proxy fields in daemon.json, daemon CLI flags, or startup environment variables; command-line/config-file settings take precedence over environment variables.

By contrast, Docker CLI proxy configuration in ~/.docker/config.json can inject proxy environment variables/build arguments into new containers and builds. That changes application/build behavior, not the daemon’s own network path. Treat these as separate trust and secret-distribution surfaces.

9. Registry mirror versus registry trust

A registry mirror is a pull-through cache policy, commonly for Docker Hub. The daemon’s registry-mirrors setting tells Docker where to request mirrored content. A mirror can improve pull latency, reduce duplicate external transfers, or centralize egress, but it also becomes a supply-chain and availability dependency.

Do not confuse a mirror with an insecure registry. Docker assumes registries are secure by default. For private TLS endpoints, install the correct CA trust rather than globally weakening transport verification. Docker’s mirror documentation also warns that configuring mirror credentials for private Hub content can expose whatever that identity is authorized to fetch unless the mirror itself is properly secured.

10. Reload is selective, not magical

On Linux, Docker can reload a documented subset of options through SIGHUP (commonly systemctl reload docker). Current reloadable settings include items such as debug, daemon labels, live-restore, download/upload concurrency, runtimes, authorization plugins, insecure registries, registry mirrors, shutdown timeout, and feature settings.

Everything else must be classified from current documentation rather than assumed reloadable. In particular, a storage-root, bridge, or other startup-sensitive change should be planned as a restart/migration event, not tested by repeatedly sending SIGHUP.

11. Live restore: continuity with strict boundaries

By default, daemon termination shuts down running containers. With live restore enabled, eligible standalone Linux containers can remain running while the daemon is unavailable. Docker documents support for patch-level daemon upgrades when options remain compatible, not arbitrary major upgrades or storage/network architecture changes.

Live restore also has operational limits: if the daemon stays down long enough, a container that keeps writing logs can fill the FIFO buffer and block on logging. It applies to standalone containers, not Swarm service management. On Docker Desktop for Windows, live restore can work for Linux containers, but native Windows containers are not supported.

12. Restart timestamps and continuity evidence

A configuration rollout should be able to answer: Did the daemon process restart? Did a container restart? Did the process inside the container change PID? Was an externally reachable request continuously successful? Did the daemon reattach cleanly? Capture both daemon and container identities around the change.

# Linux/systemd evidence
systemctl show docker --property=MainPID,ActiveEnterTimestamp

docker inspect -f 'id={{.Id}} restart={{.RestartCount}} pid={{.State.Pid}} status={{.State.Status}}' dca33-test 2>/dev/null || true

13. Security boundary: never expose or weaken the daemon to “make config easier”

The Docker API is effectively host-control authority on a rootful Engine. This chapter never recommends opening an unauthenticated TCP socket, mounting the Docker socket into untrusted containers, disabling TLS verification, or broadly marking registries insecure. Configuration-management convenience does not justify expanding daemon authority.

Chapter 34 will cover Engine API and remote-daemon authentication explicitly. Here, the daemon remains locally managed and configuration changes stay within authorized disposable environments.

Knowledge check

Why can daemon.json be valid JSON yet still prevent Docker from starting?

A developer sets proxy values in ~/.docker/config.json, but docker pull still cannot reach Docker Hub. Which layer is wrong?

Does systemctl reload docker apply every changed key in daemon.json?

What does live restore preserve, and what does it not guarantee?

Why should systemctl cat docker evidence be handled carefully?

Next lesson

Next: Daemon Configuration, daemon.json, systemd, Proxies, Registry Mirrors, Live Restore, and Host Integration: Guided Hands-On Workflow and Core Operations

Continue with the next lesson in the course sequence and carry forward the evidence-first Docker operating model.

Official references and version notes

Verified baseline date:

2026-09-22. Docker Engine 29.8.1 is the current Engine baseline used for version-sensitive notes. Docker’s current docs prefer daemon.json for persistent Engine configuration, support offline dockerd --validate, document a finite reloadable-option set, and retain the bounded live-restore semantics described above.

Keep the academy open

Support free, practical DevOps education.

Every lesson is designed to remain readable in a browser, downloadable from GitHub, and usable without a paid learning platform. Contributions help expand and maintain the curriculum.

Ethereum / ERC-20
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0Send only Ethereum/ERC-20 compatible assets to this address.