Docker Compose 编排 IoT 栈
Docker Compose 编排 IoT 栈
本节介绍如何使用 Docker Compose 编排完整的 IoT 技术栈。学习完成后,您将能够:
- 理解 Docker Compose 的作用和工作原理
- 编写 docker-compose.yml 文件编排多容器服务
- 向客户解释 Docker Compose 在 IoT 架构中的价值
- 能够配合客户需求调整服务配置
什么是 Docker Compose?
Section titled “什么是 Docker Compose?”Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过一个 YAML 配置文件,可以一次性启动整个 IoT 技术栈。
核心价值:
| 特性 | 说明 | 售前价值 |
|---|---|---|
| 声明式配置 | 用 YAML 文件定义所有服务 | 可版本控制、可复现 |
| 一键部署 | docker-compose up -d 启动全部服务 | 演示环境 5 分钟搭建 |
| 服务编排 | 自动处理依赖关系和启动顺序 | 减少人工配置错误 |
| 网络管理 | 自动创建隔离网络 | 服务间通信开箱即用 |
| 环境一致性 | 开发/测试/生产使用相同配置 | 消除环境差异问题 |
Docker Compose vs Docker Run
Section titled “Docker Compose vs Docker Run”| 对比维度 | Docker Run | Docker Compose |
|---|---|---|
| 管理方式 | 单容器手动管理 | 多容器统一管理 |
| 配置文件 | 无(命令行参数) | YAML 配置文件 |
| 可复现性 | 差(需记录命令) | 好(配置文件可共享) |
| 服务依赖 | 手动处理 | 自动处理 |
| 网络配置 | 手动创建网络 | 自动创建网络 |
| 扩展性 | 启动多个容器 | 支持 --scale 扩展 |
IoT Stack with Docker Compose
Section titled “IoT Stack with Docker Compose”完整 IoT 技术栈配置
Section titled “完整 IoT 技术栈配置”version: '3.8'
services: # MQTT 消息代理 mosquitto: image: eclipse-mosquitto:2 container_name: mosquitto restart: unless-stopped ports: - "1883:1883" # MQTT 默认端口 - "9001:9001" # WebSocket 端口 volumes: - ./mosquitto/config:/mosquitto/config - ./mosquitto/data:/mosquitto/data - ./mosquitto/log:/mosquitto/log
# 自动化引擎 nodered: image: nodered/node-red:latest container_name: nodered restart: unless-stopped ports: - "1880:1880" volumes: - ./nodered/data:/data environment: - TZ=Asia/Shanghai depends_on: - mosquitto
# 时序数据库 influxdb: image: influxdb:2 container_name: influxdb restart: unless-stopped ports: - "8086:8086" volumes: - ./influxdb/data:/var/lib/influxdb2 - ./influxdb/config:/etc/influxdb2
# 数据可视化 grafana: image: grafana/grafana:latest container_name: grafana restart: unless-stopped ports: - "3000:3000" volumes: - ./grafana/data:/var/lib/grafana depends_on: - influxdb
# 容器管理(可选) portainer: image: portainer/portainer-ce:latest container_name: portainer restart: unless-stopped ports: - "9000:9000" volumes: - /var/run/docker.sock:/var/run/docker.sock - ./portainer/data:/data
networks: default: name: iot-network driver: bridgeMosquitto:
- 端口 1883 用于标准 MQTT 通信
- 端口 9001 用于 MQTT over WebSocket
- 配置文件映射到宿主机以便持久化
Node-RED:
- 端口 1880 提供 Web 编辑界面
- 数据卷映射确保 Flow 持久化
- 时区环境变量确保时间正确
- 依赖 Mosquitto 先启动
InfluxDB:
- 端口 8086 提供 HTTP API
- 数据目录映射实现持久化
- 支持通过 Web UI 初始化
Grafana:
- 端口 3000 提供仪表板界面
- 数据目录映射持久化仪表板配置
- 依赖 InfluxDB 先启动
Portainer:
- 端口 9000 提供容器管理界面
- 挂载 Docker Socket 实现管理能力
Service Dependencies
Section titled “Service Dependencies”┌─────────────────────────────────────────┐│ IoT Network │├─────────────────────────────────────────┤│ ││ Portainer ──── 管理所有容器 ││ ││ Mosquitto ──── MQTT 消息中枢 ││ ↑ ││ Node-RED ──── 订阅/发布 MQTT 消息 ││ ↓ ││ InfluxDB ──── 存储时序数据 ││ ↓ ││ Grafana ───── 可视化 InfluxDB 数据 ││ │└─────────────────────────────────────────┘Common Operations
Section titled “Common Operations”启动所有服务
Section titled “启动所有服务”# 启动所有服务(后台运行)docker-compose up -d
# 启动特定服务docker-compose up -d mosquitto nodered
# 查看启动日志docker-compose logs -f# 停止所有服务docker-compose stop
# 停止特定服务docker-compose stop nodered
# 重启所有服务docker-compose restart
# 停止并删除容器docker-compose down# 查看所有服务状态docker-compose ps
# 预期输出:# NAME STATUS PORTS# mosquitto Up 2 minutes 0.0.0.0:1883->1883/tcp# nodered Up 2 minutes 0.0.0.0:1880->1880/tcp# influxdb Up 2 minutes 0.0.0.0:8086->8086/tcp# grafana Up 2 minutes 0.0.0.0:3000->3000/tcp# portainer Up 2 minutes 0.0.0.0:9000->9000/tcp
# 查看服务日志docker-compose logs mosquitto
# 实时日志docker-compose logs -f noderedAdvanced Configuration
Section titled “Advanced Configuration”services: nodered: image: nodered/node-red:latest deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.25' memory: 256Mservices: mosquitto: image: eclipse-mosquitto:2 healthcheck: test: ["CMD", "mosquitto_sub", "-t", "$$SYS/broker/uptime", "-C", "1"] interval: 30s timeout: 10s retries: 3 start_period: 10snetworks: iot-network: driver: bridge ipam: config: - subnet: 172.20.0.0/16 gateway: 172.20.0.1
services: mosquitto: networks: iot-network: ipv4_address: 172.20.0.10✅ 推荐做法:
- 使用固定版本标签而非
latest - 为每个服务配置资源限制
- 使用独立的 Docker 网络
- 配置健康检查和重启策略
- 将配置文件纳入版本控制
❌ 避免做法:
- 多个 Compose 文件端口冲突
- 忽略
depends_on依赖顺序 - 暴露不必要的端口到宿主机
- 使用 root 用户运行容器
- 不配置日志轮转
Common Customer Questions
Section titled “Common Customer Questions”Q1: Docker Compose 和 Kubernetes 什么区别?
Section titled “Q1: Docker Compose 和 Kubernetes 什么区别?”A: Docker Compose 适用于单主机场景(演示、中小规模),Kubernetes 适用于多主机集群(大规模生产)。对于大多数 IoT 售前场景,Docker Compose 完全够用。
Q2: 一台服务器能跑多少个容器?
Section titled “Q2: 一台服务器能跑多少个容器?”A: 取决于服务器配置。4C8G 服务器可以轻松运行 10-15 个容器,包括 Mosquitto、Node-RED、InfluxDB、Grafana 等核心服务。
Q3: 服务升级会中断业务吗?
Section titled “Q3: 服务升级会中断业务吗?”A: 可以通过滚动更新策略实现零停机升级。先启动新版本容器,确认正常后再停止旧版本。
Summary
Section titled “Summary”- Docker Compose 是多容器 IoT 栈的首选编排工具
- 一份 YAML 文件即可定义完整的 IoT 技术栈
- 一键启动、停止、重启所有服务
- 支持资源限制、健康检查等高级特性
- 适合演示环境、PoC、中小规模部署