Bird
Raised Fist0
Jenkinsdevops~5 mins

Docker socket mounting in Jenkins - Commands & Configuration

Choose your learning style10 modes available
Introduction
Sometimes, you want a program inside a container to control Docker on the host machine. Docker socket mounting lets the container talk directly to the host's Docker engine. This helps run or manage containers from inside another container.
When Jenkins runs inside a container and needs to build or run Docker containers on the host.
When you want to use Docker commands inside a container without installing Docker inside it.
When automating container builds and deployments from a CI/CD pipeline running in a container.
When you want to share the host Docker daemon with multiple containers safely.
When debugging or managing Docker containers from inside a container environment.
Config File - Jenkinsfile
Jenkinsfile
pipeline {
    agent {
        docker {
            image 'docker:20.10.16'
            args '-v /var/run/docker.sock:/var/run/docker.sock'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'docker ps'
            }
        }
    }
}

This Jenkinsfile defines a pipeline that runs inside a Docker container using the official Docker image version 20.10.16.

The args option mounts the host's Docker socket /var/run/docker.sock into the container at the same path. This allows Docker commands inside the container to communicate with the host's Docker daemon.

The Build stage runs docker ps to list running containers on the host, demonstrating access to the host Docker engine.

Commands
This command runs a Jenkins container named 'jenkins-docker'. It mounts the host Docker socket inside the container so Jenkins can control Docker on the host. It also mounts a volume for Jenkins data and exposes port 8080.
Terminal
docker run -d --name jenkins-docker -v /var/run/docker.sock:/var/run/docker.sock -v jenkins_home:/var/jenkins_home -p 8080:8080 jenkins/jenkins:lts
Expected OutputExpected
Unable to find image 'jenkins/jenkins:lts' locally lts: Pulling from jenkins/jenkins Digest: sha256:... Status: Downloaded newer image for jenkins/jenkins:lts c3f279d17e0a4e3a9a1f9b7a2e6f3b7a8c9d0e1f2a3b4c5d6e7f8g9h0i1j2k3l
→
-v /var/run/docker.sock:/var/run/docker.sock - Mount host Docker socket inside container
→
-v jenkins_home:/var/jenkins_home - Persist Jenkins data
→
-p 8080:8080 - Expose Jenkins web interface
Runs 'docker ps' inside the Jenkins container to list running Docker containers on the host. This shows that the container can control the host Docker daemon via the mounted socket.
Terminal
docker exec jenkins-docker docker ps
Expected OutputExpected
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c3f279d17e0a4 jenkins/jenkins:lts "/sbin/tini -- /usr/…" 10 seconds ago Up 9 seconds 0.0.0.0:8080->8080/tcp jenkins-docker
Runs a test Docker container 'hello-world' from inside the Jenkins container. This confirms the container can start new containers on the host using the mounted Docker socket.
Terminal
docker exec jenkins-docker docker run --rm hello-world
Expected OutputExpected
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world Digest: sha256:... Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly.
Key Concept

Mounting the host's Docker socket inside a container lets that container control Docker on the host directly.

Common Mistakes
Not mounting the Docker socket when running the container.
Without the socket mount, Docker commands inside the container cannot communicate with the host Docker daemon and will fail.
Always include '-v /var/run/docker.sock:/var/run/docker.sock' when you want Docker control inside the container.
Mounting the socket but not using a Docker image with Docker client installed.
The container needs the Docker client binary to run Docker commands; mounting the socket alone is not enough.
Use a Docker image that includes the Docker client, like 'docker:20.10.16' or the official Jenkins Docker image with Docker installed.
Running Docker commands inside the container without proper permissions.
The container user may not have permission to access the Docker socket, causing permission denied errors.
Run the container with appropriate user permissions or adjust socket permissions carefully on the host.
Summary
Mount the host Docker socket into the container to allow Docker commands inside the container to control the host Docker daemon.
Use Docker images that include the Docker client to run Docker commands inside the container.
Verify access by running 'docker ps' or starting a test container from inside the container.

Practice

(1/5)
1. What is the main purpose of mounting the Docker socket /var/run/docker.sock inside a Jenkins container?
easy
A. To allow Jenkins to control Docker on the host machine
B. To increase Jenkins container storage space
C. To isolate Jenkins from the host Docker engine
D. To enable Jenkins to run without Docker installed

Solution

  1. Step 1: Understand Docker socket mounting

    Mounting /var/run/docker.sock lets a container communicate with the host's Docker engine directly.
  2. Step 2: Apply to Jenkins use case

    Jenkins uses this to build and run Docker containers on the host from inside its own container.
  3. Final Answer:

    To allow Jenkins to control Docker on the host machine -> Option A
  4. Quick Check:

    Docker socket mounting = Jenkins controls host Docker [OK]
