Setting Up SonarQube and Jenkins with Docker

TL;DR: Quick Docker commands for running SonarQube code quality analysis and Jenkins CI server with persistent storage.

Setting up code quality analysis and CI/CD infrastructure shouldn’t be complicated. This quick guide shows how to run SonarQube and Jenkins using Docker with persistent storage.

SonarQube Setup

SonarQube provides continuous code quality inspection, detecting bugs, vulnerabilities, and code smells.

Docker Command

docker run -d \
  --restart always \
  --name sonarqube \
  -p 9010:9000 \
  -v /home/ubuntu/sonar_home/sonarqube_conf:/opt/sonarqube/conf \
  -v /home/ubuntu/sonar_home/sonarqube_extensions:/opt/sonarqube/extensions \
  -v /home/ubuntu/sonar_home/sonarqube_logs:/opt/sonarqube/logs \
  -v /home/ubuntu/sonar_home/sonarqube_data:/opt/sonarqube/data \
  sonarqube

Breaking Down the Command

FlagPurpose
-dRun in detached mode (background)
--restart alwaysAuto-restart on failure or reboot
--name sonarqubeContainer name for easy management
-p 9010:9000Map host port 9010 to container port 9000
-v .../conf:...Persist configuration
-v .../extensions:...Persist plugins
-v .../logs:...Persist logs for debugging
-v .../data:...Persist analysis data and projects

Directory Setup

Before running, create the directories:

mkdir -p /home/ubuntu/sonar_home/{sonarqube_conf,sonarqube_extensions,sonarqube_logs,sonarqube_data}

# Set permissions (SonarQube runs as UID 1000)
chown -R 1000:1000 /home/ubuntu/sonar_home

Accessing SonarQube

  • URL: http://your-server:9010
  • Default credentials: admin / admin (change immediately!)

First-Time Configuration

  1. Log in with default credentials
  2. Change admin password when prompted
  3. Create a project and generate a token
  4. Configure your build tool (Maven, Gradle, etc.)

Jenkins Setup

Jenkins provides automation for building, testing, and deploying.

Docker Command

docker run -d \
  --restart always \
  --name jenkins \
  -p 9009:8080 \
  -p 50000:50000 \
  -v /home/ubuntu/jenkins_home:/var/jenkins_home \
  jenkins/jenkins:lts-jdk11

Port Mapping

PortPurpose
9009:8080Web interface
50000:50000Agent communication

Directory Setup

mkdir -p /home/ubuntu/jenkins_home

# Jenkins runs as UID 1000
chown -R 1000:1000 /home/ubuntu/jenkins_home

Initial Setup

  1. Get the initial admin password:
    docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
    
  2. Access http://your-server:9009
  3. Enter the initial password
  4. Install suggested plugins
  5. Create your admin user

Integrating Jenkins with SonarQube

1. Install SonarQube Scanner Plugin

In Jenkins:

  • Manage Jenkins → Plugins → Available
  • Search “SonarQube Scanner”
  • Install and restart

2. Configure SonarQube Server

In Jenkins:

  • Manage Jenkins → System
  • Add SonarQube server:
    • Name: SonarQube
    • URL: http://host.docker.internal:9010 (or your server IP)
    • Token: (create in SonarQube)

3. Add to Pipeline

pipeline {
    agent any
    
    stages {
        stage('SonarQube Analysis') {
            steps {
                withSonarQubeEnv('SonarQube') {
                    sh 'mvn sonar:sonar'
                }
            }
        }
        
        stage('Quality Gate') {
            steps {
                timeout(time: 5, unit: 'MINUTES') {
                    waitForQualityGate abortPipeline: true
                }
            }
        }
    }
}

Docker Compose Alternative

For easier management, use Docker Compose:

version: '3.8'

services:
  sonarqube:
    image: sonarqube:latest
    container_name: sonarqube
    restart: always
    ports:
      - "9010:9000"
    volumes:
      - ./sonar_home/conf:/opt/sonarqube/conf
      - ./sonar_home/extensions:/opt/sonarqube/extensions
      - ./sonar_home/logs:/opt/sonarqube/logs
      - ./sonar_home/data:/opt/sonarqube/data
    environment:
      - SONAR_JDBC_URL=jdbc:postgresql://db:5432/sonar
      - SONAR_JDBC_USERNAME=sonar
      - SONAR_JDBC_PASSWORD=sonar

  jenkins:
    image: jenkins/jenkins:lts-jdk11
    container_name: jenkins
    restart: always
    ports:
      - "9009:8080"
      - "50000:50000"
    volumes:
      - ./jenkins_home:/var/jenkins_home

  db:
    image: postgres:13
    container_name: sonarqube-db
    restart: always
    environment:
      - POSTGRES_USER=sonar
      - POSTGRES_PASSWORD=sonar
      - POSTGRES_DB=sonar
    volumes:
      - ./postgres_data:/var/lib/postgresql/data

System Requirements

SonarQube

  • RAM: Minimum 2GB, recommended 4GB
  • Disk: 10GB+ for data
  • Set vm.max_map_count=524288 in sysctl
# Add to /etc/sysctl.conf
vm.max_map_count=524288

# Apply immediately
sudo sysctl -w vm.max_map_count=524288

Jenkins

  • RAM: Minimum 1GB, recommended 2GB+
  • Disk: Depends on build artifacts

Quick Reference

Container Management

# View logs
docker logs -f sonarqube
docker logs -f jenkins

# Restart containers
docker restart sonarqube
docker restart jenkins

# Check status
docker ps | grep -E "sonarqube|jenkins"

Backup

# Backup SonarQube
tar -czvf sonar_backup.tar.gz /home/ubuntu/sonar_home

# Backup Jenkins
tar -czvf jenkins_backup.tar.gz /home/ubuntu/jenkins_home

Conclusion

With these Docker commands, you can have SonarQube and Jenkins running in minutes. The persistent volumes ensure your data survives container restarts, and the --restart always flag keeps services running after server reboots.

Key points:

  • Use named volumes for data persistence
  • Set correct permissions (UID 1000)
  • Configure vm.max_map_count for SonarQube
  • Change default passwords immediately