Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/questdb/questdb/llms.txt

Use this file to discover all available pages before exploring further.

Overview

QuestDB provides official Docker images for easy deployment. The Docker image is based on Fedora Minimal and includes all necessary runtime dependencies.

Quick Start

Run QuestDB with Docker in a single command:
docker run -p 9000:9000 -p 9009:9009 -p 8812:8812 questdb/questdb
Access the web console at http://localhost:9000

Port Mapping

QuestDB exposes three ports:
PortProtocolDescription
9000HTTPWeb Console and REST API
9009TCPInfluxDB Line Protocol (ILP)
8812TCPPostgreSQL Wire Protocol

Volume Mounts

Persist data by mounting a volume to /var/lib/questdb:
docker run -p 9000:9000 -p 9009:9009 -p 8812:8812 \
  -v $(pwd)/questdb-data:/var/lib/questdb \
  questdb/questdb

Directory Structure

The QuestDB data directory contains:
  • /db - Table data and metadata
  • /conf - Configuration files
  • /public - Static web console files
  • /.checkpoint - Checkpoint data
  • /snapshot - Snapshot files

Environment Variables

Core Configuration

# Data directory (default: /var/lib/questdb)
QUESTDB_DATA_DIR=/var/lib/questdb

# Run as root user (default: false)
RUN_AS_ROOT=false

# Change ownership of data directory (default: true)
DO_CHOWN=true

# User and group IDs
QUESTDB_UID=10001
QUESTDB_GID=10001

JVM Configuration

# Prepend JVM arguments
JVM_PREPEND="-Xms2G -Xmx4G"

Profiling (async-profiler)

# Enable async profiler
PROFILER_ENABLED=true

# Profiling events (cpu, wall, alloc, lock)
PROFILER_EVENT=cpu,wall

# Sampling interval
PROFILER_INTERVAL=5ms

# Profile rotation interval
PROFILER_LOOP=30m

# Output directory
PROFILER_OUTPUT_DIR=/var/lib/questdb/profiles

Docker Compose

Create a docker-compose.yml file:
version: '3.8'

services:
  questdb:
    image: questdb/questdb:latest
    container_name: questdb
    ports:
      - "9000:9000"  # Web Console & REST API
      - "9009:9009"  # InfluxDB Line Protocol
      - "8812:8812"  # PostgreSQL Wire Protocol
    volumes:
      - ./questdb-data:/var/lib/questdb
    environment:
      - QDB_PACKAGE=docker
      - QUESTDB_DATA_DIR=/var/lib/questdb
    restart: unless-stopped
Start the service:
docker-compose up -d

Custom Configuration

Mount a custom server.conf file:
docker run -p 9000:9000 -p 9009:9009 -p 8812:8812 \
  -v $(pwd)/questdb-data:/var/lib/questdb \
  -v $(pwd)/server.conf:/var/lib/questdb/conf/server.conf \
  questdb/questdb
Example server.conf:
# HTTP settings
http.enabled=true
http.net.bind.to=0.0.0.0:9000

# PostgreSQL Wire Protocol
pg.enabled=true
pg.net.bind.to=0.0.0.0:8812
pg.user=admin
pg.password=quest

# InfluxDB Line Protocol (TCP)
line.tcp.enabled=true
line.tcp.net.bind.to=0.0.0.0:9009

# Query timeout
query.timeout.sec=60

# Worker threads
shared.worker.count=2

Advanced Configuration

Resource Limits

services:
  questdb:
    image: questdb/questdb:latest
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 8G
        reservations:
          cpus: '2'
          memory: 4G

Health Check

services:
  questdb:
    image: questdb/questdb:latest
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

Network Configuration

services:
  questdb:
    image: questdb/questdb:latest
    networks:
      - questdb-network

networks:
  questdb-network:
    driver: bridge

Production Deployment

With Profiling

services:
  questdb:
    image: questdb/questdb:latest
    ports:
      - "9000:9000"
      - "9009:9009"
      - "8812:8812"
    volumes:
      - ./questdb-data:/var/lib/questdb
      - ./profiles:/var/lib/questdb/profiles
    environment:
      - PROFILER_ENABLED=true
      - PROFILER_EVENT=cpu,wall
      - PROFILER_INTERVAL=5ms
      - PROFILER_LOOP=30m
      - JVM_PREPEND=-Xms4G -Xmx8G -XX:+UseParallelGC
    restart: unless-stopped

Multi-Container Setup

version: '3.8'

services:
  questdb:
    image: questdb/questdb:latest
    container_name: questdb
    ports:
      - "9000:9000"
      - "9009:9009"
      - "8812:8812"
    volumes:
      - questdb-data:/var/lib/questdb
    environment:
      - JVM_PREPEND=-Xms4G -Xmx8G
    networks:
      - app-network
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    environment:
      - GF_INSTALL_PLUGINS=questdb-questdb-datasource
    networks:
      - app-network
    restart: unless-stopped

volumes:
  questdb-data:

networks:
  app-network:
    driver: bridge

Docker Image Variants

QuestDB provides two Docker image variants:

Standard Image (questdb/questdb)

Based on Fedora Minimal 44, suitable for general use:
docker pull questdb/questdb:latest

Red Hat OpenShift Compatible

Based on UBI 10 Minimal, compatible with OpenShift:
FROM registry.access.redhat.com/ubi10/ubi-minimal
# Built-in support for restricted security contexts

Troubleshooting

Permission Issues

If you encounter permission errors:
# Run with specific UID/GID
docker run -p 9000:9000 -p 9009:9009 -p 8812:8812 \
  -v $(pwd)/questdb-data:/var/lib/questdb \
  -e QUESTDB_UID=$(id -u) \
  -e QUESTDB_GID=$(id -g) \
  questdb/questdb

View Logs

# Docker run
docker logs questdb

# Docker Compose
docker-compose logs -f questdb

Connect to Container

docker exec -it questdb /bin/bash

Next Steps