容器彻底改变了我们部署和管理应用程序的方式,提供了无与伦比的可移植性、可扩展性和一致性。 但是,您不应该被Docker所吓倒是时候深入研究使容器化成为可能的机制了。通过了解Docker的内部工作原理,您将更深入地了解这项技术,并对您的操作系统有更广泛的了解。 本系列的最后三篇文章铺平了道路。我们讨论了命名空间、控制组(cgroup)和覆盖文件系统。这些是我们今天用来创建我们自己的类似容器的环境的构建块。 这篇文章将指导您在不依赖Docker的情况下构建轻量级、隔离的环境。你还不能取代Docker!这仅用于教育目的。Docker提供的不仅仅是创建容器。然而,旅程才是最重要的。 您准备好揭开操作系统的秘密并将您对容器化的理解提升到一个新的水平了吗?系好安全带,喝杯咖啡,进入令人兴奋的没有Docker的容器化世界! 快速回顾 在本文中,我们将一头扎进激动人心的容器世界。五分钟后,您应该能够在您自己构建的类似容器的环境中运行您自己的Linux发行版。 正如我们在前言中所说,我们已经检查了今天将要使用的原语。但为了完整起见,这里有一个快速回顾:命名空间:命名空间是内核功能,允许您在单个Linux系统中创建隔离环境。每个命名空间都有自己的系统视图,这意味着命名空间内的进程不知道在其他命名空间中运行的进程。控制组:Linux控制组或cgroups是一项内核功能,允许管理员将CPU、内存和IO带宽等资源分配给进程组。覆盖文件系统:覆盖文件系统使多个较低层相互堆叠,从而创建数据的统一视图。在Linux容器的上下文中,覆盖文件系统用于将容器所做的更改分层放置在基础映像之上,同时完整地保留原始映像。 所以,现在我们知道了我们将使用的每个工具的作用,让我们开始使用它们。先入为主 BusyBox的磁盘大小在1到5Mb之间(取决于变体),是制作节省空间的发行版的非常好的组成部分。 要创建BusyBox容器,您通常会运行以下命令:dockerrunitrmbusybox 此命令将为您提供一个位于BusyBox容器内的外壳。今天我们将尝试在不运行dockerrun命令的情况下实现类似的功能。 所以,首先,让我们下载Image。为此,我们将使用一个名为Skopeo的工具。本系列文章都是关于容器的;因此,让我们利用他们的力量来下载我们想要的Image,而无需安装Skopeo。 在任何你喜欢的地方创建一个名为busyboximage的目录,然后运行以下命令:dockerrunvhomevagrantprojectscontainerexamplebusyboximage:busyboximagequay。ioskopeostablecopydocker:docker。iolibrarybusybox:latestdir:busyboximage 这是您应该看到的输出: 此命令会将您创建的目录作为Skopeo容器中的一个卷。然后,它会指示容器下载目录中的BusyBoximage。因此,如果您现在运行ls命令,您将能够在您创建的目录中看到下载的图像:lslabusyboximage 你会在那里看到一堆文件。我们关心的是最大的文件大小。让我们在一个新目录中解压它。首先,创建一个新目录并进入其中:mkdirbusyboxcdbusybox 现在解压busybox目录中的图像:tarxf。。busyboximage205dae5015e78dd8c4d302e3db4eb31576fac715b46d099fe09680ba28093a7a 再次运行thels命令;您将看到BusyBox映像的根文件系统: 返回父目录并新建三个:upper目录、workdir和root。我们已经在关于覆盖文件系统的帖子中介绍了这些内容:mkdirupperworkdirroot 现在,让我们创建覆盖文件系统:sudomounttoverlayolowerdirbusybox,upperdirupper,workdirworkdirnoneroot 伟大的!现在,如果您运行lslaroot,您应该能够在您创建的根目录中看到BusyBoxImage的内容。正如我们在覆盖文件系统教程中看到的,根目录提供了下层目录和上层目录的统一视图。但是,下层目录保持只读状态,您所做的任何更改都将记录在上层目录中。这将使我们的busybox基础镜像保持完整。 最后,让我们使用以下命令创建类似容器的环境:unsharemipunUrfchrootROOTFSbinbash 就是这样!你做到了!让我们运行unamer来验证我们是否在BusyBox容器中: 你甚至可以运行一个众所周知的命令,比如ping并观察你刚刚调用了它的BusyBox版本: 现在,缺少了很多东西。例如,您无法访问互联网。运行ping或wget将没有结果。但那是另一篇文章的内容类。正如我们所说,这不会是一个生产就绪的环境,而是为了揭开Docker所做的一些事情的神秘面纱。 如果您想限制容器玩具的资源消耗,请查看介绍中链接的控制组文章。这比你想象的要容易。总结 总之,在没有Docker的情况下创建类似容器的环境对于任何开发人员来说都是一项宝贵的技能。无论您是想探索替代技术、解决兼容性问题,还是只是想拓宽您对容器化的理解,本文介绍的技术和工具都将帮助您实现目标。 按照这个循序渐进的教程,您可以自信而轻松地构建自己的轻量级隔离环境。它会工作吗?还没有!坚持到下一篇文章! 请记住,容器化是一个不断发展的领域,而且总是有更多东西需要学习。因此,继续探索、试验并突破可能的极限!