Container workloads depend on the rootful Docker daemon, which systemctl can start, stop, reload, or restart on systemd Linux hosts. Socket activation and boot settings determine when it can return.
The main daemon unit is docker.service, it often depends on containerd.service, and packages may also provide docker.socket for on-demand activation. Rootless Docker uses a per-user service instead, so the system units here apply to the normal rootful daemon rather than rootless Docker or Docker Desktop.
Stopping or restarting the daemon can interrupt running containers unless the host is configured for live-restore. A live reload only applies settings that dockerd can reread without a full restart, while a maintenance stop must also account for the socket that can reactivate the daemon.
Steps to manage the Docker daemon with systemctl:
- Check the current state of the Docker daemon.
$ sudo systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled) Active: active (running) since Thu 2026-11-05 22:28:25 UTC; 20s ago Invocation: 2604939502b943b58c1cf6e840d239f2 TriggeredBy: ● docker.socket ##### snipped #####Active: shows whether Docker is running now, Loaded: shows whether it is enabled at boot, and TriggeredBy: names the socket that can start it on demand. If the output opens in a pager, q closes it. The remaining steps are separate actions, so use only the ones you need.
- Start the Docker daemon when it is not running.
$ sudo systemctl start docker
This starts Docker now without changing whether it starts at boot.
- Reload the Docker daemon so that it rereads a supported setting in daemon.json.
$ sudo systemctl reload docker
Settings such as debug or live-restore can be reloaded, while storage paths and other startup settings need a restart. A file with an error is rejected without a message here and the old settings stay in place, so sudo journalctl -u docker.service -n 20 is the place to look when a change does not apply.
- Restart the Docker daemon when a change needs a full restart.
A restart replaces the daemon process. Without live-restore, running containers stop while the daemon goes down and return only according to their restart policy.
$ sudo systemctl restart docker
- Stop the Docker daemon and its socket to keep Docker down for maintenance.
Running containers stop with the daemon unless live-restore is enabled.
$ sudo systemctl stop docker.service docker.socket
Stopping only docker.service prints Stopping 'docker.service', but its triggering units are still active: docker.socket, because the socket keeps listening and the next docker command starts the daemon again. containerd.service stays running because other tools can use it. On a package with no docker.socket unit, docker.service alone is enough.
- Confirm that the daemon and its socket are inactive.
$ systemctl is-active docker.service docker.socket inactive inactive
- Disable Docker so that it does not start at boot or on demand.
The --now option also stops Docker immediately, so running containers stop as they do for a maintenance stop.
$ sudo systemctl disable --now docker.service docker.socket ##### snipped ##### Removed '/etc/systemd/system/multi-user.target.wants/docker.service'. Removed '/etc/systemd/system/sockets.target.wants/docker.socket'.
If Docker was running, the command also prints Disabling 'docker.service', but its triggering units are still active: docker.socket. The same command stops the socket, so both units still end up stopped and disabled. containerd.service is left enabled because other tools can use it.
- Enable Docker so that it starts now and at every boot.
$ sudo systemctl enable --now docker.service docker.socket ##### snipped ##### Created symlink '/etc/systemd/system/multi-user.target.wants/docker.service' -> '/usr/lib/systemd/system/docker.service'. Created symlink '/etc/systemd/system/sockets.target.wants/docker.socket' -> '/usr/lib/systemd/system/docker.socket'.
- Confirm that the Docker daemon is responding.
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
The header row with no connection error means the daemon is answering, and any running containers are listed under it. This check applies only when Docker should be running.