Hint: Docker socket mounting = container controls host Docker [OK]
Common Mistakes:
  • Thinking it increases container storage
  • Assuming it isolates Jenkins from Docker
  • Believing it removes need for Docker installation
2. Which of the following is the correct Docker run command snippet to mount the Docker socket inside a Jenkins container?
easy
A. docker run -v /var/run/docker.sock:/var/run/docker jenkins
B. docker run -v /var/run/docker.sock:/docker.sock jenkins
C. docker run -v /docker.sock:/var/run/docker.sock jenkins
D. docker run -v /var/run/docker.sock:/var/run/docker.sock jenkins

Solution

  1. Step 1: Identify correct volume mount syntax

    The syntax is -v host_path:container_path. The Docker socket is at /var/run/docker.sock on the host and must be mounted to the same path inside the container.
  2. Step 2: Match correct paths

    docker run -v /var/run/docker.sock:/var/run/docker.sock jenkins correctly mounts /var/run/docker.sock from host to container at the same path.
  3. Final Answer:

    docker run -v /var/run/docker.sock:/var/run/docker.sock jenkins -> Option D
  4. Quick Check:

    Correct volume mount syntax = docker run -v /var/run/docker.sock:/var/run/docker.sock jenkins [OK]
Hint: Mount socket with same host and container path [OK]
Common Mistakes:
  • Swapping host and container paths
  • Using incorrect socket path inside container
  • Missing /var/run prefix
3. Given this Jenkins Docker run command:
docker run -d -v /var/run/docker.sock:/var/run/docker.sock jenkins

What will happen if Jenkins tries to run docker ps inside its container?
medium
A. It will show an error: Docker command not found
B. It will list running Docker containers on the host
C. It will list containers inside the Jenkins container only
D. It will fail because Docker daemon is not running inside Jenkins

Solution

  1. Step 1: Understand socket mount effect

    Mounting the Docker socket lets Jenkins use the host's Docker daemon, so commands like docker ps run inside Jenkins actually query the host Docker.
  2. Step 2: Predict command output

    Therefore, docker ps inside Jenkins will list containers running on the host, not inside Jenkins container.
  3. Final Answer:

    It will list running Docker containers on the host -> Option B
  4. Quick Check:

    Docker socket mount = host Docker commands inside container [OK]
Hint: Docker socket mount = host Docker commands work inside container [OK]
Common Mistakes:
  • Thinking Docker runs inside Jenkins container
  • Assuming Docker command is missing
  • Confusing container vs host Docker context
4. You mounted the Docker socket in Jenkins container but get permission denied errors when running Docker commands inside Jenkins. What is the likely cause?
medium
A. Jenkins user inside container lacks permission to access the socket
B. Docker daemon is not installed on the host
C. The socket path inside container is incorrect
D. Jenkins container network is disconnected

Solution

  1. Step 1: Analyze permission error cause

    The Docker socket file on the host has restricted permissions. If Jenkins runs as a user without access rights, it will get permission denied.
  2. Step 2: Confirm other options

    Docker daemon must be running on host (else other errors). Socket path is correct if mounted. Network issues don't cause permission denied on socket.
  3. Final Answer:

    Jenkins user inside container lacks permission to access the socket -> Option A
  4. Quick Check:

    Permission denied = user lacks socket access [OK]
Hint: Check Jenkins user permissions on Docker socket [OK]
Common Mistakes:
  • Blaming Docker daemon absence
  • Assuming wrong socket path
  • Confusing network issues with permissions
5. You want Jenkins to build Docker images inside its container using the host Docker engine. Which combination of steps is the safest and most effective approach?
hard
A. Mount /var/run/docker.sock and run Jenkins as root user inside container
B. Install Docker daemon inside Jenkins container and do not mount socket
C. Mount /var/run/docker.sock and add Jenkins user to Docker group on host and container
D. Use Docker-in-Docker (DinD) without mounting socket

Solution

  1. Step 1: Understand mounting socket and permissions

    Mounting the Docker socket allows Jenkins to use host Docker. Running as root is risky and not recommended.
  2. Step 2: Apply best practice for permissions

    Adding Jenkins user to Docker group on host and container grants needed permissions safely without root.
  3. Step 3: Evaluate alternatives

    Installing Docker daemon inside Jenkins container duplicates effort and complicates setup. DinD is more complex and less secure.
  4. Final Answer:

    Mount /var/run/docker.sock and add Jenkins user to Docker group on host and container -> Option C
  5. Quick Check:

    Socket mount + Docker group permissions = safe Jenkins Docker use [OK]
Hint: Use socket mount + Docker group permissions, avoid root [OK]
Common Mistakes:
  • Running Jenkins as root inside container
  • Installing Docker daemon inside Jenkins container
  • Using DinD without understanding risks
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard