Raspberry Pi 非常适合安装各种必须运行的程序。最可靠的方法是使用 Docker:这样每个程序都在容器中隔离运行,因此它们不会相互干扰。我们将向您展示如何在 Raspberry Pi 上使用 Docker 以及您应该注意的事项。
如果您已经使用 Raspberry Pi 一段时间了,您很有可能会继续在其上安装越来越多的软件。 Home Assistant、Zwave2Mqtt、Node-RED、Rhasspy……一切顺利,直到您将所有软件更新到新版本,突然您的一个程序停止工作并给出模糊的错误消息。
发生了什么?一个常见的场景如下。软件A和B都使用库C的1.0版本。同时发布了库C的2.0版本,与C 1.0不兼容。软件 A 正在被重写以使用库 C 2.0,而软件 B 的开发人员并没有那么快,并且会坚持使用库 C 1.0 一段时间。您更新软件 A 并安装库 C 2.0。但是 Raspbian 只能安装一个版本的库。结果,软件B突然不再工作,因为它与库C 2.0不兼容。
在实践中,Linux 发行版尽其所能避免这种情况,但它确实发生了。有时以更微妙的方式,因此导致问题的原因并不总是很明显。
01 什么是码头工人?
Docker 使开发人员可以轻松分发应用程序,以便您可以在任何 Linux 系统上运行它们。这些应用程序可以在 Docker Hub 上以镜像的形式找到。这样的镜像基本上是一个最小化 Linux 系统的模板,你可以以容器的形式运行在 Raspbian 之上。
每个容器都与其他容器完全隔离。所以一个容器中的应用程序看不到其他容器中的应用程序。并且安装和更新一个容器可以确保新版本不会与其他容器中的应用程序冲突。因此,如果您想在 Raspberry Pi 上运行多个应用程序,Docker 将帮助您可靠地做到这一点。多亏了 Docker,您还可以安全地试用新软件:您不喜欢它,然后删除容器即可。
02 安装 Docker
我们假设您已经安装了 Raspbian,Lite 版本就足够了。然后通过 ssh 登录以执行本基础课程中的命令。首先,使用以下命令安装 Docker:
curl -sSL //get.docker.com |嘘
然后给用户 圆周率 (使用您登录的)访问 Docker,因此您不会使用该命令运行所有 Docker 命令 须藤 必须执行:
sudo usermod pi -aG docker
退出并退出,然后重新登录。现在用户属于 圆周率 给小组 码头工人.
03 世界你好
您现在应该能够启动第一个 Docker 容器:
码头工人运行--rm hello-world
此命令将运行 Docker 容器 hello-world。该容器在其输出中显示了究竟发生了什么:在您的 Raspberry Pi 上找不到该映像,然后 Docker 从 Docker Hub 下载该映像。然后Docker基于这个镜像创建一个容器并运行其中的程序。通过选项——R M 程序关闭后,容器被清理。您现在知道 Docker 已正确安装并正常工作。
希普里奥
在本基础教程中,我们将简单地在 Raspbian 上安装 Docker,但如果您对 Raspberry Pi 上的 Docker 感兴趣,也可以使用其他操作系统。例如,有 Hypriot:一个用于 Raspberry Pi 的操作系统,它针对使用 Docker 进行了优化。然后,您只需将该映像安装在 Raspberry Pi 的 micro-SD 卡上,您就可以立即开始使用 Docker。如果您只是在 Raspberry Pi 上运行 Docker 容器而不是其他任何东西,那么 Hypriot 会特别有趣。
04 创建容器
使用 Docker 容器的基础知识是通过命令完成的 码头工人,正如我们在上一步中展示的那样。通常使用 Docker,您不想运行容器并立即关闭它,而是让它运行。所以我们不使用选项 --R M.另外,您希望该容器在后台运行,而不会一直在屏幕上看到输出。选项 -d.
如果你以这种方式启动一个容器,Docker 会给它一个随机名称,如果你有多个容器,这没有用。随着选项 --name 名字 因此,您可以为容器指定一个固定名称。
然后您还必须查看网络连接。由于每个 Docker 容器都是隔离的,因此您不能仅访问例如在容器中的端口 80 上运行的 Web 服务器。因此,您必须指示 Docker 将树莓派上 8888 端口上的每个请求转发到特定容器中的 80 端口。你用这个选项来做到这一点 -p 8888:80.将示例容器 containsous/whoami 的所有这些选项放在一起,运行以下命令:
docker run -d --name whoami -p 8888:80 containsous/whoami
如果一切顺利,过一会儿你会看到一长串十六进制数字(比如 5122c935ce5178751a59699d2c5605c607700bd04e5f57a6c18de434ae53956e)。这是容器的 ID。如果您现在在 Web 浏览器中浏览 //IP:8888 用代替 知识产权 Raspberry Pi 的 IP 地址,您将在容器中看到由 Web 服务器生成的网页。
05 查看您的容器
一旦你启动了几个这样的容器,管理就开始变得重要了。首先,查看哪些容器正在运行很有用:
码头工人
然后,您将看到有关所有活动容器的信息(使用选项 -一种 包括已停止的容器)。第一列包含每个容器的唯一 ID,旁边是创建容器的映像。专栏 地位 如果你有问题,最好。例如,如果您的容器因问题而不断重启,您将在此处看到它。
在列 港口 你会看到使用的端口。例如,在我们的容器前面 whoami 是 0.0.0.0:8888->80/tcp.这意味着 Raspberry Pi 上的 tcp 端口 8888 将被重定向到容器上的 tcp 端口 80。在最后一列中,您会看到容器的名称,您可以在进一步的 Docker 命令中使用该名称。
如果你想了解更多信息,命令来了 码头统计 有用。然后您将看到每个容器的统计信息,例如处理器、内存和网络的消耗。如果您想要 Docker 知道的有关特定容器的所有信息,请使用容器的 ID 或名称运行此命令:
码头工人检查容器
最后,如果要查看容器的日志,请运行以下两个命令之一:
码头工人日志容器
docker 日志 -f 容器
随着选项 -F 在容器生成日志时实时跟踪日志。
06 管理您的容器和镜像
如果要停止、启动或重新启动正在运行的容器,可以分别使用以下命令轻松完成:
码头工人停止集装箱
docker 启动容器
docker 重启容器
如果要暂时暂停容器(其中的所有程序都将被暂时“冻结”),请运行以下命令:
码头工人暂停容器
执行此命令后,容器中的所有程序将再次运行:
码头工人取消暂停容器
随着命令 码头工人图片 您将看到 Docker 已下载的镜像列表。对于我们的 whoami 容器,请参见专栏 存储库 文本 包含/whoami 站在列中 标签 站立 最新的.图像的全名将是 包含/whoami:最新 是,但那些 最新的 是标签的默认值,所以可以省略。这就是为什么,在我们在第 4 节的作业中,我们 码头工人 只是 包含/whoami 作为图像。
在列 创建 看看这张图片是多久前下载的。要更新此映像,请运行以下命令:
docker pull 包含/whoami:最新
然后 Docker 下载最新版本的镜像或告诉您镜像是最新的。如果你之后再做 码头工人图片 您将看到已添加图像。
但是当前的 whoami 容器仍然使用旧图像。要升级它,请停止 (码头工人停止whoami) 并删除 (码头工人 rm wohami) 创建容器,然后使用第 4 节中的 docker run 命令重新创建容器。
清理
如果您定期更新 Docker 映像以在容器中运行最新版本,则旧映像将保留。容量最多只有几十 GB 的 Raspberry Pi 的 micro-SD 卡可以快速填满,尤其是在运行大型容器时。例如,来自 Home Assistant 和 Rhasspy 的容器的大小超过 1 GB。现在 Docker 与一个系统一起工作,因此更新后不会下载并再次存储满 GB,但经过多次更新后,所需的存储空间会继续增加。随着命令 码头工人 rmi IMAGE_ID 根据您在命令输出中指定的 ID 删除图像 码头工人图片 发现。 Docker 也知道命令 docker镜像修剪 这将删除容器未使用的所有图像。的 docker系统修剪 还删除停止的容器、至少一个容器未使用的网络和缓存文件。
07 卷
我们的示例容器 whoami 没有使用任何配置数据或数据。但是您可以与 Docker 容器共享 Raspberry Pi 上的目录,以便它可以从中访问数据。 Docker 将这样的共享目录称为卷。
如果您要在 Raspberry Pi 上使用多个容器,建议您将它们的目录放在一起。为此创建一个目录,例如:
mkdir -p /home/pi/containers/nginx/data
然后放入文件夹 容器/nginx/数据 一份文件 索引.html 带有 html 页面。
然后,您现在可以使用与共享此目录的 nginx(Web 服务器)启动一个容器:
docker run -d --name nginx -p 8080:80 -v /home/pi/containers/nginx/data:/usr/share/nginx/html:ro nginx
然后容器用web服务器启动并挂载目录 /home/pi/containers/nging/data 在该位置的容器中的 Raspberry Pi 上 /usr/share/nginx/html, 具有只读权限 (罗 代表只读)。如果你现在上网 IP:8080 你有html文件吗 索引.html 查看。
08 Docker Compose
到目前为止,我们已经使用命令手动启动了 Docker 容器 码头工人.但是,如果您正在运行多个 Docker 容器并希望定期更改它们的配置,那么另一种方法会更好:将所有内容放在一个配置文件中。这适用于 Docker Compose。
为此,首先安装 Python 的包管理器 pip,然后使用以下命令安装 Docker Compose(这是一个 Python 程序):
sudo apt 安装 python3-pip
须藤 pip3 安装 docker-compose
现在您可以在一个文件中配置多个 Docker 容器 docker-compose.yml 使。为此,请使用以下命令创建 Docker Compose 文件:
纳米 docker-compose.yml
为我们的示例容器 whoami 和 nginx 放入以下配置:
版本:'3.7'
服务:
我是谁:
图片:containous/whoami
容器名称:whoami
重启:总是
港口:
- 8888:80
nginx:
图片:nginx
容器名称:nginx
重启:总是
港口:
- 8080:80
体积:
- /home/pi/containers/nginx/data:/usr/share/nginx/html:ro
09 YAML
使用 Ctrl+O 保存文件并使用 Ctrl+X 退出 nano。这是一个 YAML 文件(扩展名为 .yml)。 YAML(代表递归缩写“YAML Ain't Markup Language”)是一种以可读方式定义配置数据的文件格式。更多信息可以在官方网站上找到。
您可以在此文件中看到我们将两个容器定义为服务。对于每个容器,我们定义了使用的镜像、容器的名称以及容器是否应该在出现问题时自动重启。此外,我们还定义了重定向端口和卷。
您还可以在命令行上找到所有这些信息 码头工人,但在这个 Docker Compose 文件中,它更有条理。
10 使用 Docker Compose
一旦你有一个文件 docker-compose.yml 您可以轻松创建和运行其中定义的容器:
docker-compose up -d
之后,您可以使用 docker 命令管理这些容器,但是 docker-compose 本身也有很多选项专门用于管理您使用 Docker Compose 创建的容器。这是您使用以下命令清理所有内容的方式,所有定义的容器都将被停止和删除:
码头工人写下来
您还可以通过以下方式跟踪所有容器的日志:
docker-compose 日志 -f
每个容器以不同的颜色显示其日志消息。 Docker Compose 也有一个熟悉的停止、启动和重新启动所有容器的调子:
码头工人撰写停止
码头工人撰写开始
docker compose 重启
使用以下两个命令更新 Docker Compose 文件中的所有容器:
码头工人组成拉
docker compose 重启
第一个命令将为您定义的所有容器下载新映像,第二个命令将重新启动所有这些容器,以便它们使用新映像。之后,您可以根据需要删除旧图像:
docker镜像修剪
11 及以后
您可以在 Docker Hub 上找到许多应用程序的 Docker 镜像。在 LinuxServer.io 上,您还可以找到许多由志愿者维护的 Docker 镜像。这些图像得到了很好的维护和记录,它们都使用类似的方法和基本基础设施。
尝试将自己限制在由项目本身提供的“官方”Docker 映像或来自可靠方(例如 LinuxServer.io)的映像。因为原则上任何人都可以在 Docker Hub 上发布 Docker 镜像,但它们并不总是保持最新。
正确的处理器架构
为正确的处理器架构下载 Docker 镜像很重要。 Raspberry Pi 具有 ARM 处理器,该处理器与 PC 中的 Intel 或 AMD 处理器不兼容。发布了许多 Docker 映像以自动下载适合您的处理器架构的正确版本。在 Docker Hub 上,您会在所需的 Docker 镜像页面下找到支持哪些架构。对于 arm32v7、arm/v7 或 armhf 的 Raspbian。如果在启动 Docker 容器时收到错误消息: 执行格式错误 您可能下载了错误处理器架构的图像。如果发生这种情况,您将需要下载具有不同标签的图像。例如,motionEye 项目使用两个可能的标签分发其官方 Docker 映像:您运行 ccrisan/motioneye:master-amd64 在 Intel 兼容处理器和 ccrisan/motioneye:master-armhf 在树莓派上。