Docker部署物联网设备管理系统实战:从架构到一键部署

发布时间:2026/8/9 2:45:33

Docker部署物联网设备管理系统实战:从架构到一键部署
为什么用Docker部署物联网系统物联网项目的部署环境五花八门客户机房的服务器、工控机、树莓派、云服务器。每个环境的操作系统版本、依赖库版本都不一样。Docker解决的就是在我电脑上能跑的问题。把你的物联网平台、MQTT Broker、数据库、管理后端全部容器化任何装了Docker的机器上docker-compose up一把启动不用管底层的OS差异。这在实际项目中意味着什么你在公司开发机上调试好的系统部署到客户机房时不用再花两天时间装环境、排依赖。镜像拉下来配置文件改一改跑起来。整体架构一个完整的物联网设备管理系统Docker化后的架构docker-compose.yml ├── emqx # MQTT Broker ├── mysql # 业务数据库 ├── redis # 缓存 ├── go-worker # MQTT消息处理微服务 ├── php-api # 管理API Web界面 └── nginx # 反向代理所有组件跑在同一台服务器上通过Docker内部网络通信。完整docker-compose.ymlversion:3.8services:mysql:image:mysql:8.0container_name:iot_mysqlrestart:alwaysenvironment:MYSQL_ROOT_PASSWORD:${MYSQL_ROOT_PASSWORD}MYSQL_DATABASE:iot_platformports:-3306:3306volumes:-mysql_data:/var/lib/mysql-./sql/init.sql:/docker-entrypoint-initdb.d/init.sqlnetworks:-iot_netredis:image:redis:7-alpinecontainer_name:iot_redisrestart:alwayscommand:redis-server--requirepass ${REDIS_PASSWORD}ports:-6379:6379volumes:-redis_data:/datanetworks:-iot_netemqx:image:emqx/emqx:5.8container_name:iot_emqxrestart:alwaysenvironment:EMQX_NAME:iot_emqxEMQX_HOST:127.0.0.1EMQX_DASHBOARD__DEFAULT_PASSWORD:${EMQX_DASHBOARD_PASSWORD}ports:-1883:1883# MQTT TCP-8083:8083# WebSocket-18083:18083# Dashboardvolumes:-emqx_data:/opt/emqx/datanetworks:-iot_netgo-worker:build:./go-workercontainer_name:iot_workerrestart:alwaysdepends_on:-emqx-mysql-redisenvironment:MQTT_BROKER:emqx:1883MYSQL_DSN:root:${MYSQL_ROOT_PASSWORD}tcp(mysql:3306)/iot_platformREDIS_ADDR:redis:6379REDIS_PASSWORD:${REDIS_PASSWORD}networks:-iot_netphp-api:build:./php-apicontainer_name:iot_apirestart:alwaysdepends_on:-mysql-redisenvironment:DB_HOST:mysqlDB_DATABASE:iot_platformDB_USERNAME:rootDB_PASSWORD:${MYSQL_ROOT_PASSWORD}REDIS_HOST:redisREDIS_PASSWORD:${REDIS_PASSWORD}volumes:-./php-api/src:/var/www/htmlnetworks:-iot_netnginx:image:nginx:alpinecontainer_name:iot_nginxrestart:alwaysdepends_on:-php-apiports:-80:80volumes:-./nginx/default.conf:/etc/nginx/conf.d/default.conf-./php-api/src:/var/www/htmlnetworks:-iot_netvolumes:mysql_data:redis_data:emqx_data:networks:iot_net:driver:bridge.env配置MYSQL_ROOT_PASSWORDyour_secure_password_here REDIS_PASSWORDyour_redis_password_here EMQX_DASHBOARD_PASSWORDyour_emqx_password_hereGo Worker关键代码Go Worker负责订阅MQTT消息处理设备上报数据并写入数据库packagemainimport(encoding/jsonfmtlogosos/signalsyscallmqttgithub.com/eclipse/paho.mqtt.golanggithub.com/joho/godotenv_github.com/go-sql-driver/mysqlgithub.com/gomodule/redigo/redisdatabase/sql)typeTelemetrystruct{DeviceIDstringjson:device_idTempfloat64json:tempHumfloat64json:humVoltagefloat64json:voltage}vardb*sql.DBvarredisConn redis.Connfuncmain(){godotenv.Load()// 初始化MySQLdsn:os.Getenv(MYSQL_DSN)db,_sql.Open(mysql,dsn)deferdb.Close()// 初始化RedisredisAddr:os.Getenv(REDIS_ADDR)redisConn,_redis.Dial(tcp,redisAddr)deferredisConn.Close()// 连接MQTTopts:mqtt.NewClientOptions()opts.AddBroker(os.Getenv(MQTT_BROKER))opts.SetClientID(go-worker-001)opts.OnConnectfunc(c mqtt.Client){c.Subscribe(devices///telemetry,1,handleMessage)log.Println(Subscribed to telemetry topic)}client:mqtt.NewClient(opts)iftoken:client.Connect();token.Wait()token.Error()!nil{log.Fatal(token.Error())}// 等待退出信号sig:make(chanos.Signal,1)signal.Notify(sig,syscall.SIGINT,syscall.SIGTERM)-sig}funchandleMessage(client mqtt.Client,msg mqtt.Message){vart Telemetryiferr:json.Unmarshal(msg.Payload(),t);err!nil{return}// 写入MySQL_,err:db.Exec(INSERT INTO device_telemetry (device_id, temp, hum, voltage, created_at) VALUES (?, ?, ?, ?, NOW()),t.DeviceID,t.Temp,t.Hum,t.Voltage,)iferr!nil{log.Printf(MySQL insert error: %v,err)}// 更新Redis缓存最新状态redisConn.Do(HSET,device:t.DeviceID,temp,t.Temp,hum,t.Hum,voltage,t.Voltage)redisConn.Do(HSET,device:t.DeviceID,last_seen,NOW())// 告警判断ift.Temp80{redisConn.Do(LPUSH,alerts,fmt.Sprintf({device:%s,type:high_temp,value:%.1f},t.DeviceID,t.Temp))}}Nginx配置server { listen 80; server_name _; root /var/www/html/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass php-api:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # WebSocket代理设备实时通信 location /ws { proxy_pass http://emqx:8083; proxy_set_header Host $host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; } }部署步骤# 1. 克隆代码gitclone https://github.com/your-repo/iot-platform.gitcdiot-platform# 2. 配置环境变量cp.env.example .envnano.env# 修改密码# 3. 启动所有服务docker-composeup-d# 4. 初始化数据库dockerexec-itiot_mysql mysql-uroot-piot_platformsql/init.sql# 5. 检查服务状态docker-composepsdocker-composelogs-f整个过程5分钟。性能与资源占用在一台4核8G的云服务器上实测服务内存占用CPU占用MySQL~500MB5%Redis~30MB2%EMQX~200MB10%Go Worker~50MB5%PHP-FPM~100MB5%Nginx~20MB1%总计~900MB30%500台设备每5秒上报一次数据系统负载轻松hold住。实际踩坑坑1MySQL时区Docker MySQL默认UTC但业务需要东八区。在docker-compose.yml中加environment:TZ:Asia/Shanghai或者直接在MySQL配置文件中设置default-time-zone08:00。坑2EMQX WebSocket跨域前端通过WebSocket连接EMQX时可能遇到CORS问题。在EMQX配置中emqx:environment:EMQX_LISTENER__WS__DEFAULT__ACCESS_CONTROL__ALLOW_ORIGINS:*坑3Docker日志撑爆磁盘容器默认不限制日志大小。加上logging:driver:json-fileoptions:max-size:10mmax-file:3总结Docker化部署物联网系统核心好处是环境一致性和快速交付。你在本地调好的系统到客户现场5分钟部署完不需要在现场折腾环境问题。虎王科技的设备管理平台就是基于这套架构目前稳定运行中。Docker Compose文件和部分代码在GitHub上github.com/huwangkeji有问题欢迎评论区交流。沧州虎王科技专注物联网软硬件开发、通信设备、嵌入式系统与设备管理平台。

