Docker Compose 文件解释

这是一个 Docker Compose 配置文件(通常命名为 docker-compose.yml),用于定义和编排一个多容器 Docker 应用。它允许您通过一个 YAML 文件启动和管理多个 Docker 容器,形成一个完整的系统栈。文件版本为 3.8,支持 Docker Compose v1.27+ 或 v2.x。

这个文件描述了一个 MES(Manufacturing Execution System,制造执行系统) 的后端基础设施,包括数据库、消息队列、MQTT 经纪人、多个微服务和前端应用。系统设计用于工业场景,如设备管理、生产跟踪、数据预测等。整体启动命令:docker-compose up -d(后台运行)。

以下是文件逐部分的详细解释:

1. 版本声明
version: '3.8'
  • 解释:指定 Docker Compose 文件格式版本。‘3.8’ 是 Compose v3 系列的一个子版本,支持高级功能如扩展资源限制、secrets 等。它兼容 Docker Engine 19.03+。版本越高,功能越丰富,但需确保您的 Docker 版本匹配。
2. Services(服务)部分

这是文件核心,定义了 8 个服务(容器)。每个服务基于 Docker 镜像运行,可配置环境变量、端口映射、卷挂载、依赖关系等。服务间通过内部网络通信(默认桥接网络)。

  • mysql(MySQL 数据库):

    mysql:
      image: mysql:8.0
      container_name: mes-mysql
      environment:
        MYSQL_ROOT_PASSWORD: password
        MYSQL_DATABASE: mes_db
      ports:
        - "3306:3306"
      volumes:
        - mysql_data:/var/lib/mysql
    
    • 解释:使用官方 MySQL 8.0 镜像。容器名为 mes-mysql。环境变量设置 root 密码为 “password”,并创建名为 mes_db 的数据库。端口 3306 映射到主机(外部可访问)。卷 mysql_data 持久化数据到主机,避免容器重启丢失。用于存储 MES 的结构化数据(如设备记录、生产订单)。
  • influxdb(InfluxDB 时序数据库):

    influxdb:
      image: influxdb:2.7
      container_name: mes-influx
      ports:
        - "8086:8086"
      environment:
        DOCKER_INFLUXDB_INIT_MODE: setup
        DOCKER_INFLUXDB_INIT_USERNAME: admin
        DOCKER_INFLUXDB_INIT_PASSWORD: password
        DOCKER_INFLUXDB_INIT_ORG: mes
        DOCKER_INFLUXDB_INIT_BUCKET: mes_metrics
      volumes:
        - influx_data:/var/lib/influxdb2
    
    • 解释:使用 InfluxDB 2.7 镜像(时序数据存储,适合指标/日志)。端口 8086 映射主机。环境变量初始化管理员账户(用户名 admin,密码 password)、组织 mes 和桶 mes_metrics(用于存储指标数据)。卷 influx_data 持久化数据。MES 中用于存储实时传感器数据、性能指标等。
  • zookeeper(ZooKeeper 协调服务):

    zookeeper:
      image: confluentinc/cp-zookeeper:7.5.0
      container_name: mes-zookeeper
      ports:
        - "2181:2181"
      environment:
        ZOOKEEPER_CLIENT_PORT: 2181
    
    • 解释:Confluent 的 ZooKeeper 7.5.0 镜像,用于分布式协调(如 Kafka 的元数据管理)。端口 2181 映射主机。环境变量指定客户端端口。MES 中作为 Kafka 的依赖,用于集群管理。
  • kafka(Kafka 消息队列):

    kafka:
      image: confluentinc/cp-kafka:7.5.0
      container_name: mes-kafka
      ports:
        - "9092:9092"
      environment:
        KAFKA_BROKER_ID: 1
        KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
        KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      depends_on:
        - zookeeper
    
    • 解释:Confluent Kafka 7.5.0 镜像,用于异步消息传递。端口 9092 映射主机。环境变量配置代理 ID 为 1、连接 ZooKeeper,并暴露监听器(PLAINTEXT 表示无加密)。depends_on 确保 ZooKeeper 先启动。MES 中用于生产事件流、日志聚合等。
  • mosquitto(MQTT 经纪人):

    mosquitto:
      image: eclipse-mosquitto:2.0
      container_name: mes-mqtt
      ports:
        - "1883:1883"
      volumes:
        - ./mosquitto.conf:/mosquitto/config/mosquitto.conf
    
    • 解释:Eclipse Mosquitto 2.0 镜像(MQTT 协议经纪人,用于 IoT/设备通信)。端口 1883 映射主机。卷挂载本地 mosquitto.conf 文件(自定义配置,如认证/ACL)。MES 中用于设备实时数据传输(如传感器上报)。
  • gateway(API 网关):

    gateway:
      build: ./gateway
      ports:
        - "8080:8080"
      depends_on:
        - device-service
        - production-service
        - trace-service
        - predict-service
    
    • 解释:从本地 ./gateway 目录构建自定义镜像(需 Dockerfile)。端口 8080 映射主机。依赖其他后端服务(确保它们先启动)。作为入口,路由请求到微服务。
  • device-service(设备服务):

    device-service:
      build: ./device-service
      ports:
        - "8081:8081"
      depends_on:
        - mysql
        - influxdb
        - mosquitto
    
    • 解释:从 ./device-service 构建自定义镜像。端口 8081。依赖 MySQL、InfluxDB 和 MQTT,用于设备管理(如注册、监控)。
  • production-service(生产服务):

    production-service:
      build: ./production-service
      ports:
        - "8082:8082"
      depends_on:
        - mysql
        - kafka
    
    • 解释:从 ./production-service 构建。端口 8082。依赖 MySQL 和 Kafka,用于生产流程管理(如订单执行、事件处理)。
  • trace-service(跟踪服务):

    trace-service:
      build: ./trace-service
      ports:
        - "8083:8083"
      depends_on:
        - mysql
        - kafka
    
    • 解释:从 ./trace-service 构建。端口 8083。依赖 MySQL 和 Kafka,用于生产跟踪/追溯(如日志链)。
  • predict-service(预测服务):

    predict-service:
      build: ./predict-service
      ports:
        - "8084:8084"
      environment:
        OPENAI_API_KEY: ${OPENAI_API_KEY}
    
    • 解释:从 ./predict-service 构建。端口 8084。环境变量从主机 .env 文件注入 OpenAI API 密钥(用于 AI 预测,如故障预测)。无依赖,独立运行。
  • mes-frontend(前端应用):

    mes-frontend:
      build: ./mes-frontend
      ports:
        - "80:80"
      depends_on:
        - gateway
    
    • 解释:从 ./mes-frontend 构建(可能是 React/Vue 等 Web 应用)。端口 80 映射主机(HTTP 访问)。依赖网关,用于 UI 界面(如仪表盘)。
