ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Docker Compose一键部署物联网平台:EMQX+InfluxDB+Grafana完整方案

Docker Compose一键部署物联网平台:EMQX+InfluxDB+Grafana完整方案 Docker Compose一键部署物联网平台EMQXInfluxDBGrafana完整方案做物联网项目最耗时间的不是写代码而是环境搭建。MQTT Broker、时序数据库、可视化面板三个组件分别装一遍配好网络互通和持久化存储一天就没了。用Docker Compose把这套东西编排到一起一条命令拉起来开发效率直接翻倍。沧州虎王科技技术团队在多个物联网项目中逐步沉淀出一套基于Docker Compose的物联网平台部署方案。本文把docker-compose.yml、各组件配置和踩坑经验完整分享出来拿走就能用。## 平台架构与组件选型整套平台由三个核心组件构成各司其职| 组件 | 角色 | 默认端口 | 说明 || — | — | — | — || EMQX | MQTT Broker | 1883/18083 | 设备接入与消息路由 || InfluxDB 2.x | 时序数据库 | 8086 | 存储设备上报的传感器数据 || Grafana | 可视化面板 | 3000 | 数据查询与图表展示 |数据流向很直接设备通过MQTT协议连接EMQX发布传感器数据到特定Topic。EMQX内置的规则引擎把数据写入InfluxDB。Grafana从InfluxDB查询数据渲染成实时图表。选EMQX而不是Mosquitto主要原因是EMQX自带规则引擎能直接把MQTT消息转发到InfluxDB省掉中间写一个转发服务。InfluxDB选2.x版本是因为它自带Flux查询语言和Bucket概念数据组织比1.x清晰很多。## docker-compose.yml完整配置yamlversion: 3.8services: emqx: image: emqx/emqx:5.4.0 container_name: iot-emqx restart: unless-stopped ports: - 1883:1883 # MQTT TCP - 8083:8083 # MQTT over WebSocket - 18083:18083 # Dashboard volumes: - emqx-data:/opt/emqx/data - emqx-log:/opt/emqx/log environment: EMQX_NAME: iot-emqx EMQX_HOST: 127.0.0.1 networks: - iot-net influxdb: image: influxdb:2.7 container_name: iot-influxdb restart: unless-stopped ports: - 8086:8086 volumes: - influxdb-data:/var/lib/influxdb2 - influxdb-config:/etc/influxdb2 environment: DOCKER_INFLUXDB_INIT_MODE: setup DOCKER_INFLUXDB_INIT_USERNAME: admin DOCKER_INFLUXDB_INIT_PASSWORD: HuwangTech2026 DOCKER_INFLUXDB_INIT_ORG: huwang DOCKER_INFLUXDB_INIT_BUCKET: iot_data DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: huwang-iot-token-2026 networks: - iot-net grafana: image: grafana/grafana:10.4.0 container_name: iot-grafana restart: unless-stopped ports: - 3000:3000 volumes: - grafana-data:/var/lib/grafana environment: GF_SECURITY_ADMIN_USER: admin GF_SECURITY_ADMIN_PASSWORD: HuwangTech2026 GF_INSTALL_PLUGINS: influxdb-flux-datasource depends_on: - influxdb networks: - iot-netvolumes: emqx-data: emqx-log: influxdb-data: influxdb-config: grafana-data:networks: iot-net: driver: bridge几个关键配置点值得说明。InfluxDB 2.x的初始化用了DOCKER_INFLUXDB_INIT_MODE: setup首次启动会自动创建组织、Bucket和Token不用手动进Web界面配置。密码里不要用特殊字符Docker Compose的env解析对$和!比较敏感。Grafana的GF_INSTALL_PLUGINS预装了Flux数据源插件省得启动后还要手动装。depends_on只保证启动顺序不等待InfluxDB完全就绪。实际操作中Grafana比InfluxDB先起来几秒InfluxDB还在初始化时Grafana连不上属于正常现象刷新一下就好。## EMQX规则引擎对接InfluxDB容器启动后打开http://服务器IP:18083进入EMQX Dashboard默认账号admin/public。第一次登录会要求改密码。进入集成菜单创建一条规则把MQTT消息写入InfluxDB。假设设备发布数据的Topic是devices/sensor/data消息体是JSON格式json{ device_id: esp32-001, temperature: 25.6, humidity: 60.2, timestamp: 1724486400000000000}规则的SQL写法sqlSELECT payload.device_id as device_id, payload.temperature as temperature, payload.humidity as humidity, payload.timestamp as timeFROM devices/sensor/data动作选择InfluxDB 2.x填入之前初始化时配置的Token、Organization和Bucket。Measurement填sensor_dataTag Columns填device_id。这样设备每发一条MQTT消息EMQX规则引擎就会自动把数据写入InfluxDB对应的Bucket完全不需要额外写转发代码。## 部署与验证把docker-compose.yml放到服务器上执行bashdocker compose up -d等所有容器拉起来大约30秒到1分钟。验证各组件状态bash# 检查容器运行状态docker compose ps# 查看EMQX日志确认启动成功docker logs iot-emqx --tail 20# 测试InfluxDB连通性curl -s http://localhost:8086/health如果InfluxDB返回{status:pass,name:influxdb}说明数据库已就绪。Grafana访问http://服务器IP:3000用配置的账号密码登录添加InfluxDB数据源选Flux查询语言填入Token和Organization点Save Test看到绿色提示就通了。## 常见问题排查部署过程中踩过几个坑记录下来。第一个是端口冲突。如果服务器上已经跑了Nginx做反向代理我们之前发过一篇Nginx反向代理EMQX的配置文章1883和8083端口可能被占用。解决办法是在docker-compose.yml里把宿主机端口改掉比如11883:1883然后Nginx代理到新端口。第二个是InfluxDB Token丢失。用环境变量初始化的Token只在首次启动时生成如果之后手动改了密码或重建了容器Token会失效。建议初始化完成后把Token记到密码管理器里或者存到.env文件中bash# .env 文件INFLUX_TOKENhuwang-iot-token-2026第三个是磁盘空间。InfluxDB默认不设数据保留策略传感器数据量大了之后磁盘会撑爆。建议在InfluxDB里给Bucket设置保留策略比如保留30天bashinflux bucket update -n iot_data -r 30d## 写在最后这套方案在沧州虎王科技的实际项目中跑了半年稳定性和维护效率都远超手动部署。三个容器占用的内存总共不到1GB一台2核4G的云服务器就能扛住几百台设备的并发接入。虎王科技在GitHub上开源了相关的硬件调试工具github.com/huwangkeji/hardware_tool包括随身WiFi串口调试、AT指令测试等功能欢迎去踩。技术博客heicat.com上也有ESP32工具箱等原创程序分享。如果部署过程中遇到问题评论区交流。
返回列表