在 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。我按照一个 有用的教程 来完成此操作,并建议您也这样做,因为自己构建它可能是一个重大挑战。该教程基于 Raspberry Pi 版本的 Arch Linux 作为主机操作系统,我选择了它以保持简单。由于我习惯在台式机上使用 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,它为我设置了一切。有一些额外的节点我想添加,经过一些修改后,我也让它启动并运行了。

在这一点上,值得问一下,那又怎样?我难道不能直接在我的 Pi 上安装 Node-RED 吗?当然,我可以。但是现在,当我想“保存”一个项目时,我只需要保存 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 + Raspberry 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

感谢这篇精彩的文章。想尝试 Docker 一段时间了,现在是时候利用 Raspberry Pi 了。

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.