3. Volumes(卷)部分
volumes:
  mysql_data:
  influx_data:
  • 解释:定义命名卷(named volumes),用于持久化数据。mysql_data 挂载到 MySQL 的 /var/lib/mysqlinflux_data 挂载到 InfluxDB 的 /var/lib/influxdb2。这些卷由 Docker 管理,数据存储在主机 /var/lib/docker/volumes/ 下,重启容器不会丢失。

整体系统架构

  • 功能:这是一个 MES 微服务架构。数据流:设备通过 MQTT 上传数据 → InfluxDB 存储时序指标 → Kafka 处理事件 → MySQL 持久化业务数据 → 后端服务(device/production/trace/predict)处理逻辑 → 网关路由 → 前端展示。预测服务集成 OpenAI API,可能用于 AI 分析。
  • 启动顺序depends_on 确保依赖服务先运行(如 Kafka 依赖 ZooKeeper)。
  • 安全性:密码硬编码(password)不安全,生产环境用 secrets 或 .env 文件。端口暴露主机,需防火墙保护。
  • 扩展:运行 docker-compose up --build 构建自定义镜像;docker-compose down -v 停止并删除卷(小心数据丢失)。

配置 Docker Compose 文件后如何使用

配置好 docker-compose.yml 文件后,您可以使用 Docker Compose 命令来启动、管理和停止整个 MES 系统栈。以下是详细步骤。前提:确保已安装 Docker 和 Docker Compose(CentOS 7 上用 Podman 兼容 docker-compose,或安装 docker-compose 工具)。如果用 Podman,运行 alias docker=podmanalias docker-compose=podman-compose 以兼容命令。

