在 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?请在下面的评论中告诉我们。
11 条评论