在 Raspberry Pi 上体验 Docker

还没有读者喜欢这篇文章。
open source button on keyboard

Opensource.com

在 Opensource.com,我的日常工作让我有机会了解许多非常有趣的新兴技术。但我并不总是有机会亲自深入探索它们。上周末,我抽出一些时间来做这件事。

几年来,我一直是 Raspberry Pi 的爱好者,我使用 Pi 更多的是作为一个学习新事物的平台,而不是一个工具,无论是微电子学还是仅仅尝试一个新软件。更多时候,我的实验涉及到擦除 SD 卡,然后重新开始,干净地安装我感兴趣的任何发行版。这很有效,而且手边留着几张额外的 SD 卡也很有帮助,但最终,我想,一定有更好的方法。

解决方案

隆重推出 Docker。Docker 是一个使用 Linux 容器的工具,容器本身就是一个有趣的话题。简而言之,你可以将它们视为非常轻量级的虚拟机,它们可以在主机上并排运行,速度接近原生速度。实际上,Docker 容器根本不是虚拟机,而是进程,这些进程在(几乎)完全隔离于主机上的其他进程的情况下运行,并随身携带完整的实用程序和库包,以帮助该进程运行;基本上,这是一个仅为所选应用程序精简的操作系统。

关于容器还有很多要说的,而且您读到的关于容器的大部分内容都与它们在数据中心的使用有关,在数据中心,它们可以帮助应用程序并排安全运行,同时使用的资源比专用虚拟机更少。Docker 对于开发人员来说也是一个很棒的工具,就像 Vagrant、Puppet、Ansible 等工具通过让您在代码中定义您的操作环境,而不是手动编辑大量配置文件,并让您对其进行版本控制、复制并轻松复制到其他机器,从而帮助了传统虚拟机一样。

作为一名 Raspberry Pi 爱好者,这种轻松复制我的环境的方式对我很有吸引力,并且在 Raspberry Pi 的内存和处理能力的限制下,虚拟机被排除在实现这一目标的手段之外,所以我想要看看我是否可以在我的 Raspberry Pi 上启动并运行 Docker,然后试用一下。

局限性

在我们开始之前,请允许我发出一个警告:这个实验是关于玩耍和学习的。如果您计划在您碰巧拥有的旧型号 Raspberry Pi 上运行任何关键任务的 Docker…好吧,我不会告诉您这是不可能的,但请务必进行研究并充分了解您正在做什么。

我遇到的第一个挑战,对于任何花时间使用 Raspberry Pi 的人来说,这将是显而易见的,那就是您需要一些耐心。我的旧 Raspberry Pi Model B 的运行频率为 700 MHz,只有 512 MB 的内存。曾经,这似乎快得不可思议,但由于我已经习惯了拥有速度快得多的台式机和笔记本电脑,所以可以肯定地说,与您习惯的速度相比,构建容器可能会显得很慢。

第二个挑战也相当明显,但值得牢记。虽然您可能在计算机上运行 x86 处理器,但您的 Raspberry Pi 的处理器使用 ARM 芯片组,因此如果您不能将容器从您的主计算机复制到您的 Pi 并使其工作。您当然可以在本地编写 Dockerfile(定义容器内容的文本文件)并将其复制过来,并且您始终可以将容器的内容建模为类似的 x86 容器,但您必须在 Pi 上实际构建它,除非您碰巧手边有一台更快的基于 ARM 的计算机。

开始

首先,我需要安装 Docker。我按照一个 有用的教程 来完成此操作,并建议您也这样做,因为自己构建它可能是一个重大挑战。该教程基于 Arch Linux 的 Raspberry Pi 版本作为主机操作系统,我选择了它以保持简单。由于我习惯在台式机上使用 Fedora,并且有一段时间没有玩我的 Pi 了,所以我花了几分钟的时间搜索,以提醒自己如何使用 ifconfig 而不是 ip 来设置网络,同样,使用 pacman 而不是 yum/dnf 来更新系统,但这些都是小障碍。

实际上,安装 Docker 很简单,因为它在默认存储库中。在 pacman -S docker 安装和 systemctl enable docker 启动守护程序之后,我就启动并运行了。

