在 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 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 的工作人员和 Red Hatter,时间从 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

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

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