version: '3.8' services: # MySQL数据库 mysql: image: mysql:8.0 container_name: news-classifier-mysql restart: always ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: news_classifier TZ: Asia/Shanghai volumes: - mysql-data:/var/lib/mysql - ../docs/schema.sql:/docker-entrypoint-initdb.d/schema.sql command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci networks: - news-classifier-network # Redis缓存 redis: image: redis:7-alpine container_name: news-classifier-redis restart: always ports: - "6379:6379" volumes: - redis-data:/data command: redis-server --appendonly yes networks: - news-classifier-network # Elasticsearch (可选 - 全文检索) elasticsearch: image: elasticsearch:8.11.0 container_name: news-classifier-elasticsearch restart: always ports: - "9200:9200" - "9300:9300" environment: - discovery.type=single-node - xpack.security.enabled=false - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - es-data:/usr/share/elasticsearch/data networks: - news-classifier-network # 后端服务 backend: build: context: ../backend dockerfile: Dockerfile container_name: news-classifier-backend restart: always ports: - "8080:8080" environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/news_classifier?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: root SPRING_DATA_REDIS_HOST: redis SPRING_DATA_REDIS_PORT: 6379 depends_on: - mysql - redis networks: - news-classifier-network volumes: mysql-data: driver: local redis-data: driver: local es-data: driver: local networks: news-classifier-network: driver: bridge