services: # Redis - Always included for caching and sessions redis: image: redis:7.2-alpine container_name: netcorepal-redis ports: - "6379:6379" volumes: - redis_data:/data command: redis-server --appendonly yes --databases 1024 restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 3 # MySQL Database (default option) mysql: image: mysql:8.0 container_name: netcorepal-mysql ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_CHARACTER_SET_SERVER: utf8mb4 MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci TZ: Asia/Shanghai volumes: - mysql_data:/var/lib/mysql - ./mysql-init:/docker-entrypoint-initdb.d:ro restart: unless-stopped healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p123456"] interval: 10s timeout: 5s retries: 5 # SQL Server (alternative database option) sqlserver: image: mcr.microsoft.com/mssql/server:2022-latest container_name: netcorepal-sqlserver ports: - "1433:1433" environment: ACCEPT_EULA: Y MSSQL_SA_PASSWORD: Test123456! TZ: Asia/Shanghai volumes: - sqlserver_data:/var/opt/mssql restart: unless-stopped profiles: - sqlserver healthcheck: test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Test123456! -Q 'SELECT 1'"] interval: 10s timeout: 5s retries: 5 # PostgreSQL (alternative database option) postgres: image: postgres:15-alpine container_name: netcorepal-postgres ports: - "5432:5432" environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: 123456 POSTGRES_DB: postgres TZ: Asia/Shanghai volumes: - postgres_data:/var/lib/postgresql/data - ./postgres-init:/docker-entrypoint-initdb.d:ro restart: unless-stopped profiles: - postgres healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 3 # RabbitMQ (default message queue option) rabbitmq: image: rabbitmq:3.12-management-alpine container_name: netcorepal-rabbitmq ports: - "5672:5672" - "15672:15672" environment: RABBITMQ_DEFAULT_USER: guest RABBITMQ_DEFAULT_PASS: guest volumes: - rabbitmq_data:/var/lib/rabbitmq restart: unless-stopped healthcheck: test: ["CMD", "rabbitmq-diagnostics", "ping"] interval: 10s timeout: 5s retries: 3 # Kafka (alternative message queue option) zookeeper: image: confluentinc/cp-zookeeper:7.4.0 container_name: netcorepal-zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 volumes: - zookeeper_data:/var/lib/zookeeper/data - zookeeper_logs:/var/lib/zookeeper/log restart: unless-stopped profiles: - kafka kafka: image: confluentinc/cp-kafka:7.4.0 container_name: netcorepal-kafka depends_on: - zookeeper ports: - "9092:9092" environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true' volumes: - kafka_data:/var/lib/kafka/data restart: unless-stopped profiles: - kafka healthcheck: test: ["CMD-SHELL", "kafka-broker-api-versions --bootstrap-server localhost:9092"] interval: 10s timeout: 5s retries: 5 # Kafka UI (optional management interface) kafka-ui: image: provectuslabs/kafka-ui:latest container_name: netcorepal-kafka-ui depends_on: - kafka ports: - "8080:8080" environment: KAFKA_CLUSTERS_0_NAME: local KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092 restart: unless-stopped profiles: - kafka volumes: redis_data: mysql_data: sqlserver_data: postgres_data: rabbitmq_data: zookeeper_data: zookeeper_logs: kafka_data: networks: default: name: netcorepal-network