Running with Docker

This guide shows how to run Korvet using Docker.

Quick Start

Run Korvet with default configuration:

docker run -p 9092:9092 redisfield/korvet:latest server

This starts Korvet on port 9092. An external Redis instance is required; the image does not include one. See Using External Redis to point Korvet at your Redis.

The image also includes the Korvet operational CLI. Pass a command as the container argument:

docker run --rm redisfield/korvet:latest topics --bootstrap-server host.docker.internal:9092 --list
docker run --rm redisfield/korvet:latest migrate -u redis://host.docker.internal:6379

Using External Redis

To use an external Redis instance:

docker run -p 9092:9092 \
  -e KORVET_REDIS_URI=redis://redis.example.com:6379 \
  redisfield/korvet:latest server

With authentication:

docker run -p 9092:9092 \
  -e KORVET_REDIS_URI=redis://redis.example.com:6379 \
  -e KORVET_REDIS_USERNAME=default \
  -e KORVET_REDIS_PASSWORD=${REDIS_PASSWORD} \
  redisfield/korvet:latest server

Docker Compose

Create a docker-compose.yml file:

services:
  redis:
    image: redis:8.6
    ports:
      - "6379:6379"

  korvet:
    image: redisfield/korvet:latest
    command: server
    ports:
      - "9092:9092"
    environment:
      KORVET_REDIS_URI: redis://redis:6379
    depends_on:
      - redis

With Redis authentication:

services:
  redis:
    image: redis:8.6
    command: redis-server --requirepass ${REDIS_PASSWORD}
    ports:
      - "6379:6379"

  korvet:
    image: redisfield/korvet:latest
    command: server
    ports:
      - "9092:9092"
    environment:
      KORVET_REDIS_URI: redis://redis:6379
      KORVET_REDIS_PASSWORD: ${REDIS_PASSWORD}
    depends_on:
      - redis

Run with:

docker compose up

Configuration

See Configuration for all available options.

JVM Tuning

The Docker image accepts JVM options through the JAVA_OPTS environment variable. Use this to increase heap size or apply additional JVM tuning flags.

For example, to run with a 2 GiB heap:

docker run -p 9092:9092 \
  -e JAVA_OPTS="-Xms2g -Xmx2g" \
  redisfield/korvet:latest server

Direct Memory for High Concurrency

The broker defaults to -XX:MaxDirectMemorySize=512m. For production deployments with many concurrent connections (e.g., Databricks Spark, Flink), raise it further. Set it via JAVA_OPTS (not JAVA_TOOL_OPTIONS, which the baked default overrides), and keep the container memory limit above -Xmx + MaxDirectMemorySize plus native overhead:

docker run -p 9092:9092 \
  -e JAVA_OPTS="-Xms2g -Xmx2g -XX:MaxDirectMemorySize=512m" \
  redisfield/korvet:latest server

Or in Docker Compose:

services:
  korvet:
    image: redisfield/korvet:latest
    command: server
    environment:
      JAVA_OPTS: "-Xms2g -Xmx2g -XX:MaxDirectMemorySize=512m"
    mem_limit: 4g