Docker——一篇文章带你配置docker compose并使用
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 的结构化数据(如设备记录、生产订单)。
- 解释:使用官方 MySQL 8.0 镜像。容器名为
-
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 中用于存储实时传感器数据、性能指标等。
- 解释:使用 InfluxDB 2.7 镜像(时序数据存储,适合指标/日志)。端口 8086 映射主机。环境变量初始化管理员账户(用户名 admin,密码 password)、组织
-
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 中用于生产事件流、日志聚合等。
- 解释:Confluent Kafka 7.5.0 镜像,用于异步消息传递。端口 9092 映射主机。环境变量配置代理 ID 为 1、连接 ZooKeeper,并暴露监听器(PLAINTEXT 表示无加密)。
-
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 中用于设备实时数据传输(如传感器上报)。
- 解释:Eclipse Mosquitto 2.0 镜像(MQTT 协议经纪人,用于 IoT/设备通信)。端口 1883 映射主机。卷挂载本地
-
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检查并释放。
- 主机端口 80、3306、8080-8086、9092、1883、2181 已占用?用
步骤 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 桶。
- MySQL:用工具如 MySQL Workbench 连接
- 测试消息队列:
- 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 增强)。
更多推荐
所有评论(0)