我找到了一个基于 Raspbian基础镜像,它似乎是一个不错的起点,然后我创建了一个简单的 Dockerfile 来启动一个基于我找到的模板的基本 Web 服务器,启动了一个 docker build,然后…看着它失败了。好吧,也许我第一次尝试做得过头了,让我尝试更简单的东西。

接下来,我将其简化,再次尝试,但仍然失败,并抱怨证书。在花了一些时间搜索之后,我意识到证书可能由于时间问题而失败。果然,快速使用 date 命令检查告诉我,我的 Pi 认为现在是 1 月 1 日,而且是几年前。在使用 timedatectl set-time 更正问题后,我再次尝试,它成功了!我的容器已构建并成功启动。使用 docker ps 我可以看到我的容器正在工作,并且我可以连接到我指定的端口。

下一步

现在它正在工作了,接下来我应该尝试什么?我发现自己不断回到我的 Pi 上的一个项目是 Node-RED,它被自我描述为“用于连接物联网的可视化工具”。您可以将其视为 IFTTT 的开源版本,它允许更高程度的自定义,特别是如果您愿意编写少量 JavaScript。

果然,我不是第一个有这种想法的人。我在 GitHub 上找到了一个有用的 Dockerfile,它为我设置了一切。有一些额外的节点我想添加,经过一些修改后,我也让它启动并运行了。

在这一点上,值得问一下,那又怎样?难道我不能直接将 Node-RED 安装到我的 Pi 上吗?当然,我可以。但是现在,当我想“保存”一个项目时,我只需要保存 Dockerfile,我就可以在任何 Pi 上运行它,并且安装非常容易。如果我有自定义代码要导入到 Pi 上,可能是为了与 Arduino 通信或闪烁一系列灯,我可以让该代码在容器启动时拉入。我可以轻松地在代码中修改它,并保存该修订版。我可以尝试不同的 Linux 发行版用于我的 Pi,而无需擦除卡。我可以与远在千里之外的朋友分享想法,他们可以快速轻松地复制这些想法,而无需移动大型文件。 

对我来说,这是一个非常棒的工具。

您怎么看?您是否在 Raspberry Pi 上尝试过 Docker?请在下面的评论中告诉我们。

User profile image.
Jason 是 Opensource.com 的员工和红帽员工,任职时间为 2013 年至 2022 年。此个人资料包含他在该期间与工作相关的文章。其他贡献可以在他的个人帐户中找到。

11 条评论

查看 DockerCon Raspberry Pi 挑战赛:http://blog.docker.com/2015/09/update-raspberry-pi-dockercon-challenge/

Damien Duportal 目前保持着在 Raspberry Pi 设备上运行 2334 个 Docker 容器的记录。

感谢您的文章!

Docker + Rasperry Pi 是一个诱人的组合。hypriot 社区在这方面取得了很大的进步

http://blog.hypriot.com/

非常有趣。我有一台 Raspberry Pi Model B,并且曾考虑在其上尝试 VirtualBox,但现在这听起来更有趣。感谢分享。

我正在将 Docker 与 Arch Linux ARM 一起使用。现在运行 Transmission 下载不同的 Linux 发行版 ISO。开销非常小,但我必须插入一个外部磁盘来存储文件,以延长 TF 卡的寿命。:)

我很惊讶没有人想到在 x86 上为 ARM 交叉编译,而不是直接在 Pi 上构建,我认为 CPU 周期是问题所在。这是一种典型的嵌入式工程师思维方式,但大多数人不是。看看哪种方法更直接会很有趣。

听起来像是一种值得追求的方法。您是否碰巧知道有关入门的好教程?

回复 作者:JJ (未验证)

同意。我也在想同样的事情。在 x86 上设置 gcc 进行交叉编译需要一点时间,但已经有人做过了。我最近设置了 gcc 在我的 Mac 上交叉编译 MIPS。这并没有那么糟糕。

回复 作者:JJ (未验证)

使用 alpine linux 镜像,您可以自己构建,它超级快速且体积小巧 https://github.com/hypriot/rpi-alpine-scratch

我一定会查看一下,谢谢!

回复 作者:atomi (未验证)

感谢这篇好文章。想尝试 Docker 一段时间了,是时候让 Raspberry Pi 发挥作用了。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.