Support for systemd in Docker has improved a lot since this 2016 article, but it’s still not obvious quite how to make it work. Why would you want this? Mostly for testing full-server deploys (for example we test ansible deployments against various docker containers to ensure there are no bugs).
Here’s a systemd-based centos 8 Dockerfile that also includes an ssh server:
FROM centos:8 # Set up base packages that are expected RUN dnf -y install openssh-server crontabs NetworkManager firewalld selinux-policy RUN systemctl mask dev-mqueue.mount dev-hugepages.mount \ systemd-remount-fs.service sys-kernel-config.mount \ sys-kernel-debug.mount sys-fs-fuse-connections.mount \ graphical.target systemd-logind.service \ NetworkManager.service systemd-hostnamed.service STOPSIGNAL SIGRTMIN+3 # SSHd setup EXPOSE 22 COPY docker.pub /root/.ssh/authorized_keys RUN chmod 600 /etc/ssh/ssh_host* /root/.ssh/authorized_keys CMD ["/sbin/init"]
You can then launch this like:
docker run -v /sys/fs/cgroup:/sys/fs/cgroup:ro --tmpfs /run container-name
For the latest centos 7 you can use the following Dockerfile:
FROM centos:7 RUN yum -y install openssh-server NetworkManager firewalld && \ systemctl disable NetworkManager && systemctl enable sshd EXPOSE 22 COPY docker.pub /root/.ssh/authorized_keys RUN chmod 600 /etc/ssh/ssh_host* /root/.ssh/authorized_keys STOPSIGNAL SIGRTMIN+3 CMD ["/sbin/init"]