Docker Integration
Docker Integration
Section titled “Docker Integration”DBCrust provides seamless integration with Docker containers, making it easy to connect to databases running in containers whether they’re part of your development workflow, testing pipeline, or containerized production environment. This guide covers everything from basic container connections to advanced Docker Compose integration.
🐳 Why Docker Integration?
Section titled “🐳 Why Docker Integration?”Docker integration simplifies database development workflows:
- ✅ Auto-discovery - Automatically find running database containers
- ✅ Intelligent routing - Works with exposed ports and internal networks
- ✅ OrbStack support - Native integration with OrbStack on macOS
- ✅ Compose integration - Seamless Docker Compose project support
- ✅ Development workflow - Perfect for local development and testing
🚀 Quick Start
Section titled “🚀 Quick Start”Interactive Container Selection
Section titled “Interactive Container Selection”The simplest way to connect is using interactive selection:
# Show all running database containersdbcrust docker://
# Example output:# Available database containers:# 1. postgres-dev (postgres:15) - Port 5432 → 5433# 2. mysql-test (mysql:8.0) - Port 3306 → 3307# 3. clickhouse-analytics (clickhouse:latest) - Port 8123 → 8124# 4. mongodb-cache (mongo:7) - Port 27017 → 27018## Select container (1-4): 1Direct Container Connection
Section titled “Direct Container Connection”# Connect to specific container by namedbcrust docker://postgres-devdbcrust docker://mysql-testdbcrust docker://clickhouse-analyticsdbcrust docker://my-app-db
# With credentialsdbcrust docker://user:password@postgres-devdbcrust docker://root:secret@mysql-test/specific_databasedbcrust docker://clickhouse:password@clickhouse-analytics/analytics
# Full URL formatdbcrust docker://username:password@container-name/database-nameShell Autocompletion
Section titled “Shell Autocompletion”DBCrust provides intelligent autocompletion for container names:
# Type partial name and press TABdbc docker://post[TAB] → postgres-dev, postgres-proddbc docker://my[TAB] → mysql-test, my-app-dbdbc docker://click[TAB] → clickhouse-analytics, clickhouse-dev🛠️ Connection Methods
Section titled “🛠️ Connection Methods”Exposed Ports (Standard Docker)
Section titled “Exposed Ports (Standard Docker)”For containers with exposed ports:
# Container with exposed portdocker run -d --name postgres-dev -p 5433:5432 postgres:15
# DBCrust automatically detects the port mappingdbcrust docker://postgres-dev# → Connects to localhost:5433OrbStack Integration (macOS)
Section titled “OrbStack Integration (macOS)”OrbStack provides seamless container networking on macOS:
# Containers without exposed ports work automaticallydocker run -d --name postgres-dev postgres:15
# DBCrust uses OrbStack's DNS resolutiondbcrust docker://postgres-dev# → Connects to postgres-dev.orb.local:5432Docker Network Support
Section titled “Docker Network Support”Connect to containers on custom networks:
# Create custom networkdocker network create myapp-network
# Run container on networkdocker run -d --name postgres-app --network myapp-network postgres:15
# DBCrust finds the container on the networkdbcrust docker://postgres-app🐍 Docker Compose Integration
Section titled “🐍 Docker Compose Integration”Compose Project Detection
Section titled “Compose Project Detection”DBCrust automatically detects Docker Compose projects:
version: '3.8'services: database: image: postgres:15 environment: POSTGRES_DB: myapp POSTGRES_USER: myapp POSTGRES_PASSWORD: secret ports: - "5432:5432"
redis: image: redis:7-alpine ports: - "6379:6379"# Connect to compose servicesdbcrust docker://database # postgres servicedbcrust docker://myapp_database_1 # alternative name
# With OrbStack DNSdbcrust docker://database.myapp.orb.localMulti-Environment Compose
Section titled “Multi-Environment Compose”# Development environmentdocker-compose -f docker-compose.dev.yml up -ddbcrust docker://postgres-dev
# Testing environmentdocker-compose -f docker-compose.test.yml up -ddbcrust docker://postgres-test
# Production-like stagingdocker-compose -f docker-compose.staging.yml up -ddbcrust docker://postgres-stagingDjango Development Workflow
Section titled “Django Development Workflow”Perfect integration with Django development:
# docker-compose.yml for Django projectversion: '3.8'services: web: build: . ports: - "8000:8000" depends_on: - db - redis environment: - DATABASE_URL=postgres://django:password@db:5432/django_db
db: image: postgres:15 environment: POSTGRES_DB: django_db POSTGRES_USER: django POSTGRES_PASSWORD: password ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data
redis: image: redis:7-alpine ports: - "6379:6379"
volumes: postgres_data:# Start development environmentdocker-compose up -d
# Connect to Django databasedbcrust docker://db
# Use with Django management commandspython manage.py dbcrust docker://db
# Connect with specific database/userdbcrust docker://django:password@db/django_db🎯 Database Type Detection
Section titled “🎯 Database Type Detection”DBCrust automatically detects database types from container images:
PostgreSQL Containers
Section titled “PostgreSQL Containers”# Detected from image namesdbcrust docker://postgres-container # postgres:*dbcrust docker://my-pg-db # *postgres*dbcrust docker://timescaledb-dev # timescale/*dbcrust docker://postgis-container # postgis/*MySQL Containers
Section titled “MySQL Containers”# Detected from image namesdbcrust docker://mysql-container # mysql:*dbcrust docker://mariadb-dev # mariadb:*dbcrust docker://percona-db # percona:*ClickHouse Containers
Section titled “ClickHouse Containers”# Detected from image namesdbcrust docker://clickhouse-container # clickhouse/*dbcrust docker://analytics-ch # *clickhouse*dbcrust docker://yandex-clickhouse # yandex/clickhouse*
# ClickHouse with credentialsdbcrust docker://user:password@clickhouse-analyticsdbcrust docker://clickhouse-analytics/analytics_db
# Special handling for CLICKHOUSE_SKIP_USER_SETUP=1dbcrust docker://clickhouse-dev # No password needed when setup is skippedSQLite in Containers
Section titled “SQLite in Containers”# For applications with SQLitedbcrust docker://app-container --sqlite-path /app/db.sqlite3🔧 Advanced Configuration
Section titled “🔧 Advanced Configuration”Container Detection Settings
Section titled “Container Detection Settings”[docker]# Enable Docker integrationenabled = true
# Docker socket path (auto-detected)socket_path = "/var/run/docker.sock"
# Container name patterns for database detectiondatabase_patterns = [ ".*postgres.*", ".*mysql.*", ".*mariadb.*", ".*clickhouse.*", ".*mongo.*", ".*redis.*"]
# Port detection timeoutdetection_timeout = 5 # seconds
# Prefer exposed ports over network resolutionprefer_exposed_ports = trueOrbStack Configuration
Section titled “OrbStack Configuration”[docker.orbstack]# Enable OrbStack DNS resolutionenabled = true
# OrbStack domain (auto-detected)domain = "orb.local"
# Custom domains (for containers with labels)custom_domains = trueNetwork Configuration
Section titled “Network Configuration”[docker.network]# Scan specific networks onlynetworks = ["bridge", "myapp-network"]
# Network detection ordernetwork_priority = ["custom", "bridge", "host"]
# Connection timeout for network resolutiontimeout = 10 # seconds🏗️ Development Workflows
Section titled “🏗️ Development Workflows”Local Development Setup
Section titled “Local Development Setup”1. Database Container Setup:
# PostgreSQL for developmentdocker run -d \ --name dev-postgres \ -p 5432:5432 \ -e POSTGRES_DB=myapp_dev \ -e POSTGRES_USER=developer \ -e POSTGRES_PASSWORD=devpass \ -v postgres_dev_data:/var/lib/postgresql/data \ postgres:15
# Connect immediatelydbcrust docker://dev-postgres2. Multi-Database Development:
# Start multiple databasesdocker run -d --name postgres-main -p 5432:5432 postgres:15docker run -d --name mysql-analytics -p 3306:3306 mysql:8.0docker run -d --name redis-cache -p 6379:6379 redis:7
# Connect to different databasesdbcrust docker://postgres-main # Main application DBdbcrust docker://mysql-analytics # Analytics DBdbcrust docker://redis-cache # Cache (if supported)Testing Workflows
Section titled “Testing Workflows”Database Testing with Containers:
#!/bin/bash# Start test databasedocker run -d \ --name test-db-$(date +%s) \ -p 5433:5432 \ -e POSTGRES_DB=test_db \ -e POSTGRES_USER=test \ -e POSTGRES_PASSWORD=test \ postgres:15
# Wait for database to be readysleep 3
# Run testsdbcrust docker://test-db-* --query "CREATE DATABASE IF NOT EXISTS test_myapp;"python -m pytest tests/
# Cleanupdocker rm -f test-db-*CI/CD Integration
Section titled “CI/CD Integration”GitHub Actions with Docker:
name: Database Testson: [push, pull_request]
jobs: test: runs-on: ubuntu-latest
services: postgres: image: postgres:15 env: POSTGRES_PASSWORD: postgres POSTGRES_DB: test_db ports: - 5432:5432 options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
steps: - uses: actions/checkout@v4
- name: Install DBCrust run: | curl -fsSL https://clement-tourriere.github.io/dbcrust/install.sh | sh
- name: Test database connection run: | # Connect to service container dbcrust postgres://postgres:postgres@localhost:5432/test_db \ --query "SELECT version();"
- name: Run database tests run: | # Use DBCrust for test queries dbcrust postgres://postgres:postgres@localhost:5432/test_db \ --query "CREATE TABLE test_users (id SERIAL PRIMARY KEY, name VARCHAR(100));"GitLab CI with Docker Compose:
test: stage: test services: - docker:dind before_script: - docker-compose up -d database - curl -fsSL https://clement-tourriere.github.io/dbcrust/install.sh | sh script: - dbcrust docker://database --query "SELECT 1;" - python -m pytest tests/ after_script: - docker-compose down🎨 Real-World Examples
Section titled “🎨 Real-World Examples”Django Project with Docker
Section titled “Django Project with Docker”Complete Django development setup:
version: '3.8'services: web: build: . command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" depends_on: - db - redis environment: - DEBUG=1 - DATABASE_URL=postgres://django:django@db:5432/django_dev
db: image: postgres:15 environment: POSTGRES_DB: django_dev POSTGRES_USER: django POSTGRES_PASSWORD: django ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data
redis: image: redis:7-alpine ports: - "6379:6379"
volumes: postgres_data:Development workflow:
# Start development environmentdocker-compose -f docker-compose.dev.yml up -d
# Database managementdbcrust docker://db # Interactive database access
# Django migrationspython manage.py migrate
# Connect DBCrust to the same database Django usespython manage.py dbcrust docker://db
# Run Django-specific queriesdbcrust docker://django:django@db/django_dev \ --query "SELECT * FROM django_migrations ORDER BY applied DESC LIMIT 10;"Microservices Architecture
Section titled “Microservices Architecture”Multi-service database setup:
version: '3.8'services: user-service-db: image: postgres:15 environment: POSTGRES_DB: users POSTGRES_USER: user_service POSTGRES_PASSWORD: userpass ports: - "5432:5432"
order-service-db: image: postgres:15 environment: POSTGRES_DB: orders POSTGRES_USER: order_service POSTGRES_PASSWORD: orderpass ports: - "5433:5432"
analytics-db: image: mysql:8.0 environment: MYSQL_DATABASE: analytics MYSQL_USER: analytics MYSQL_PASSWORD: analyticspass MYSQL_ROOT_PASSWORD: rootpass ports: - "3306:3306"
cache: image: redis:7-alpine ports: - "6379:6379"Service-specific connections:
# Connect to each service databasedbcrust docker://user-service-db # Users microservicedbcrust docker://order-service-db # Orders microservicedbcrust docker://analytics-db # Analytics database
# Cross-service queries (if needed)dbcrust docker://user_service:userpass@user-service-db/users \ --query "SELECT COUNT(*) FROM users WHERE created_at > '2024-01-01';"Data Pipeline Development
Section titled “Data Pipeline Development”ETL pipeline with multiple databases:
version: '3.8'services: source-mysql: image: mysql:8.0 environment: MYSQL_DATABASE: source_data MYSQL_USER: etl_reader MYSQL_PASSWORD: reader123 MYSQL_ROOT_PASSWORD: rootpass ports: - "3306:3306" volumes: - ./sample-data:/docker-entrypoint-initdb.d
target-postgres: image: postgres:15 environment: POSTGRES_DB: data_warehouse POSTGRES_USER: etl_writer POSTGRES_PASSWORD: writer123 ports: - "5432:5432"
analytics-postgres: image: postgres:15 environment: POSTGRES_DB: analytics POSTGRES_USER: analyst POSTGRES_PASSWORD: analyst123 ports: - "5433:5432"ETL workflow:
# Extract from sourcedbcrust docker://etl_reader:reader123@source-mysql/source_data \ --query "SELECT * FROM transactions WHERE processed_at > '2024-01-01';" \ --output json > extracted_data.json
# Transform and load (example Python script)python etl_transform.py extracted_data.json
# Verify in targetdbcrust docker://etl_writer:writer123@target-postgres/data_warehouse \ --query "SELECT COUNT(*) FROM transformed_transactions;"
# Analytics queriesdbcrust docker://analyst:analyst123@analytics-postgres/analytics \ --query "SELECT DATE(created_at), COUNT(*) FROM daily_summaries GROUP BY DATE(created_at);"ClickHouse Analytics Pipeline
Section titled “ClickHouse Analytics Pipeline”ClickHouse for real-time analytics:
version: '3.8'services: clickhouse: image: clickhouse/clickhouse-server:latest environment: CLICKHOUSE_DB: analytics CLICKHOUSE_USER: analyst CLICKHOUSE_PASSWORD: analytics123 ports: - "8123:8123" - "9000:9000" volumes: - clickhouse_data:/var/lib/clickhouse
kafka: image: confluentinc/cp-kafka:latest environment: KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092 depends_on: - zookeeper
volumes: clickhouse_data:Analytics workflow:
# Start ClickHouse analytics stackdocker-compose -f docker-compose.analytics.yml up -d
# Create analytics tablesdbcrust docker://analyst:analytics123@clickhouse/analytics \ --query "CREATE TABLE events ( event_time DateTime, user_id UInt32, event_type String, properties JSON ) ENGINE = MergeTree() ORDER BY (event_time, user_id);"
# Query real-time analyticsdbcrust docker://clickhouse/analytics \ --query "SELECT toStartOfHour(event_time) as hour, event_type, COUNT() as event_count FROM events WHERE event_time >= now() - INTERVAL 24 HOUR GROUP BY hour, event_type ORDER BY hour DESC;"
# Performance analysis with ClickHousedbcrust docker://clickhouse \ --query "SELECT quantile(0.95)(response_time) as p95_response, quantile(0.99)(response_time) as p99_response FROM api_logs WHERE timestamp >= today();"🚨 Troubleshooting
Section titled “🚨 Troubleshooting”Container Discovery Issues
Section titled “Container Discovery Issues”Container not found:
# List all running containersdocker ps --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}"
# Check container is runningdocker ps | grep postgres-dev
# Try full container name/IDdbcrust docker://$(docker ps -q --filter name=postgres-dev)Network connectivity issues:
# Test container networkdocker exec postgres-dev pg_isready
# Check exposed portsdocker port postgres-dev
# Test connection manuallytelnet localhost 5432OrbStack Issues (macOS)
Section titled “OrbStack Issues (macOS)”OrbStack DNS not resolving:
# Check OrbStack is runningorb status
# Test DNS resolutionnslookup postgres-dev.orb.local
# Check container in OrbStackorb listContainer not accessible:
# Verify OrbStack integrationorb ps
# Check container logsdocker logs postgres-dev
# Try explicit OrbStack domaindbcrust docker://postgres-dev.orb.localDocker Compose Issues
Section titled “Docker Compose Issues”Service discovery problems:
# Check compose projectdocker-compose ps
# Check networksdocker network lsdocker-compose config
# Test inter-service connectivitydocker-compose exec web ping dbPort conflicts:
# Check port usagenetstat -tulpn | grep :5432lsof -i :5432
# Use different ports in composeports: - "5433:5432" # Map to different host portPerformance Issues
Section titled “Performance Issues”Slow container detection:
[docker]detection_timeout = 10 # Increase timeoutprefer_exposed_ports = true # Use faster port detectionConnection timeouts:
[docker.network]timeout = 30 # Increase network timeout
[performance]connection_timeout = 60 # General connection timeoutDebug Mode
Section titled “Debug Mode”Enable Docker integration debugging:
# Enable debug loggingexport DBCRUST_DOCKER_DEBUG=1
# Full debug modedbcrust --debug docker://postgres-dev
# Check Docker daemon connectivitydocker versionDebug output shows:
DEBUG: Docker daemon connected successfullyDEBUG: Found 3 running containersDEBUG: Container 'postgres-dev' detected as PostgreSQLDEBUG: Port mapping: 5432/tcp -> 0.0.0.0:5433DEBUG: Connection URL: postgres://postgres@localhost:5433/postgres🛡️ Security Considerations
Section titled “🛡️ Security Considerations”Container Security
Section titled “Container Security”# Use non-root containersdocker run -d --name postgres-dev --user postgres postgres:15
# Limit container resourcesdocker run -d --name postgres-dev --memory 512m --cpus 1.0 postgres:15
# Use security scanningdocker scout cves postgres:15Network Security
Section titled “Network Security”[docker.network]# Only connect to specific networksnetworks = ["trusted-network"]
# Disable automatic network scanningauto_discover = falseCredential Security
Section titled “Credential Security”# Use environment files for secretsecho "POSTGRES_PASSWORD=secret123" > .env.secret
# Mount as volume instead of environment variabledocker run -d \ --name postgres-dev \ -v "$(pwd)/.env.secret:/etc/postgresql/.env" \ postgres:15📚 See Also
Section titled “📚 See Also”- SSH Tunneling - Secure database connections
- Vault Integration - Dynamic credentials
- Security Guide - Complete security practices
- URL Schemes - All connection methods