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 密鑰。
  1. 準備自定義文件
  • 創建 mosquitto.conf(MQTT 配置):在當前目錄添加文件,示例內容(簡單無認證):
listener 1883
allow_anonymous true
  • 確保本地目錄 ./gateway./device-service 等存在 Dockerfile 和源代碼(用於 build)。
  1. 檢查端口衝突
  • 主機端口 80、3306、8080-8086、9092、1883、2181 已佔用?用 netstat -tlnp | grep :80 檢查並釋放。
步驟 2: 啓動系統
  1. 進入項目目錄
cd /path/to/your/project  # docker-compose.yml 所在目錄
  1. 構建並啓動(後台模式)
docker-compose up --build -d
  • --build:構建自定義鏡像(gateway 等服務)。
  • -d:後台運行(detached)。
  • 首次運行需下載鏡像(如 mysql:8.0),可能需幾分鐘。日誌:docker-compose logs -f 查看實時輸出。
  1. 驗證啓動
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 增強)。