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/mysql,influx_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=podman 和 alias docker-compose=podman-compose 以兼容命令。
步驟 1: 準備環境
- 創建 .env 文件(可選,但推薦,用於注入敏感變量):
- 在
docker-compose.yml同目錄創建.env文件:
OPENAI_API_KEY=your_openai_api_key_here
- 這會自動注入到
predict-service的環境變量中。替換為您的實際 OpenAI API 密鑰。
- 準備自定義文件:
- 創建
mosquitto.conf(MQTT 配置):在當前目錄添加文件,示例內容(簡單無認證):
listener 1883
allow_anonymous true
- 確保本地目錄
./gateway、./device-service等存在 Dockerfile 和源代碼(用於build)。
- 檢查端口衝突:
- 主機端口 80、3306、8080-8086、9092、1883、2181 已佔用?用
netstat -tlnp | grep :80檢查並釋放。
步驟 2: 啓動系統
- 進入項目目錄:
cd /path/to/your/project # docker-compose.yml 所在目錄
- 構建並啓動(後台模式):
docker-compose up --build -d
--build:構建自定義鏡像(gateway 等服務)。-d:後台運行(detached)。- 首次運行需下載鏡像(如 mysql:8.0),可能需幾分鐘。日誌:
docker-compose logs -f查看實時輸出。
- 驗證啓動:
docker-compose ps # 查看服務狀態,應全 Up
docker logs mes-mysql # 檢查特定服務日誌
步驟 3: 使用系統
- 訪問前端:瀏覽器打開
http://localhost或http://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 增強)。