DEV Community

Prasad Bhalerao
Prasad Bhalerao

Posted on • Edited on

1

Docker-in-Docker (DinD): Run Containers Inside Containers Like a Pro! 😏

Ever wondered if you could run containers inside other containers? Welcome to Docker-in-Docker (DinD)—where containers go full-on Inception mode! 🚀

Docker-in-Docker Meme

What is Docker-in-Docker (DinD)?

Docker-in-Docker (DinD) is a powerful technique that enables you to run Docker inside a Docker container. Think of it like Russian nesting dolls—containers within containers, each with its own isolated environment.

This approach is invaluable for:

✔️ Building and testing Docker images in a clean, controlled setup

✔️ Running CI/CD pipelines inside containers

✔️ Deploying containerized workloads in Kubernetes

✔️ GPU-powered applications with NVIDIA Docker support

Let’s explore how DinD can supercharge your development workflow! 🚀


Why Use Docker-in-Docker (DinD)?

DinD isn’t just a cool concept—it solves real-world problems! Here’s why developers love it:

1️⃣ Effortless Testing & Building

Run Docker inside a container for consistent, reproducible builds—eliminating the dreaded "It works on my machine" issue.

2️⃣ Seamless CI/CD Pipelines

Integrate Docker-in-Docker into your DevOps workflow to streamline builds and deployments across environments.

3️⃣ Kubernetes Compatibility

Need containers inside Kubernetes pods? With DinD, you can launch nested Docker environments inside Kubernetes clusters.

4️⃣ NVIDIA GPU Support for AI & ML

Run GPU workloads inside DinD using NVIDIA’s Container Toolkit, unlocking AI/ML training within nested containers.


How to Set Up Docker-in-Docker (DinD) on Ubuntu

Setting up DinD is quick and easy! Follow this step-by-step guide to get started.

Step 1: Install Docker

If Docker isn’t installed yet, install it with this one-liner:

curl -fsSL https://get.docker.com | sh
Enter fullscreen mode Exit fullscreen mode

Step 2: Create a Dockerfile for Docker-in-Docker

Here’s a Dockerfile to set up a DinD container with NVIDIA GPU support:

# Base image: Ubuntu 24.04  
FROM ubuntu:24.04  

# Install required dependencies  
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
    ca-certificates \
    curl \
    gnupg \
    iptables \
    supervisor  

# Install Docker  
RUN curl -fsSL https://get.docker.com | sh  

# Install NVIDIA Container Toolkit for GPU support  
RUN curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
    && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    tee /etc/apt/sources.list.d/nvidia-container-toolkit.list \
    && apt-get update \
    && apt-get install -y nvidia-container-toolkit \
    && nvidia-ctk runtime configure --runtime=docker \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*  

# Copy necessary files  
COPY entrypoint.sh /usr/local/bin/  
COPY supervisor/ /etc/supervisor/conf.d/  

# Grant execution permission  
RUN chmod +x /usr/local/bin/entrypoint.sh  

# Set up Docker volume  
VOLUME /var/lib/docker  

# Entrypoint script  
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]  

# Default command  
CMD ["bash"]
Enter fullscreen mode Exit fullscreen mode

Step 3: Entrypoint Script

Every container needs a startup guide. Here’s the entrypoint script for DinD:

#!/bin/bash  

function wait_for_process() {
    local max_time_wait=30  
    local process_name="$1"  
    local waited_sec=0  

    while ! pgrep "$process_name" >/dev/null && ((waited_sec < max_time_wait)); do  
        echo "Waiting for $process_name to start..."  
        sleep 1  
        ((waited_sec++))  
        if ((waited_sec >= max_time_wait)); then  
            return 1  
        fi  
    done  
    return 0  
}  

echo "Starting Supervisor..."  
supervisord -n >> /dev/null 2>&1 &  

echo "Waiting for Docker Daemon (dockerd)..."  
wait_for_process dockerd  
if [ $? -ne 0 ]; then  
    echo "Error: dockerd did not start in time"  
    exit 1  
fi  

exec "$@"
Enter fullscreen mode Exit fullscreen mode

Step 4: Supervisor Configuration

This Supervisor config file keeps dockerd running inside the container:

[program:dockerd]  
command=/usr/bin/dockerd  
autostart=true  
autorestart=true  
stderr_logfile=/var/log/dockerd.err.log  
stdout_logfile=/var/log/dockerd.out.log  
Enter fullscreen mode Exit fullscreen mode

Run Docker-in-Docker (DinD) in a Container

You’re all set! Build and run your DinD container with these commands:

docker build -t dind-magic .  
docker run -it --privileged --gpus all --name dind-magic dind-magic  
Enter fullscreen mode Exit fullscreen mode

Too Busy to Set It Up? We’ve Got You Covered!

Skip the setup and run our prebuilt DinD container with one command:

docker run -it --rm --privileged ghcr.io/prasad89/dind-ubuntu-nvidia  
Enter fullscreen mode Exit fullscreen mode

🔥 No installation, no hassle—just pure Docker-in-Docker magic!

🔗 Check out our GitHub repo for more:

👉 DinD Ubuntu NVIDIA Repository


Final Thoughts

Docker-in-Docker unlocks new levels of flexibility for testing, CI/CD, Kubernetes, and GPU workloads. Whether you’re a DevOps engineer or an AI researcher, DinD provides a powerful, scalable solution for your containerized needs.

Ready to experiment? Try DinD today and let your containers nest within containers—creating a world of infinite possibilities! 🌎🐳

Retry later

Top comments (0)

Retry later
Retry later