Skip to main content

Docker Deployment

Run Data Stream with Docker and Docker Compose.

Quick Start

# Start everything
docker compose up -d

# Check status
docker compose ps

# View logs
docker compose logs -f

Architecture

Docker Architecture

docker-compose.yml

version: '3.8'

services:
postgres:
image: postgres:16-alpine
container_name: ds-postgres
environment:
POSTGRES_DB: datastream
POSTGRES_USER: datastream
POSTGRES_PASSWORD: datastream
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
- ./postgres/init:/docker-entrypoint-initdb.d
command:
- postgres
- -c
- wal_level=logical
- -c
- max_replication_slots=4
- -c
- max_wal_senders=4
healthcheck:
test: ["CMD-SHELL", "pg_isready -U datastream"]
interval: 5s
timeout: 5s
retries: 5

nats:
image: nats:2.10-alpine
container_name: ds-nats
ports:
- "4222:4222"
- "8222:8222"
command: ["--jetstream", "--http_port", "8222"]
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:8222/healthz"]
interval: 5s
timeout: 5s
retries: 5

redis:
image: redis:7-alpine
container_name: ds-redis
ports:
- "6379:6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 5s
retries: 5

debezium:
image: debezium/server:2.5
container_name: ds-debezium
ports:
- "8080:8080"
volumes:
- ./debezium/application.properties:/debezium/conf/application.properties
depends_on:
postgres:
condition: service_healthy
nats:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/q/health"]
interval: 10s
timeout: 5s
retries: 10

consumer:
build:
context: ./consumer
dockerfile: Dockerfile
container_name: ds-consumer
environment:
NATS_URL: nats://nats:4222
REDIS_URL: redis://redis:6379
POSTGRES_URL: postgres://datastream:datastream@postgres:5432/datastream?sslmode=disable
depends_on:
postgres:
condition: service_healthy
nats:
condition: service_healthy
redis:
condition: service_healthy
debezium:
condition: service_healthy

backend:
build:
context: ./backend
dockerfile: Dockerfile
container_name: ds-backend
ports:
- "3000:3000"
environment:
PORT: "3000"
REDIS_URL: redis://redis:6379
depends_on:
redis:
condition: service_healthy

volumes:
postgres_data:
redis_data:

Building Images

Backend

# backend/Dockerfile
FROM golang:1.22-alpine AS builder

WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download

COPY . .
RUN CGO_ENABLED=0 go build -o backend ./cmd/main.go

FROM alpine:3.19
RUN apk --no-cache add ca-certificates
WORKDIR /app
COPY --from=builder /app/backend .
COPY --from=builder /app/public ./public

EXPOSE 3000
CMD ["./backend"]

Consumer

# consumer/Dockerfile
FROM golang:1.22-alpine AS builder

WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download

COPY . .
RUN CGO_ENABLED=0 go build -o consumer ./cmd/main.go

FROM alpine:3.19
RUN apk --no-cache add ca-certificates
WORKDIR /app
COPY --from=builder /app/consumer .

CMD ["./consumer"]

Commands

Start Services

# Start all
docker compose up -d

# Start specific service
docker compose up -d backend

# Rebuild and start
docker compose up -d --build

View Logs

# All logs
docker compose logs -f

# Specific service
docker compose logs -f backend

# Last 100 lines
docker compose logs --tail 100 backend

Stop Services

# Stop all
docker compose down

# Stop and remove volumes
docker compose down -v

Scale

# Scale backend to 3 instances
docker compose up -d --scale backend=3

Health Checks

# Check all services
docker compose ps

# Individual health
docker inspect --format='{{.State.Health.Status}}' ds-postgres
docker inspect --format='{{.State.Health.Status}}' ds-redis

Networking

Services communicate via Docker network:

ServiceInternal HostPort
PostgreSQLpostgres5432
NATSnats4222
Redisredis6379
Debeziumdebezium8080
Backendbackend3000

Volumes

VolumePurpose
postgres_dataPostgreSQL data
redis_dataRedis persistence

Environment Variables

Backend

VariableDefaultDescription
PORT3000HTTP port
REDIS_URLredis://redis:6379Redis connection

Consumer

VariableDefaultDescription
NATS_URLnats://nats:4222NATS connection
REDIS_URLredis://redis:6379Redis connection
POSTGRES_URL-PostgreSQL connection

Troubleshooting

Service Won't Start

# Check logs
docker compose logs service_name

# Check health
docker compose ps

# Restart service
docker compose restart service_name

Database Connection Failed

# Check PostgreSQL is healthy
docker compose exec postgres pg_isready

# Check replication
docker compose exec postgres psql -U datastream -c "SELECT * FROM pg_replication_slots;"

CDC Not Working

# Check Debezium health
curl http://localhost:8080/q/health

# Check NATS streams
curl http://localhost:8222/jsz | jq