使用 Docker 容器快速开发物联网应用程序
使用基于容器的虚拟化来开发、测试、部署和更新 IoT 应用程序
物联网 (IoT) 的快速发展在一定程度上受到了无线模块、传感器和微控制器的商品化和易访问性的推动。但 IoT 并不只是在设备制造商中引起了轰动。随着互联设备的数量和种类不断增加,对应用程序链接这些设备和处理它们生成的海量数据的需求也在增加。为了跟上这种不断增长的需求,Web 和移动应用程序开发人员将需要开始开发 IoT 应用程序,调整其当前的开发实践来应对这个新应用程序领域的挑战。一种这样的开发实践是使用容器。容器是一种轻量型的虚拟化方法,开发人员可应用这种方法来快速、大规模地开发、测试、部署和更新 IoT 应用程序。
Anna Gerber, 资深软件开发人员
在 IBM Bluemix 云平台上开发并部署您的下一个应用。
开始您的试用
容器概述
物联网正在快速发展,它是智慧设备的高度互联网络,这些设备包括环境传感器、健康跟踪器、家用电器和工业设备等。到 2020 年,预计有 200 亿个设备将连入网络,这超过 PC、智能手机和平板电脑加起来的数量的两倍。开发人员正在快速开始为 IoT 创建应用程序,而使用容器可在不同方面为他们带来帮助。
容器是一种轻量型的虚拟化方法,开发人员可使用该方法快速、大规模地开发、测试、部署和更新 IoT 应用程序。许多 Web 和移动应用程序开发人员使用虚拟机管理程序(比如 VirtualBox)来运行虚拟机 (VM),在一个跨平台的开发、测试和部署工作流中虚拟化物理硬件。
基于容器的虚拟化(有时称为操作系统级虚拟化)要轻量得多。每个容器作为隔离的用户空间实例在一个共享的主机操作系统内核上运行。尽管操作系统是共享的,但各个容器拥有独立的虚拟网络接口、独立的流程空间和不同的文件系统。可使用实现资源隔离的控制组来向这些容器分配系统资源,比如 RAM。在基于虚拟机管理程序的虚拟化中,每个 VM 运行自己的操作系统,这会增加系统资源的使用,与此相比,容器使用的磁盘和内存资源少得多。
Docker 是 Linux 上一个基于容器的开放虚拟化平台。Docker 可帮助轻松快速地构建容器并将它们部署在任何地方:私有和公有云中、本地 VM 中或包括 IoT 设备在内的物理硬件上。IBM Containers 是一种基于 Docker 的 Bluemix beta 特性,用于在 Bluemix 平台上交付和部署容器化的应用程序。
使用容器、镜像和注册表
每个 Docker 容器包含一个或多个运行的进程。Docker 容器从一个镜像启动,该镜像指定了以下元素:
要在容器内运行的应用程序的配置信息
它的依赖项,比如库和共享二进制文件
Docker 使用一种统一的文件系统,将镜像存储为一系列层。层会在构建过程中缓存,这使衍生镜像的构建既快捷又高效。
这种分层方法还意味着 Docker 镜像较小且可移植,可通过将它们发布到公共或私有注册表来轻松共享它们。Docker Hub 是 Docker 镜像存储库的最大注册表;其中列出了 100,000 多个存储库并承载着众多私有存储库。如果您使用 IBM Bluemix 云平台,它支持从 Docker Hub 拉入公共镜像,还支持提供承载的私有镜像存储库,这使您能够在组织内共享私有镜像。
如果使用一种流行的开源框架或服务,您可能能够在 Docker Hub 中找到一个预先构建的公共镜像,许多镜像由与这些项目相关的开源社区来维护。Docker Hub Web 界面有一个较小的官方存储库列表,这是一个精挑细选的存储库列表,包含由 Docker 团队对已知安全漏洞进行了测试的镜像。
避免使用旧的 Docker 镜像,即使这些镜像的来源可靠,因为许多旧镜像仅用于归档和测试用途。如果旧镜像仍得到维护,它们会在 Docker Hub 中被标记为受支持。公共注册表中的大多数镜像都是社区贡献的,可能没有详细备案或维护。怀疑有问题时,可使用一个官方镜像作为基础来创建自己的镜像。
可完成以下步骤来创建镜像:
从注册表拉入一个基础镜像
交互式地运行一系列命令
提交结果作为新镜像
例如,下面的命令列表从 Docker Hub 获取官方的 Ubuntu version 14.04 镜像,从该镜像启动容器,运行一个命令来将 Git 安装到该容器中,然后列出创建的容器的 ID。
清单 1. 创建一个镜像
$ docker pull ubuntu:14.04
$ docker run ubuntu apt-get install -y git
$ docker ps -l
可发出下面这条命令来将此容器 (cb23e345fde0) 保存为新镜像(名为 demo/git):$ docker commit cb23e345fde0 demo/git。
要使用 IBM Container Extensions 工具在本地运行 Docker 命令,可将 docker 命令更改为 ice --local。例如,使用此命令:$ ice --local pull ubuntu:14.04
如果需要运行不止一两个命令来设置应用程序环境,您需要创建一个 Dockerfile。Dockerfile 是指定用于构建镜像的一组指令的文本文件。下面这个代码清单中的 Dockerfile 创建了一个运行 Nginx Web 服务器的基础镜像。
清单 2. 创建一个运行 Nginx Web 服务器的基础镜像的 Dockerfile
FROM ubuntu:14.04
RUN apt-get -y update && apt-get install -y nginx
RUN mkdir -p /var/www/html
EXPOSE 80
EXPOSE 443
WORKDIR /etc/nginx
CMD ["nginx"]
每个 Dockerfile 中的第一条指令是 FROM 指令,这表明基础镜像。Dockerfile 中的每个后续指令存储为一个层:
RUN 指令运行 apt-get 等 Linux 命令。
ADD 和 COPY 指令将应用程序文件添加到容器中。
EXPOSE 指令打开端口。
ENV 指令配置环境变量。
最后,每个 Dockerfile 包含 WORKDIR、ENTRYPOINT 或 CMD 指令,用来指定在该容器启动时,如何和在何处运行该应用程序。
运行 Docker 容器需要极少的开销,所以可将您的应用程序分解为一组在不同的容器中运行的服务,这些容器可在运行时按名称来链接。例如,您可将应用程序拆分为一个运行 Node.js 应用程序的容器,该容器链接到另一个运行 Redis 键值存储的容器。
回页首
使用容器维护一致的 IoT 开发环境
IoT 应用程序适用于各种各样的设备平台。在原型设计和早期开发阶段,IoT 项目常常使用基于通用微控制器的开发板或单板计算机 (SBC)(比如 Raspberry Pi)来开发。为这些设备开发的嵌入式应用程序可在以后升级来在自定义的原型开发板上运行,最终在生产设备上运行。您可评估许多潜在的微控制器和单芯片系统 (SoC) 设备,它们具有不同且有时不兼容的设备驱动程序需求。每个设备或设备修订版可能还需要开发工具包的不同版本和配置,用于闪存、监视设备和与其通信。
容器可用来捕获一个已知适用于每个设备修订版的开发环境,以及在一个开发团队中共享此环境。例如,如果您的团队使用多种类型的兼容 Arduino 的开发板,您可创建一个包含 Arduino 命令行工具包和用于串行通信的哑终端 (dumb-terminal) 模拟程序的镜像,用作您的基准开发镜像。然后可使用这个基础 Arduino 开发镜像来为每个需要特定的自定义驱动程序的开发板创建新的镜像变体。
Docker 的分层文件系统能在此情形下高效地使用空间,因为在创建新镜像时仅存储惟一的层。docker history 命令显示组成一个镜像的各种层的列表,包括创建每个层的指令和层大小,比如:
IMAGE CREATED CREATED BY SIZE
3ca43a9a4095 20 hours ago apt-get install -y git 37.64 MB
层会被缓存,所以您可快速地尝试镜像的新变体。例如,您可能希望向驱动程序或开发工具应用更新。层还使您能够轻松地回滚到镜像的早期版本,在某处出错时尝试一种不同的方法。
如果对开发环境的更改取得成功,可将新镜像推送到您的私有团队注册表,以快速将更改传播给团队的其余成员。每个团队成员拉入更新的镜像时,他们已缓存了大部分层,所以 Docker 通常只需几秒到几分钟时间运行创建新层的指令,即可让新镜像正常运行。与推送和拉入 VM 镜像快照或为每个变体从头构建完整镜像相比,层节省了存储空间,而且更重要的是节省了开发人员的时间。
将容器部署到 IoT 设备
Docker 化的应用程序的吸引力在于,您构建镜像后,可将它们传送到几乎任何地方来运行。如果您的 IoT 设备运行 Linux,您可能能够将容器直接部署在您的设备上。尽管这些 IoT 设备上通常仅有有限的系统资源,但部署 Docker 容器是可行的,因为它们的运行时开销几乎为 0。甚至可在设备上运行多个容器,例如,如果您想要并排运行应用程序的不同版本来进行比较。
Docker 需要一种支持内核命名空间和控制组的现代 Linux 内核,所以可能还没有适合您最喜欢的 IoT 设备的基础镜像。随着合适的 SoS 的价格不断降低(例如 9 美元的 C.H.I.P. 开发板),我们有望看到更多支持 Linux 的 IoT 设备被开发出来;然后将出现更多针对这些平台的 Linux 发行版。
Docker Hub 包含许多基于 ARM 的镜像供流行的 SBC 的爱好者们使用,比如 Raspberry Pi 和 BeagleBone Black。如果直接在您的设备上运行容器,您可避免不断闪存设备或覆盖整个固件。您可构建新镜像,拉入它们来在设备上的主机 OS 中运行,快速设计原型和试验先进的库和固件来充分利用 IoT 设备。
IoT 开发人员面临的难题是,不断更新互联设备的网络并在可能不可靠且低带宽的无线连接上运行它们。另外,他们还必须考虑如何维护许多这样的设备收集的敏感个人数据的安全。IoT 设备可能仅偶尔连网,一些设备设置为按不同的时间表睡眠来节省电量。其他 IoT 设备可能使用一种网状网络拓扑结构来连接,在任何给定时刻仅能访问网络的一部分。在网络连接断开时,基于推送的更新可能失败,而且应用不完整或可能损坏的更新的危险在于,设备可能进入一种不一致的状态或变得无法操作。
Docker 为这种更新问题提供了一个可行的解决方案。发出对其最新应用程序镜像版本的拉入请求的设备,将通过无线连接获取镜像差异,而不是整个镜像。基于差异的更新的完成速度快得多,这会减少连接设备所需的时间量和降低故障概率,进而减轻低带宽网络上的压力。这使更频繁地应用更新成为可能。
一些 IoT 设备允许通过物理按钮或小型触摸屏来进行有限的用户交互,但是对于许多新一代的 IoT 设备,主要的用户交互方式是使用移动应用程序。Docker 容器被越来越多地采用来加速自动化测试、持续集成和移动应用程序的交付,这一点也不足为奇。
集成 IoT 设备与云
将应用程序部署到智慧设备和移动设备,只是物联网开发过程的一部分。许多新一代的 IoT 设备将传感器数据和事件发布到云服务。
容器设计用来运行云服务。但是,容器是暂时性的,所以任何写入一个运行的数据库容器中的文件系统的数据都应视为是暂时的;也就是说,如果容器关闭,该数据将丢失。在某种意义上讲,使用容器会迫使您形成开发无状态云应用程序的良好习惯。任何要持久保存的数据都应使用数据卷来存储。数据卷会持久存留到容器关闭之后,可在多个容器之间共享。
随着连接的设备的数量增加,基于云的 IoT 应用程序将需要扩展来处理生成的数据量。幸运的是,我们可利用围绕 Docker 构建的愈加庞大的编排工具生态系统来开发可扩展的云应用程序,包括最新宣布的 Docker Machine、Swarm 和 Compose 工具。这些工具目前仅推荐用于开发环境,但 Docker 正在努力让它们适合面向一些云平台的生产环境,包括 EC2 Container Services、Microsoft Azure 和 IBM Bluemix。IBM Bluemix 目前还支持运行容器组来实现负载平衡和故障转移。
回页首
结束语
要满足对物联网应用程序的预计需求,开发人员将需要采用一些工具和实践,使他们能够快速开发 IoT 应用程序和服务来在智慧设备、移动设备和云中运行。Docker 容器能够将应用程序传送到任何地方来运行,拥有极低的运行时开销,而且拥有一个能实现轻量型可移植镜像和快速构建镜像的分层文件系统,是面向 IoT 开发人员的一个绝佳工具。
阅读:为什么不尝试使用容器开发您的下一个 IoT 项目?
参考资料
学习
查阅 Docker 文档。
IBM Internet of Things Foundation:探讨如何使用 IoT Foundation 和 IBM Bluemix 来快速开始开发物联网应用程序。
探索 IBM Bluemix(David Barnes,developerWorks,2013 年 9 月):和 IBM 的 David Barnes 一起详细了解 IBM BlueMix,这是一个在云中的平台,提供了一些将推动下一代云应用程序和服务的云应用程序功能。
使用 IBM IoT Foundation 和 IBM Bluemix 构建自己的可穿戴设备应用程序(Mike Spisak 和 Rhonda Childress,developerWorks,2015 年 2 月);构建一个连接到可穿戴设备并从该设备向云发送传感器数据的混合移动应用程序。
探索 IBM Bluemix 上的 MQTT 和 Internet of Things 服务(Chun Bin Tang,developerWorks,2015 年 2 月):了解 MQTT 的工作原理。使用 IoT 服务和一个示例 Java 应用程序或 Node-RED 编辑器来轻松构建应用程序。
获得产品和技术
了解如何安装 Docker 工具,以便您可在本地机器上运行容器。查阅 Docker 文档 了解详细信息。如果运行 OS X 或 Windows,您还需要安装 boot2docker,这是一个运行 Docker 容器的轻量型 Linux VM。
试用 Swarm 的 beta 版,这是一个用于 Docker 的原生集群工具。 |