Problem
How can systemd
and systemctl
be enabled and used in Ubuntu Docker containers? Why isn't systemd enabled by default in these containers, and why is it not considered a best practice in Docker?
Setup
I'm running Docker containers from the ubuntu:16.04 and ubuntu:16.10 images.
Tests
If I execute:
systemctl status ssh
in the 16,04 container
the result is the error Failed to connect to bus: No such file or directory
In the 16.10 container the error is: bash: systemctl: command not found.
If I do which systemctl
systemctl is found in the 16.04 container but not in the 16.10 container.
I have spotted that /lib/systemd
exists.
I have tried installing systemd
with:
apt-get install systemd libpam-systemd systemd-ui
Then which systemctl
finds systemctl
in 16.10
but systemctl status ssh
still gives the error Failed to connect to bus: No such file or directory
Questions
Can someone provide a solution for enabling and using systemd in Ubuntu Docker containers?
I have failed to find any documentation on this topic for Ubuntu / Ubuntu Docker images, only information on the Ubuntu transition from Upstart to systemd.
This is by design. Docker should be running a process in the foreground in your container and it will be spawned as PID 1 within the container's pid namespace. Docker is designed for process isolation, not for OS virtualization, so there are no other OS processes and daemons running inside the container (like systemd, cron, syslog, etc), only your entrypoint or command you run.
If they included systemd commands, you'd find a lot of things not working since your entrypoint replaces init. Systemd also makes use to cgroups which docker restricts inside of containers since the ability to change cgroups could allow a process to escape the container's isolation. Without systemd running as init inside your container, there's no daemon to process your start and stop commands.