步骤 1: 准备环境
  1. 创建 .env 文件(可选,但推荐,用于注入敏感变量):

    • docker-compose.yml 同目录创建 .env 文件:
      OPENAI_API_KEY=your_openai_api_key_here
      
      • 这会自动注入到 predict-service 的环境变量中。替换为您的实际 OpenAI API 密钥。
  2. 准备自定义文件

    • 创建 mosquitto.conf(MQTT 配置):在当前目录添加文件,示例内容(简单无认证):
      listener 1883
      allow_anonymous true
      
    • 确保本地目录 ./gateway./device-service 等存在 Dockerfile 和源代码(用于 build)。
  3. 检查端口冲突

    • 主机端口 80、3306、8080-8086、9092、1883、2181 已占用?用 netstat -tlnp | grep :80 检查并释放。
步骤 2: 启动系统
  1. 进入项目目录

    cd /path/to/your/project  # docker-compose.yml 所在目录
    
  2. 构建并启动(后台模式)

    docker-compose up --build -d
    
    • --build:构建自定义镜像(gateway 等服务)。
    • -d:后台运行(detached)。
    • 首次运行需下载镜像(如 mysql:8.0),可能需几分钟。日志:docker-compose logs -f 查看实时输出。
  3. 验证启动

    docker-compose ps  # 查看服务状态,应全 Up
    docker logs mes-mysql  # 检查特定服务日志
    
步骤 3: 使用系统
  • 访问前端:浏览器打开 http://localhosthttp://your-vm-ip(端口 80)。前端(mes-frontend)通过网关访问后端。
  • 测试数据库
    • MySQL:用工具如 MySQL Workbench 连接 localhost:3306,用户 root/密码 password,数据库 mes_db。
    • InfluxDB:浏览器 http://localhost:8086,登录 admin/password,查看 mes_metrics 桶。
  • 测试消息队列
    • Kafka:用 Kafka 工具连接 localhost:9092,主题测试生产/消费。
    • MQTT:用 MQTT 客户端(如 mosquitto_sub)连接 localhost:1883 测试发布/订阅。
  • 测试微服务
    • 设备服务:curl http://localhost:8081/health(假设有健康检查端点)。
    • 预测服务:通过网关调用,需 OpenAI 密钥有效。
  • 监控:用 docker-compose logs -f gateway 查看网关日志。
步骤 4: 管理与停止
  • 停止系统
    docker-compose down  # 停止容器
    docker-compose down -v  # 停止并删除卷(数据丢失,慎用)
    
  • 重启服务
    docker-compose restart mysql  # 重启特定服务
    
  • 更新配置:修改 yml 后 docker-compose up --build -d 重建。
  • 扩展:添加网络 networks: default: driver: bridge 或 secrets 提升安全。
注意事项
  • 安全性:密码 “password” 仅测试用,生产改强密码,用 Docker Secrets。暴露端口需防火墙(如 firewall-cmd --add-port=80/tcp --permanent)。
  • 资源:MES 栈资源密集(MySQL/Kafka),确保 VM 有 4GB+ RAM、2+ CPU。
  • CentOS 7 问题:如果用 Podman,确保 subuid 配置(之前步骤)。系统 EOL,建议迁移 AlmaLinux 9。
  • 调试:错误常见于镜像下载失败(网络问题)或依赖未启动(depends_on 只保证顺序,不等就绪,用 healthcheck 增强)。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