ClickHouse Docker Deployment and Spring Boot Integration Guide

Docker Deployement Configuration

ClickHouse can be easily deployed using Docker. The following configuration covers the essential setup including network ports, storage volumes, and security parameters.

Basic Container Launch

docker run -d \
  --name=clickhouse-server \
  -e CLICKHOUSE_ADMIN_PASSWORD=secure_password \
  --ulimit nofile=262144:262144 \
  -p 8123:8123 \
  -p 9000:9000 \
  -p 9009:9009 \
  --privileged=true \
  -v clickhouse-data:/var/lib/clickhouse \
  bitnami/clickhouse:latest

Port Configuration Overview

Port Protocol Purpose
8123 HTTP Web interface and REST API
9000 TCP Native client connections
9009 TCP Inter-node replication

Verification

Confirm the service is running correctly:

curl http://localhost:8123

Expected response: Ok.

Configuration File Management

Extracting Configuration Files

Copy the default configuration files from the container for customization:

# Extract user authentication configuration
docker cp clickhouse-server:/etc/clickhouse-server/users.xml /opt/clickhouse/config/users.xml

# Extract server configuration
docker cp clickhouse-server:/etc/clickhouse-server/config.xml /opt/clickhouse/config/config.xml

Persistent Storage Mount

Mount external directories for data persistence:

docker run -d \
  --name=clickhouse-server \
  -e CLICKHOUSE_ADMIN_PASSWORD=secure_password \
  --ulimit nofile=262144:262144 \
  -p 8123:8123 \
  -v /opt/clickhouse/data:/var/lib/clickhouse \
  -v /opt/clickhouse/config:/etc/clickhouse-server \
  bitnami/clickhouse:latest

Database and Table Operations

Creating a Database

CREATE DATABASE IF NOT EXISTS analytics_db;

Creating a Table

CREATE TABLE analytics_db.user_activity
(
    `session_id` String,
    `user_id` String,
    `event_type` String,
    `event_timestamp` DateTime,
    `metadata` Map(String, String)
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(event_timestamp)
ORDER BY (user_id, event_timestamp)
SETTINGS index_granularity = 8192;

Spring Boot Integration

Maven Dependencies

Add the ClickHouse JDBC driver to your pom.xml:

<dependency>
    <groupId>com.clickhouse</groupId>
    <artifactId>clickhouse-jdbc</artifactId>
    <version>0.6.4</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

Application Configuration

Configure the connection in application.yml:

spring:
  datasource:
    clickhouse:
      jdbc-url: jdbc:clickhouse://localhost:8123/analytics_db
      username: default
      password: secure_password
      driver-class-name: com.clickhouse.jdbc.ClickHouseDriver
      hikari:
        maximum-pool-size: 10
        minimum-idle: 5
        connection-timeout: 30000

Repository Implementation

@Repository
public class UserActivityRepository {

    private final JdbcTemplate jdbcTemplate;

    public UserActivityRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void saveActivity(UserActivity activity) {
        String sql = """
            INSERT INTO analytics_db.user_activity 
            (session_id, user_id, event_type, event_timestamp, metadata)
            VALUES (?, ?, ?, ?, ?)
            """;
        
        Map<String, String> metadataMap = activity.getMetadata();
        
        jdbcTemplate.update(sql,
            activity.getSessionId(),
            activity.getUserId(),
            activity.getEventType(),
            activity.getTimestamp(),
            metadataMap
        );
    }

    public List<UserActivity> findByUserId(String userId) {
        String sql = """
            SELECT session_id, user_id, event_type, event_timestamp, metadata
            FROM analytics_db.user_activity
            WHERE user_id = ?
            ORDER BY event_timestamp DESC
            LIMIT 100
            """;
        
        return jdbcTemplate.query(sql, (rs, rowNum) -> {
            UserActivity activity = new UserActivity();
            activity.setSessionId(rs.getString("session_id"));
            activity.setUserId(rs.getString("user_id"));
            activity.setEventType(rs.getString("event_type"));
            activity.setTimestamp(rs.getTimestamp("event_timestamp"));
            return activity;
        }, userId);
    }
}

Service Layer

@Service
public class AnalyticsService {

    private final UserActivityRepository activityRepository;

    public AnalyticsService(UserActivityRepository activityRepository) {
        this.activityRepository = activityRepository;
    }

    public void recordEvent(String userId, String eventType, Map<String, String> metadata) {
        UserActivity activity = new UserActivity();
        activity.setSessionId(UUID.randomUUID().toString());
        activity.setUserId(userId);
        activity.setEventType(eventType);
        activity.setTimestamp(new Timestamp(System.currentTimeMillis()));
        activity.setMetadata(metadata);
        
        activityRepository.saveActivity(activity);
    }

    public List<UserActivity> getUserHistory(String userId) {
        return activityRepository.findByUserId(userId);
    }
}

Web Interface Access

The ClickHouse web console provides a visual interface for query execution and database management:

http://<server-ip>:8123/play

This web interface supports SQL query execution, result visualization, and system monitoring.

Tags: ClickHouse docker Spring Boot database java

Posted on Wed, 01 Jul 2026 18:05:37 +0000 by jackie11