Running π’”π’šπ’”π’•π’†π’Žπ’„π’•π’ Inside a Docker Container: A Practical Guide

mdshamsfiroz
3 min readOct 31, 2024

--

Running systemd services inside Docker containers can be challenging, but it’s sometimes necessary for managing services like Apache within containerized environments. This guide will walk you through the process of enabling systemctl functionality in a Docker container.

Step 1: Create a Dockerfile

First, create a directory for your Dockerfile:

mkdir docker-systemd
cd docker-systemd
nano Dockerfile

Add the following content to your Dockerfile:

FROM centos:7

# Install systemd
RUN yum -y update && yum -y install systemd

# Remove unnecessary systemd services
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == syste>
rm -f /lib/systemd/system/multi-user.target.wants/*; \
rm -f /etc/systemd/system/*.wants/*; \
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*; \
rm -f /lib/systemd/system/anaconda.target.wants/*;

# Install a service (e.g., nginx)
RUN yum -y install nginx

VOLUME [ "/sys/fs/cgroup" ]

This Dockerfile uses a CentOS base image with systemd support and sets it to run in the foreground.

Step 2: Build the Docker Image

Build your Docker image:

sudo docker run -d --name systemd-container --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro centos:7 /usr/sbin/init
docker build -t centos .
sudo docker exec -it centos systemctl status

Step 3: Run the Container

To run the container with systemd support, use the following command:

docker run --privileged \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
-v /run/systemd/system:/run/systemd/system \
-v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket \
-it centos /sbin/init

This command:

  • Runs the container in privileged mode
  • Mounts necessary volumes for systemd functionality
  • Starts the systemd init process

Step 4: Access the Container

In a new terminal window, access your running container:

docker exec -it <container_id> /bin/bash

Replace <container_id> with your actual container ID.

Step 5: Use systemctl

Now you can use systemctl commands inside the container:

systemctl status docker
systemctl start docker

Conclusion

By following these steps, you’ve successfully enabled systemctl functionality within a Docker container. Remember that running systemd in containers is not a standard practice and should be used cautiously, as it can impact container isolation and portability. For most use cases, it’s preferable to design containers that run a single process directly, without relying on an init system.

So, whether you’re a tech enthusiast, a professional, or just someone who wants to learn more, I invite you to follow me on this journey. Subscribe to my blog and follow me on social media to stay in the loop and never miss a post.

Together, let’s explore the exciting world of technology and all it offers. I can’t wait to connect with you!”

Connect me on Social Media: https://linktr.ee/mdshamsfiroz

Happy coding! Happy learning!

--

--

mdshamsfiroz
mdshamsfiroz

Written by mdshamsfiroz

Trying to learn tool by putting heart inside to make something

No responses yet