version: '3.8' services: # ==================== 基础设施 ==================== postgres: image: postgis/postgis:16-3.4 container_name: wm-postgres environment: POSTGRES_DB: water_management POSTGRES_USER: water POSTGRES_PASSWORD: water123 ports: - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U water"] interval: 10s timeout: 5s retries: 5 tdengine: image: tdengine/tdengine:3.3.3.0 container_name: wm-tdengine ports: - "6030:6030" - "6041:6041" - "6043:6043" environment: TAOS_FQDN: tdengine volumes: - tddata:/var/lib/taos healthcheck: test: ["CMD", "taos", "-s", "show databases"] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine container_name: wm-redis ports: - "6379:6379" volumes: - redisdata:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 5 # ==================== 消息队列 ==================== kafka: image: bitnami/kafka:3.8 container_name: wm-kafka ports: - "9092:9092" environment: KAFKA_CFG_NODE_ID: 0 KAFKA_CFG_PROCESS_ROLES: controller,broker KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 0@kafka:9093 KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093 KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://${KAFKA_ADVERTISED:-localhost}:9092 KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: "true" volumes: - kafkadata:/bitnami/kafka healthcheck: test: ["CMD-SHELL", "kafka-topics.sh --bootstrap-server localhost:9092 --list"] interval: 15s timeout: 10s retries: 5 # ==================== 物联网 MQTT ==================== emqx: image: emqx/emqx:5.7.2 container_name: wm-emqx ports: - "1883:1883" - "8083:8083" - "18083:18083" environment: EMQX_DASHBOARD__DEFAULT_USERNAME: admin EMQX_DASHBOARD__DEFAULT_PASSWORD: public volumes: - emqxdata:/opt/emqx/data healthcheck: test: ["CMD", "emqx", "ping"] interval: 10s timeout: 5s retries: 5 # ==================== 服务注册/配置 ==================== nacos: image: nacos/nacos-server:v2.3.2 container_name: wm-nacos environment: MODE: standalone PREFER_HOST_MODE: hostname ports: - "8848:8848" - "9848:9848" volumes: - nacosdata:/home/nacos/data healthcheck: test: ["CMD-SHELL", "curl -s http://localhost:8848/nacos/v1/console/health/readiness"] interval: 15s timeout: 5s retries: 5 # ==================== 搜索引擎 ==================== elasticsearch: image: elasticsearch:8.15.0 container_name: wm-es environment: discovery.type: single-node xpack.security.enabled: "false" "ES_JAVA_OPTS": "-Xms512m -Xmx512m" ports: - "9200:9200" volumes: - esdata:/usr/share/elasticsearch/data kibana: image: kibana:8.15.0 container_name: wm-kibana ports: - "5601:5601" environment: ELASTICSEARCH_HOSTS: http://elasticsearch:9200 depends_on: - elasticsearch # ==================== 对象存储 ==================== minio: image: minio/minio:latest container_name: wm-minio ports: - "9000:9000" - "9001:9001" environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin volumes: - miniodata:/data command: server /data --console-address ":9001" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 10s timeout: 5s retries: 5 # ==================== GIS 地图服务 ==================== geoserver: image: docker.osgeo.org/geoserver:2.25.2 container_name: wm-geoserver ports: - "8081:8080" environment: INSTALL_EXTENSIONS: "true" STABLE_EXTENSIONS: "wps,csw" GEOSERVER_ADMIN_USER: admin GEOSERVER_ADMIN_PASSWORD: geoserver volumes: - geoserverdata:/opt/geoserver_data profiles: - gis healthcheck: test: ["CMD-SHELL", "curl -s http://localhost:8080/geoserver/web/"] interval: 20s timeout: 10s retries: 3 volumes: pgdata: tddata: redisdata: kafkadata: emqxdata: nacosdata: esdata: miniodata: geoserverdata: