Ory Kratos is available as a Docker image on Docker Hub. Docker is the recommended deployment method for development and production environments.
Official Docker images
Kratos provides several Docker image variants:
Alpine
oryd/kratos:v25.4.0 - Lightweight Alpine-based image with SQLite support
Distroless
oryd/kratos:v25.4.0-distroless - Minimal distroless image for enhanced security
Quick start with Docker Compose
The fastest way to run Kratos is using Docker Compose. Here’s the complete quickstart.yml from the Kratos repository:
version: '3.7'
services:
kratos-migrate:
image: oryd/kratos:v25.4.0
environment:
- DSN=sqlite:///var/lib/sqlite/db.sqlite?_fk=true&mode=rwc
volumes:
- type: volume
source: kratos-sqlite
target: /var/lib/sqlite
- type: bind
source: ./contrib/quickstart/kratos/email-password
target: /etc/config/kratos
command: -c /etc/config/kratos/kratos.yml migrate sql -e --yes
restart: on-failure
networks:
- intranet
kratos:
depends_on:
- kratos-migrate
image: oryd/kratos:v25.4.0
ports:
- '4433:4433' # public API
- '4434:4434' # admin API
restart: unless-stopped
environment:
- DSN=sqlite:///var/lib/sqlite/db.sqlite?_fk=true
- LOG_LEVEL=trace
command: serve -c /etc/config/kratos/kratos.yml --dev --watch-courier
volumes:
- type: volume
source: kratos-sqlite
target: /var/lib/sqlite
- type: bind
source: ./contrib/quickstart/kratos/email-password
target: /etc/config/kratos
networks:
- intranet
networks:
intranet:
volumes:
kratos-sqlite:
Running with Docker
Run a single Kratos container:
docker run -p 4433:4433 -p 4434:4434 \
-e DSN="memory" \
oryd/kratos:v25.4.0 \
serve --dev
The --dev flag disables security features and should only be used in development.
Production deployment
For production, use a proper database and configuration file:
docker run -p 4433:4433 -p 4434:4434 \
-e DSN="postgres://user:pass@postgres:5432/kratos?sslmode=require" \
-v /path/to/config:/etc/config/kratos \
oryd/kratos:v25.4.0 \
serve -c /etc/config/kratos/kratos.yml
Environment variables
Key environment variables for Docker deployment:
Database connection string (PostgreSQL, MySQL, CockroachDB, or SQLite)
Logging level: trace, debug, info, warn, error, fatal, panic
Public API port (default: 4433)
Admin API port (default: 4434)
Docker Compose variants
The Kratos repository includes several quickstart variants:
PostgreSQL
MySQL
CockroachDB
docker-compose -f quickstart-postgres.yml up
Uses PostgreSQL as the database backend.docker-compose -f quickstart-mysql.yml up
Uses MySQL as the database backend.docker-compose -f quickstart-crdb.yml up
Uses CockroachDB for distributed deployment.
Exposed ports
The Kratos Docker image exposes two ports:
- 4433: Public API - For self-service flows (login, registration, etc.)
- 4434: Admin API - For administrative operations (identity CRUD, sessions)
Volumes
When using SQLite, mount a volume at /var/lib/sqlite to persist data:volumes:
- kratos-sqlite:/var/lib/sqlite
Mount your configuration directory:volumes:
- ./config:/etc/config/kratos
Health checks
Add health checks to your Docker Compose:
kratos:
image: oryd/kratos:v25.4.0
healthcheck:
test: ["CMD", "kratos", "version"]
interval: 10s
timeout: 3s
retries: 3
start_period: 5s
Next steps
Database setup
Configure PostgreSQL, MySQL, or CockroachDB
Configuration
Learn about Kratos configuration options