version: '3.8' services: # PostgreSQL 数据库 postgres: image: postgres:16 container_name: wm-postgres environment: POSTGRES_DB: water_management POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./initdb:/docker-entrypoint-initdb.d networks: - water-management-net # TDengine 时序数据库 tdengine: image: tdengine/tdengine:3.5.0 container_name: wm-tdengine environment: TDENGINE_USER: root TDENGINE_PASSWORD: taosdata ports: - "6030:6030" - "6041:6041" volumes: - tdengine_data:/var/lib/tdengine networks: - water-management-net # Redis 缓存 redis: image: redis:7-alpine container_name: wm-redis ports: - "6379:6379" volumes: - redis_data:/data networks: - water-management-net command: redis-server --requirepass redis123 # Redis 可视化管理工具 redis-commander: image: rediscommander/redis-commander:latest container_name: wm-redis-commander environment: REDIS_HOSTS: local:redis:6379:redis123 ports: - "8081:8081" depends_on: - redis networks: - water-management-net # Kafka 消息队列 zookeeper: image: confluentinc/cp-zookeeper:7.4.0 container_name: wm-zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 networks: - water-management-net kafka: image: confluentinc/cp-kafka:7.4.0 container_name: wm-kafka depends_on: - zookeeper ports: - "9092:9092" environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 volumes: - kafka_data:/var/lib/kafka networks: - water-management-net # Elasticsearch 搜索引擎 elasticsearch: image: elasticsearch:8.11.0 container_name: wm-elasticsearch environment: - discovery.type=single-node - xpack.security.enabled=false - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ports: - "9200:9200" - "9300:9300" volumes: - elasticsearch_data:/usr/share/elasticsearch/data networks: - water-management-net # Kibana 可视化工具 kibana: image: kibana:8.11.0 container_name: wm-kibana ports: - "5601:5601" depends_on: - elasticsearch environment: - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 networks: - water-management-net # MinIO 对象存储 minio: image: minio/minio:latest container_name: wm-minio ports: - "9000:9000" - "9001:9001" volumes: - minio_data:/data environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin123 command: server /data --console-address ":9001" networks: - water-management-net # EMQX MQTT 消息服务器 emqx: image: emqx:5.3.1 container_name: wm-emqx ports: - "1883:1883" - "8083:8083" - "8084:8084" - "8883:8883" - "18083:18083" volumes: - emqx_data:/opt/emqx/data networks: - water-management-net # Nacos 服务注册与配置中心 nacos: image: nacos/nacos-server:2.2.3 container_name: wm-nacos environment: MODE: standalone SPRING_DATASOURCE_PLATFORM: mysql MYSQL_SERVICE_HOST: mysql MYSQL_SERVICE_PORT: 3306 MYSQL_SERVICE_DB_NAME: nacos_config MYSQL_SERVICE_USER: nacos MYSQL_SERVICE_PASSWORD: nacos NACOS_SERVERS: "127.0.0.1:8848" ports: - "8848:8848" - "9848:9848" depends_on: - mysql volumes: - nacos_data:/home/nacos/data networks: - water-management-net # Nacos 数据库 mysql: image: mysql:8.0 container_name: wm-mysql environment: MYSQL_DATABASE: nacos_config MYSQL_USER: nacos MYSQL_PASSWORD: nacos MYSQL_ROOT_PASSWORD: root ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql networks: - water-management-net # GeoServer GIS 服务 geoserver: image: geoserver:latest container_name: wm-geoserver ports: - "8082:8080" volumes: - geoserver_data:/opt/geoserver/data_dir networks: - water-management-net # Prometheus 监控系统 prometheus: image: prom/prometheus:latest container_name: wm-prometheus ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' - '--web.enable-lifecycle' networks: - water-management-net # Grafana 可视化监控 grafana: image: grafana/grafana:latest container_name: wm-grafana ports: - "3000:3000" environment: GF_SECURITY_ADMIN_PASSWORD: admin123 volumes: - grafana_data:/var/lib/grafana networks: - water-management-net # SkyWalking 分布式追踪系统 skywalking-oap: image: apache/skywalking-oap-server:9.4.0 container_name: wm-skywalking-oap environment: SW_OAP_STORAGE_MODE: elasticsearch SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200 SW_STORAGE_ES_INDEX_PREFIX: skywalking-oap SW_STORAGE_ES_USER: elastic SW_STORAGE_ES_PASSWORD: changeme SW_HEALTH_CHECK_FILE: /tmp/health depends_on: - elasticsearch ports: - "1234:1234" - "1234:1234/udp" volumes: - skywalking_oap_data:/skywalking/oap/data networks: - water-management-net skywalking-ui: image: apache/skywalking-ui:9.4.0 container_name: wm-skywalking-ui environment: SW_OAP_ADDRESS: skywalking-oap:1234 depends_on: - skywalking-oap ports: - "8080:8080" networks: - water-management-net volumes: postgres_data: tdengine_data: redis_data: kafka_data: elasticsearch_data: minio_data: emqx_data: nacos_data: mysql_data: geoserver_data: prometheus_data: grafana_data: skywalking_oap_data: networks: water-management-net: driver: bridge