version: '3.8' services: # Zookeeper - Kafka依赖 zookeeper: image: confluentinc/cp-zookeeper:7.4.0 container_name: etl-zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 ports: - "2181:2181" volumes: - zookeeper-data:/var/lib/zookeeper/data - zookeeper-log:/var/lib/zookeeper/log networks: - etl-network # Kafka - 消息队列 kafka: image: confluentinc/cp-kafka:7.4.0 container_name: etl-kafka depends_on: - zookeeper ports: - "9092:9092" - "29092:29092" environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: etl-zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://etl-kafka:9092,PLAINTEXT_HOST://localhost:29092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_AUTO_CREATE_TOPICS_ENABLE: true KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 volumes: - kafka-data:/var/lib/kafka/data networks: - etl-network # MySQL - 数据库 mysql: image: mysql:8.0.33 container_name: etl-mysql environment: MYSQL_ROOT_PASSWORD: water123 MYSQL_DATABASE: water_etl MYSQL_USER: etl_user MYSQL_PASSWORD: etl_password ports: - "3306:3306" volumes: - mysql-data:/var/lib/mysql - ./src/main/resources/schema.sql:/docker-entrypoint-initdb.d/schema.sql networks: - etl-network command: --default-authentication-plugin=mysql_native_password # Redis - 缓存 redis: image: redis:7-alpine container_name: etl-redis ports: - "6379:6379" volumes: - redis-data:/data networks: - etl-network # ETL应用 etl-app: build: . container_name: etl-application depends_on: - mysql - kafka - redis ports: - "8080:8080" environment: SPRING_PROFILES_ACTIVE: docker SPRING_DATASOURCE_URL: jdbc:mysql://etl-mysql:3306/water_etl?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai SPRING_DATASOURCE_USERNAME: etl_user SPRING_DATASOURCE_PASSWORD: etl_password SPRING_DATASOURCE_DRIVER_CLASS_NAME: com.mysql.cj.jdbc.Driver KAFKA_BOOTSTRAP_SERVERS: etl-kafka:9092 volumes: - ./logs:/app/logs - ./run_etl.sh:/app/run_etl.sh working_dir: /app networks: - etl-network entrypoint: ["/app/run_etl.sh", "start"] volumes: zookeeper-data: zookeeper-log: kafka-data: mysql-data: redis-data: networks: etl-network: driver: bridge