原文标题 :Mastering Containerization: A Guide to Creating Docker-Like Environments without Docker
掌握容器化:在没有 Docker 的情况下创建类 Docker 环境的指南
释放容器化的力量:构建类容器环境的分步教程。
容器彻底改变了我们部署和管理应用程序的方式,提供了无与伦比的可移植性、可扩展性和一致性。
但是,您不应该被 Docker 光滑的外观所吓倒——是时候深入研究使容器化成为可能的机制了。通过了解 Docker 的内部工作原理,您将更深入地了解这项技术,并对您的操作系统有更广泛的了解。
本系列的最后三篇文章铺平了道路。我们讨论了命名空间、控制组 (cgroup) 和覆盖文件系统。这些是我们今天用来创建我们自己的类似容器的环境的构建块。
这篇教育性博客文章将指导您在不依赖 Docker 的情况下构建轻量级、隔离的环境。你还不能取代 Docker!这仅用于教育目的。 Docker 提供的不仅仅是创建容器。然而,旅程才是最重要的。
您准备好揭开操作系统的秘密并将您对容器化的理解提升到一个新的水平了吗?系好安全带,喝杯咖啡,进入令人兴奋的没有 Docker 的容器化世界!
学习率是为那些对 MLOps 世界感到好奇的人提供的时事通讯。 MLOps 是一个广泛的领域,致力于以高效且可重复的方式将 ML 模型投入生产。容器在管道中起着至关重要的作用。如果您想了解更多关于此类主题的信息,请在此处订阅。您会在每个月的最后一个星期六收到我的来信,了解有关最新 MLOps 新闻和文章的更新和想法![0][1]
A Quick Recap
在本文中,我们将一头扎进激动人心的容器世界。在五分钟内,您应该能够在您自己构建的类似容器的环境中运行您自己的 Linux 发行版。
正如我们在前言中所说,我们已经检查了今天将要使用的原语。但为了完整起见,这里有一个快速回顾:
- 命名空间:命名空间是内核功能,允许您在单个 Linux 系统中创建隔离环境。每个命名空间都有自己的系统视图,这意味着命名空间内的进程不知道其他命名空间中运行的进程。
- 控制组:Linux 控制组或 cgroups 是一项内核功能,允许管理员将 CPU、内存和 I/O 带宽等资源分配给进程组。
- 覆盖文件系统:覆盖文件系统使多个较低层相互堆叠,从而创建数据的统一视图。在 Linux 容器的上下文中,覆盖文件系统用于将容器所做的更改分层放置在基础映像之上,同时完整地保留原始映像。
所以,现在我们知道了我们将使用的每个工具的作用,让我们开始使用它们。
Headfirst
BusyBox 的磁盘大小在 1 到 5 Mb 之间(取决于变体),是制作节省空间的发行版的非常好的组成部分。
要创建 BusyBox 容器,您通常会运行以下命令:
docker run -it --rm busybox
此命令将为您提供一个位于 BusyBox 容器内的外壳。今天我们将尝试在不运行 docker run 命令的情况下实现类似的功能。
所以,首先,让我们下载图像。为此,我们将使用一个名为 Skopeo 的工具。本系列文章都是关于容器的;因此,让我们利用他们的力量来下载我们想要的图像而无需安装 Skopeo。[0]
在任何你喜欢的地方创建一个名为 busybox-image 的目录,然后运行以下命令:
docker run -v /home/vagrant/projects/container-example/busybox-image:/busybox-image quay.io/skopeo/stable copy docker://docker.io/library/busybox:latest dir:/busybox-image
这是您应该看到的输出:
此命令会将您创建的目录作为 Skopeo 容器中的一个卷。然后,它会指示容器下载目录中的 BusyBox 图像。因此,如果您现在运行 ls 命令,您将能够在您创建的目录中看到下载的图像:
ls -la busybox-image/
你会在那里看到一堆文件。我们关心的是最大的文件大小。让我们在一个新目录中解压它。首先,创建一个新目录并进入其中:
mkdir busybox && cd busybox
现在解压 busybox 目录中的图像:
tar xf ../busybox-image/205dae5015e78dd8c4d302e3db4eb31576fac715b46d099fe09680ba28093a7a
再次运行 thels 命令;您将看到 BusyBox 映像的根文件系统:
返回父目录并新建三个:upper 目录、workdir 和root。我们已经在关于覆盖文件系统的帖子中介绍了这些内容:
mkdir upper workdir root
现在,让我们创建覆盖文件系统:
sudo mount -t overlay -o lowerdir=busybox,upperdir=upper,workdir=workdir none root
伟大的!现在,如果您运行 ls -la root,您应该能够在您创建的根目录中看到 BusyBox 图像的内容。正如我们在覆盖文件系统教程中看到的,根目录提供了下层目录和上层目录的统一视图。但是,下层目录保持只读状态,您所做的任何更改都将记录在上层目录中。这将使我们的 busybox 基础镜像保持完整。
最后,让我们使用以下命令创建类似容器的环境:
unshare -mipunUrf chroot ROOTFS /bin/bash
就是这样!你做到了!让我们运行 uname -r 来验证我们是否在 BusyBox 容器中:
你甚至可以运行一个众所周知的命令,比如 ping 并观察你刚刚调用了它的 BusyBox 版本:
现在,缺少了很多东西。例如,您无法访问互联网。运行 ping 或 wget 将没有结果。但那是另一次了。正如我们所说,这不会是一个生产就绪的环境,而是努力揭开 Docker 所做的一些事情的神秘面纱。
如果您想限制容器玩具的资源消耗,请查看介绍中链接的控制组文章。这比你想象的要容易。
Conclusion
总之,在没有 Docker 的情况下创建类似容器的环境对于任何开发人员来说都是一项宝贵的技能。无论您是想探索替代技术、解决兼容性问题,还是只是想拓宽您对容器化的理解,本文介绍的技术和工具都将帮助您实现目标。
按照这个循序渐进的教程,您可以自信而轻松地构建自己的轻量级隔离环境。它会工作吗?还没有!坚持到下一篇文章!
请记住,容器化是一个不断发展的领域,而且总是有更多东西需要学习。因此,继续探索、试验并突破可能的极限!
About the Author
我叫 Dimitris Poulopoulos,是 Arrikto 的一名机器学习工程师。我为欧盟委员会、欧盟统计局、国际货币基金组织、欧洲中央银行、经合组织和宜家等主要客户设计和实施了人工智能和软件解决方案。[0][1]
如果您有兴趣阅读更多关于机器学习、深度学习、数据科学和 DataOps 的文章,请在 Medium、LinkedIn 或 Twitter 上关注我@james2pl。[0][1][2]
表达的意见完全是我自己的,不表达我雇主的观点或意见。
文章出处登录后可见!