嵌入式系统上为什么不能使用Docker?

15

最近有一个项目交给我,需要协调几个嵌入式设备(支持Linux),向它们部署软件,并允许在git仓库的代码库更新时更新应用程序。

最初的想法是为每个设备创建一个标准镜像,于是我开始尝试在UDOO Quad和Intel Edison上安装Docker,但到目前为止没有成功。

我的想法是,在嵌入式设备上安装Docker似乎是个好主意--但如果是这样的话,那么肯定会被移植了。目前唯一在做这些努力的团队是Resin.io。

我是否忽略了什么,或者是Docker在嵌入式设备上不合适的明显原因?如果没有原因,并且在嵌入式系统上运行Docker是有意义的,那么我是否遗漏了任何相关的讨论或操作指南?


你是否曾经找到一个合适的答案?我自己也很感兴趣。 - Dennis Estenson
我没有找到为什么Docker不支持嵌入式设备的答案,但我发现最新的vanilla内核对Docker有更多的内置支持。由于在这方面正在做出努力,因此Arch Linux ARM发行版可能是安装Docker最简单的途径,因为Arch旨在成为更具前瞻性。然后,您所需要的就是在ARM架构上运行的映像。尽管docker hub上有x86-only规则,但您可以通过一些简单的搜索(例如“Ubuntu arm”)找到一些映像。 - Bobby
4个回答

11
我考虑在嵌入式设备上(一个MIPS系统)运行Docker,但最终没有选择这种方式。我认为有以下问题:
  1. Docker是用Golang实现的。目前还没有可用的mips工具链来编译Go。您需要使用gcc-go自己创建工具链。

  2. Docker的大小比LXC大。在桌面计算机上,这不是问题,但嵌入式设备的闪存存储空间有限。

  3. Docker使用了一些非常新的Linux内核特性。有时候嵌入式设备上的内核版本并不那么新,需要进行回溯以使其正常工作。

  4. Docker镜像必须在相同的体系结构下构建。这意味着如果您想在Raspberry Pi上运行Docker容器,则必须在ARM体系结构系统上构建Docker镜像。可以使用QEMU在云中构建Docker镜像,但它不支持所有嵌入式系统中使用的CPU架构。(例如,它目前不支持MIPS)

最终,针对在嵌入式设备上运行容器的特定任务,我们选择了LXC。与Docker相比,它具有有限的功能,但目前它符合项目要求。

截至2019年,我想更新这个答案,因为我已经将Docker移植到了带有ARM CPU的嵌入式系统上。随着闪存使用和内存使用方面的成本,通过使用Docker,您将获得容器管理、镜像管理以及许多来自Docker Hub的可用于运行的镜像。因此,决定取决于成本和功能之间的平衡。


只是一个纠正。MIPS是Go工具链所针对的指令集之一。请参阅此处:https://go.dev/doc/install/source。 - Joppe
谢谢,我的评论是在2016年发表的,所以信息已经过时了。 - Jing Qiu

8

以下是2018年最新更新:

随着Raspbian和Armbian操作系统镜像的发展,现在你可以轻松地在嵌入式设备上使用Docker,比如树莓派和橙派。具体来说,这两种类型的设备及其各自的操作系统镜像现在支持足够高版本的内核,可以无需任何问题地安装Docker(至少版本3.10,但现在都提供4.x+版本)。

通过使用嵌入式Docker,您可以实现更快的变更速率。从我的经验来看,我已经测试并定期运行了你描述的方法。基本上,您从基本的操作系统镜像开始,例如Raspbian或Armbian,调整该操作系统使其足够安全且安装了Docker,然后使用Docker处理开发迭代和应用程序更新。

另外,如果您有兴趣在嵌入式Linux设备上运行Docker,则建议您查看我编写的免费、开源、MIT许可的命令行工具,以帮助开发人员一次性在多个设备上使用嵌入式Docker:https://github.com/ForwardLoopLLC/floopcli

即使您对该工具本身不感兴趣,该工具的文档描述了多种语言和多个设备上使用Docker化应用程序的模式:https://docs.forward-loop.com/floopcli/master/index.html。这些材料应该为将应用程序移植到Docker,然后在嵌入式设备上部署它们提供了一个起点。文档还解决了一些嵌入式设备微妙之处,例如ARMv6和ARMv7之间的差异。希望这可以帮助您入门!


1

1
仅提供链接的答案并不好,因为链接可能会失效 - 您能添加一个简要概述吗? - Rick Moritz

0
通常嵌入式系统的变化速度非常缓慢。Docker 在最小构建上很有效,然后再在其上进行分层。如果您想为了 Docker 的构建系统和稳定的变化速度而牺牲在最小嵌入式系统上运行 Docker 的开销,那么您可以探索一下它。

我们正试图避免的是缓慢的变化速度,而基于Docker构建的最小构建正是我们想要实现的——只是在这个方向上似乎没有清晰的路径。在这种环境下,资源对我们来说很便宜,特别是当任务足够简单以至于可以委派给一个简单的控制器时,开销甚至不是一个问题。 - Bobby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接