跳转到内容

Docker Compose 编排 IoT 栈

Docker Compose 编排 IoT 栈

本节介绍如何使用 Docker Compose 编排完整的 IoT 技术栈。学习完成后,您将能够:

  • 理解 Docker Compose 的作用和工作原理
  • 编写 docker-compose.yml 文件编排多容器服务
  • 向客户解释 Docker Compose 在 IoT 架构中的价值
  • 能够配合客户需求调整服务配置

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过一个 YAML 配置文件,可以一次性启动整个 IoT 技术栈。

核心价值:

特性说明售前价值
声明式配置用 YAML 文件定义所有服务可版本控制、可复现
一键部署docker-compose up -d 启动全部服务演示环境 5 分钟搭建
服务编排自动处理依赖关系和启动顺序减少人工配置错误
网络管理自动创建隔离网络服务间通信开箱即用
环境一致性开发/测试/生产使用相同配置消除环境差异问题
对比维度Docker RunDocker Compose
管理方式单容器手动管理多容器统一管理
配置文件无(命令行参数)YAML 配置文件
可复现性差(需记录命令)好(配置文件可共享)
服务依赖手动处理自动处理
网络配置手动创建网络自动创建网络
扩展性启动多个容器支持 --scale 扩展
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: bridge

Mosquitto:

  • 端口 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 实现管理能力
┌─────────────────────────────────────────┐
│ IoT Network │
├─────────────────────────────────────────┤
│ │
│ Portainer ──── 管理所有容器 │
│ │
│ Mosquitto ──── MQTT 消息中枢 │
│ ↑ │
│ Node-RED ──── 订阅/发布 MQTT 消息 │
│ ↓ │
│ InfluxDB ──── 存储时序数据 │
│ ↓ │
│ Grafana ───── 可视化 InfluxDB 数据 │
│ │
└─────────────────────────────────────────┘
Terminal window
# 启动所有服务(后台运行)
docker-compose up -d
# 启动特定服务
docker-compose up -d mosquitto nodered
# 查看启动日志
docker-compose logs -f
Terminal window
# 停止所有服务
docker-compose stop
# 停止特定服务
docker-compose stop nodered
# 重启所有服务
docker-compose restart
# 停止并删除容器
docker-compose down
Terminal window
# 查看所有服务状态
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 nodered
services:
nodered:
image: nodered/node-red:latest
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
services:
mosquitto:
image: eclipse-mosquitto:2
healthcheck:
test: ["CMD", "mosquitto_sub", "-t", "$$SYS/broker/uptime", "-C", "1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
networks:
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 用户运行容器
  • 不配置日志轮转

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 等核心服务。

A: 可以通过滚动更新策略实现零停机升级。先启动新版本容器,确认正常后再停止旧版本。

  1. Docker Compose 是多容器 IoT 栈的首选编排工具
  2. 一份 YAML 文件即可定义完整的 IoT 技术栈
  3. 一键启动、停止、重启所有服务
  4. 支持资源限制、健康检查等高级特性
  5. 适合演示环境、PoC、中小规模部署