Use this pattern for local development, staging, or controlled lab environments. For production workloads, consider running Cassandra directly on VMs or bare metal for optimal performance.
Create a project directory and configuration:
mkdir -p ~/cassandra-docker
cd ~/cassandra-docker
compose.yamlservices:
cassandra:
image: cassandra:5.0.6 # Use specific version
restart: unless-stopped
environment:
- CASSANDRA_CLUSTER_NAME=dev-cluster
- CASSANDRA_SEEDS=cassandra
- CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch
- MAX_HEAP_SIZE=2G
- HEAP_NEWSIZE=200M
ports:
- "9042:9042" # CQL
- "7199:7199" # JMX
volumes:
- ./data:/var/lib/cassandra
- ./config:/etc/cassandra
ulimits:
memlock: -1
nproc: 32768
nofile: 100000
healthcheck:
test: ["CMD", "cqlsh", "-e", "DESCRIBE KEYSPACES"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
For a simple 3-node cluster:
services:
cassandra1:
image: cassandra:5.0.6
restart: unless-stopped
environment:
- CASSANDRA_CLUSTER_NAME=docker-cluster
- CASSANDRA_SEEDS=cassandra1,cassandra2,cassandra3
- CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch
- CASSANDRA_BROADCAST_ADDRESS=cassandra1
- MAX_HEAP_SIZE=1G
- HEAP_NEWSIZE=200M
volumes:
- cassandra1_data:/var/lib/cassandra
healthcheck:
test: ["CMD", "cqlsh", "-e", "DESCRIBE CLUSTER"]
interval: 30s
timeout: 10s
retries: 5
start_period: 90s
cassandra2:
image: cassandra:5.0.6
restart: unless-stopped
environment:
- CASSANDRA_CLUSTER_NAME=docker-cluster
- CASSANDRA_SEEDS=cassandra1,cassandra2,cassandra3
- CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch
- CASSANDRA_BROADCAST_ADDRESS=cassandra2
- MAX_HEAP_SIZE=1G
- HEAP_NEWSIZE=200M
volumes:
- cassandra2_data:/var/lib/cassandra
depends_on:
cassandra1:
condition: service_healthy
cassandra3:
image: cassandra:5.0.6
restart: unless-stopped
environment:
- CASSANDRA_CLUSTER_NAME=docker-cluster
- CASSANDRA_SEEDS=cassandra1,cassandra2,cassandra3
- CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch
- CASSANDRA_BROADCAST_ADDRESS=cassandra3
- MAX_HEAP_SIZE=1G
- HEAP_NEWSIZE=200M
volumes:
- cassandra3_data:/var/lib/cassandra
depends_on:
cassandra1:
condition: service_healthy
volumes:
cassandra1_data:
cassandra2_data:
cassandra3_data:
# For single node
docker compose up -d
docker compose ps
# Check logs
docker compose logs -f cassandra
# For multi-node cluster
docker compose up -d
docker compose ps
# Check cluster status
docker exec -it cassandra1 nodetool status
From another container in the same network:
docker run --network cassandra-docker_default -it --rm cassandra:5.0.6 cqlsh cassandra 9042
From the host system:
docker exec -it cassandra cqlsh