尽管现在的Docker已经风靡全球,但还是有很多开发者(特别是嵌入式开发者)对Docker认识还是仅仅停留在它的服务器应用上面。殊不知,Docker已经是微软Azure IoT Edge技术的重要组成部分。那么Docker到底有什么本事,能在Iot领域如此重要呢?
举个例子,无论你是什么CPU,什么操作系统,什么硬件条件,下面一条命令,就可以让你的PC,嵌入式设备,跑上一个指定版本的APP:
sudo docker run -it --privileged -v /dev:/dev-share idea4good/gui-lite:latest bash /run.sh
作为一个嵌入式开发者,你或许会遇到以下场景:
1. 每当硬件升级的时候,你能保证你的APP还能在新硬件环境正确运行吗?
2. 当设备的驱动程序发生变化后,你能保证你的APP还能正确运行吗?
3. 当APP出现了问题,是硬件的问题,还是软件的问题?
4. 因为嵌入式软件升级困难(往往需要现场升级),你不得不对APP作无数次测试,从而导致上线时间越拖越久?
5. 当APP确实要升级的时候,串口,调试器,人员一个都不能少
其实,这些问题都可以由Docker来解决,谁说的?微软!
大家可以百度一篇微软Azure IoT Edge的文章看一下,它能够实现IoT的大规模部署、随时升级及平台无关(还有更多的功能我就不一一介绍了);但微软没有明说的是:实现方法就是Docker
但有UI的嵌入式开发者,可能马上跳出来反对,因为Docker没有提供对framebuffer的访问办法,目前网上推荐的方法都是X11,这无疑增加了麻烦和对嵌入式资源的消耗,而且性能问题也有待考验。
其实这个问题,微软已经提供了很好的解决方法,确切的说它的方法不仅适用于对framebuffer的访问,甚至适用于对各种硬件(例如:音频,I2C,I2S,串口),驱动的访问。
因此,显示,及硬件的访问并不是问题,甚至具体方法,还是体现在上面的那一条命令之中。
Docker对嵌入式开发的帮助,可以在4个方面体现出来:
软件开发完成后,尽快制作成docker映像,并保证正确运行。随后将其发布在docker hub上面,如果考虑到保密,可以申请企业服务。
如果软件有新版本发布,依然可以发布在docker hub上面,用tag进行版本区分。
测试部门,从硬件部门拿到硬件设备,BSP部门提供包含驱动程序的images文件,测试部门按照BSP部门的指引文档对硬件设备进行初次(也是唯一一次)的刷新。
然后开机进行测试(系统开机会运行唯一一条从docker获取/运行APP映像的指令,例如:sudo docker run -it --privileged -v /dev:/dev-share idea4good/gui-lite:latest bash /run.sh)随后,系统会自动部署,并运行。测试工作便可以开始了。
硬件,BSP开发完成后,需要进行基本验证,验证方法,可以跟上面的测试方法一致。
软件升级,跟测试过程一致,不过这里可以根据自己的情况,设置一下触发机制,来决定是否进行软件升级。
综上所述,由于使用了docker后,除了软件开发,其他所有的过程都变得一致了,不需要再指定特别的方法来保证各个开发阶段的一致性了,大家不用到处去寻找所谓的“最新软件版本”了
即使是硬件或BSP升级了,也没有必要找软件部门对其进行软件升级。因为所有关于升级的问题,都有docker hub帮大家解决了,任何环境下,一条命令就可以完成软件的升级,部署。
嵌入式的开发精髓在于软硬件的结合,而升级,部署问题,则可以交给技术更可靠,成熟的第三方(例如:docker hub)来代劳。
我相信大家有能力做好软件的网络升级,但一旦你的设备成千上万时,更加专业的网络问题,就会接踵而至;应对这些问题,需要有非常专业的分布式网络技术来应对;所谓术业有专攻,大包大揽会让开发者的负担无限放大,善于利用现有资源,才能事半功倍!
最后,GuiLIte是倡导嵌入式开发Docker化的先驱,有任何问题,欢迎大家在开发群中讨论。祝大家开发顺利!