相关新闻

静态页面移动端适配:视口控制与REM方案详解

静态页面移动端适配:视口控制与REM方案详解

2026/8/9 2:35:33

1. 静态页面移动端适配的核心挑战作为一名经历过数十个企业级项目的前端开发者,我深刻理解静态页面在移动端适配中的痛点。不同于响应式框架的自动适配,纯静态页面(HTMLCSSJS)要实现完美的跨设备呈现,需要解决三个维度…

NetLogo社会网络仿真在环境科学中的应用与实践

NetLogo社会网络仿真在环境科学中的应用与实践

2026/8/9 2:35:33

1. 社会网络仿真与环境科学的跨界融合当我在2013年第一次尝试用NetLogo模拟城市垃圾分类行为时,完全没想到这个看似简单的社会网络仿真工具会在环境科学领域掀起一场方法论革命。NetLogo作为一款多主体建模软件,其独特价值在于能够将复杂的社会行为和环境…

富爸爸财富观:资产系统与被动收入的秘密

富爸爸财富观:资产系统与被动收入的秘密

2026/8/9 2:35:33

1. 富爸爸系列的核心财富观《富爸爸穷爸爸》系列书籍自1997年问世以来,已经影响了全球数千万读者的财富观念。罗伯特清崎通过对比"富爸爸"和"穷爸爸"两种截然不同的思维方式,揭示了富人之所以越来越富的根本原因。这套书最令人震撼的…

揭秘营销型网站建设搭建方法,让流量变留量的高效实战指南

揭秘营销型网站建设搭建方法,让流量变留量的高效实战指南

2026/8/9 3:25:35

在这个互联网流量红利见顶、获客成本日益高昂的时代,很多企业老板和运营负责人都在焦虑同样的问题:为什么我的网站看起来挺高大上,但就是没人咨询?为什么我花了大价钱做SEO,排名上去了,点击率却惨不忍淡?其实,根源往往不在于你长得不够美,而在于你根本不知道如何构建一…

GIS数据制备、空间分析与建模全流程实践指南

GIS数据制备、空间分析与建模全流程实践指南

2026/8/9 3:25:35

在实际 GIS(地理信息系统)项目中,数据制备、空间分析与高级建模是三个环环相扣的核心环节。很多开发者或分析师在入门时,常常感到困惑:为什么从网上下载的矢量数据无法直接叠加分析?为什么缓冲区分析的结果…

闪念录屏工具 -跟随鼠标自动放大· Flash Recorder

闪念录屏工具 -跟随鼠标自动放大· Flash Recorder

2026/8/9 3:25:35

闪念录屏工具 -跟随鼠标自动放大 Flash Recorder 堪比Focusee的一款录屏工具,完全开源,且免费 一款基于 Electron 的「点击即聚焦」丝滑局部放大录屏工具。 点击屏幕任意位置(或按下快捷键),画面会以鼠标为中心平滑放…

云原生成本优化实战:从监控到治理的完整技术方案

云原生成本优化实战:从监控到治理的完整技术方案

2026/8/9 3:25:35

在实际企业 IT 和云原生环境中,成本控制正从传统的资源采购谈判,演变为一项贯穿开发、运维、财务的精细化管理工程。当业务规模扩大,云资源账单、软件许可费用、闲置实例开销等成本项会变得异常复杂且难以追踪。Sapiom 这类专注于成本优化的平…

从《我的世界》到AI编程:当资源无限时,过程与创造的价值何在?

从《我的世界》到AI编程:当资源无限时,过程与创造的价值何在?

2026/8/9 3:25:35

你打开《我的世界》,看着自己辛苦挖来的几组钻石,突然冒出一个念头:如果在这个方块世界里,也能像电影《百万英镑》那样,凭空获得一笔巨款,会发生什么?是瞬间解锁所有高级装备,还是彻…

如何在5分钟内创建专业EPUB电子书:EPubBuilder完全指南

如何在5分钟内创建专业EPUB电子书:EPubBuilder完全指南

2026/8/9 3:15:35

如何在5分钟内创建专业EPUB电子书:EPubBuilder完全指南 【免费下载链接】EPubBuilder 一款在线的epub格式书籍编辑器 项目地址: https://gitcode.com/gh_mirrors/ep/EPubBuilder 想要制作专业级的EPUB电子书却担心技术门槛太高?EPubBuilder这款开…

比较好的亚太EMBA,问了6位校友师资差别真的挺大

比较好的亚太EMBA,问了6位校友师资差别真的挺大

2026/8/9 0:05:25

比较好的亚太EMBA核心差异先看什么?对于希望兼顾工作与系统管理能力提升的亚太区高管而言,筛选匹配度高的EMBA项目时,师资配置是决定学习体验与实际收获的核心要素之一。我们结合3-4个公开信息透明、办学历史较长的亚太区主流EMBA项目特点&am…

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

2026/8/9 0:05:25

备考海外游学的亚洲EMBA面试,核心要围绕项目国际化设计逻辑、个人跨文化管理经验匹配度两个维度准备,避免把游学模块等同于普通旅游参访的认知偏差。不少备考者花3个月对比6份资料,却容易忽略面试官对“国际视野落地能力”的考察——比如香港…

比较好的国内EMBA,问了二十位校友聊透人脉价值

比较好的国内EMBA,问了二十位校友聊透人脉价值

2026/8/9 0:05:25

比较好的国内EMBA核心差异体现在哪些方面?比较好的国内EMBA的核心长期价值,很大程度上依托于校友网络的连接质量与资源生态的活跃度,这也是不少高管在择校时优先考量的因素。我们结合3-4个市场关注度较高的项目公开信息,从课程、师…

比较好的亚太EMBA,问了6位校友师资差别真的挺大

比较好的亚太EMBA,问了6位校友师资差别真的挺大

2026/8/9 0:05:25

比较好的亚太EMBA核心差异先看什么?对于希望兼顾工作与系统管理能力提升的亚太区高管而言,筛选匹配度高的EMBA项目时,师资配置是决定学习体验与实际收获的核心要素之一。我们结合3-4个公开信息透明、办学历史较长的亚太区主流EMBA项目特点&am…

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

2026/8/9 0:05:25

备考海外游学的亚洲EMBA面试,核心要围绕项目国际化设计逻辑、个人跨文化管理经验匹配度两个维度准备,避免把游学模块等同于普通旅游参访的认知偏差。不少备考者花3个月对比6份资料,却容易忽略面试官对“国际视野落地能力”的考察——比如香港…

比较好的国内EMBA,问了二十位校友聊透人脉价值

比较好的国内EMBA,问了二十位校友聊透人脉价值

2026/8/9 0:05:25

比较好的国内EMBA核心差异体现在哪些方面?比较好的国内EMBA的核心长期价值,很大程度上依托于校友网络的连接质量与资源生态的活跃度,这也是不少高管在择校时优先考量的因素。我们结合3-4个市场关注度较高的项目公开信息,从课程、师…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/8 5:07:31

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/7 8:02:42

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/8 2:30:15

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…