打开容器:深入研究虚拟化容器技术

梅丽莎·麦凯
开发人员主

容器已经成为应用程序开发生命周期中每个阶段不可或缺的一部分。生产级编配工具(如Kubernetes)已经被构建来管理它们,而Docker等容器平台在测试和开发中也越来越普遍。关于如何构建和管理的Web教程简单Docker映像比比皆是!但什么是容器为什么它们对DevOps生态系统如此重要?这篇演讲是为那些好奇的人准备的,他们想要深入了解表面之下,真正理解一项技术的机制,这项技术实际上存在的时间比你想象的要长。Docker从何而来?容器生态系统中的其他项目呢——有替代方案吗?Docker映像在文件系统上实际上是什么样子的?Docker映像层是如何工作的?什么是cgroups?系统资源是如何分配和管理的,有2022世界杯阿根廷预选赛赛程什么需要注意的问题吗?安全问题呢?怎么能JFrog容器注册表帮助我管理我的Docker图像?在这次演讲之后,您将对虚拟化容器技术的内容、方式和原因有一个坚实的理解。

视频记录

大家好,欢迎来到swampUP,欢迎来到这个关于集装箱开箱的演讲。我想快速开始,因为我很高兴能与你们分享我对容器的一些了解,当然,这些东西现在仍然很流行。我希望通过这次演讲,您能够更好地理解容器在您的系统中实际是如何工作的,以及隐藏在背后的一些实际情况。这一环节的问答将在聊天的同时进行。所以好好利用接下来的30分钟,把你的问题提出来。如果我在治疗期间找不到他们。之后我会跟你跟进的。简单介绍一下我,我叫梅丽莎·麦凯。

今年2月,我刚以开发者倡导者的身份加入JFrog。我有开发人员的背景,在过去20年里,我以某种方式、形式或形式成为了一名开发人员。我的大部分经验都是在服务器端开发和Java方面,但多年来我有幸在许多不同的团队中工作过,涉及各种不同的技术、语言和差异集。我想你们大多数人都知道,现在只使用一种语言并不容易。所以,掌握多种语言的经历对我来说是一段疯狂的旅程。我在大团队、小团队、大公司、小公司工作过。我也经历过挫折和成功,一路走来,我发现了一种深入了解事物的热情,分享我学到的东西,并希望在此过程中改进流程。几年前我开始演讲,我决定我要做更多的事情。所以,我冒着大雨成为了JFrog的开发倡导者。很明显,这一切都成功了,我今天在swampp和你们在一起。 So I feel privileged to be here with you and I’m super excited to talk with all of you today about virtual containers. So, let’s go ahead and get started. I’ll start out with a brief history to give some background context. Hopefully, it won’t be too boring. But there’s definitely some Milestones that have happened in the past that we should go over. So it better explains how we got to where we are today, then we’ll take a look at the container market, that’s interesting to see what’s been going on over the past few years, and it’ll be interesting to see what the next few years brings us. Then we’ll move into getting a real understanding of what Docker actually is. Docker is a very overloaded word term that is used and thrown around quite a bit. So we’ll clear that up. After that, we’ll be in an excellent place to talk about what a container actually is, and then we’ll review a few common container gotchas just a few simple things to avoid, stuff that I experienced right away when I started. Finally, I’ll leave you with an option for managing your images. So without further ado. Let’s jump in and start learning about containers. Now I know some of you are already wondering if you’re in the right place because that’s not the picture that you were expecting I’m sure. I know the classic shipping container photo is a pretty much expected, but there’s actually a couple reasons I chose to show bananas here. First and foremost, I’m tired of seeing shipping containers on every presentation about Docker, or containerization in general. So, I started a rebellion. You’re not going to see any shipping containers in this presentation.
其次,这实际上是一个关于我们的行业如何随着时间的推移而适应处理有限资源的故事,香蕉让我想起了我祖父在我成长过程中反复告诉我的一个故事,它是这样的:在他小时候,事情对我来说有很大的不2022世界杯阿根廷预选赛赛程同。我想每一代人都会对下一代人说,他继续分享说,当他还是个孩子的时候,他每年圣诞节都会得到一根香蕉。这一定是在20世纪20年代和30年代,香蕉在那个时候是一种享受,没有一根香蕉会浪费。他和他的兄弟姐妹们会用叉子刮香蕉皮,把香蕉的每一根都刮下来,因为明年可能不会再有香蕉了。也许这不是最好的类比,但我喜欢用这个故事来描述20世纪60年代和70年代的计算资源。2022世界杯阿根廷预选赛赛程
我知道这有点过分了,但是嘿,非常有限,非常昂贵,最重要的是要花很长时间才能完成任务。通常一台计算机会在很长一段时间内专门为一个用户执行一项任务。显然,时间和资源的限制造成了瓶颈和低效率。2022世界杯阿根廷预选赛赛程仅仅能够分享是不够的,还需要一种不妨碍彼此的方式来分享,或者让一个人无意中导致整个系统对所有人都崩溃。所以,需求是发明之母对更好的策略和共享计算资源的需求,实际上开始了创新之路,我们从今天看到了巨大的收益。2022世界杯阿根廷预选赛赛程有一些关键的时间点把我们带到今天的状态。我将从Chroot开始这节课。Chroot诞生于1979年,在Unix的第7版开发期间,并于1982年被添加到BSD中,能够更改进程及其子进程的根目录,从而产生了一些隔离,以提供一个环境,例如测试不同的发行版。所以Chroot是一个很好的想法,解决了一些具体的问题,但还远远不够。因此在2000年,FreeBSD引入了jail命令。
Jail比Chroot稍微复杂一些,它包含了额外的功能,可以帮助进一步隔离文件系统、用户和网络,并能够为每个Jail分配IP地址。2004年,Solaris Zones通过提供应用程序、完整的用户进程和文件系统空间以及对系统硬件的访问,使我们更进一步。Solaris Zones还引入了能够对文件系统进行快照的想法,您将看到这是非常重要的。2006年,谷歌带着他们的流程容器加入进来。这些后来被重命名为cgroup,它们围绕隔离和限制进程的资源使用展开。这是巨大的。在2008年,cgroups被合并到Linux内核中,它和Linux命名空间一起导致了IBM对Linux容器的开发。
2013年是重要的一年。Docker带来了包装容器的能力,并将它们从一个环境移动到另一个环境。同年,谷歌开源了他们的“let me container that for you”项目,该项目为应用程序提供了创建和管理自己的子容器的能力。从这里,我们看到了容器和Docker的使用,绝对的爆炸式增长。在2014年,Docker选择放弃LXE工具集,转而使用lidcontainer来启动容器,以利用原生的Golang解决方案。当我刚开始的时候,我并不知道Docker实际上是用Go编写的。
这节历史课差不多讲完了,因为从这里开始,你将开始看到大量的项目名称、组织规格等等。如果你没有更好地理解容器是如何工作的,你就会感到困惑,而这正是这节课的重点。然而,2015年6月发生的最后一件事非常重要,有必要把它提出来,因为它会让你深入了解市场变化背后的一些活动和动机。建立了开放式集装箱项目/倡议。这是Linux基金会下的一个组织,它的成员来自许多主要的利益相关者。包括Docker,它对于创建容器运行时的开放标准和镜像规范的目标非常重要。这节历史课就讲到这里。让我们来看看最近市场上关于容器运行时的情况。所以,我做了一些搜索,我发现在过去的三年中,Sysdig公司为Linux提供了一个非常强大的监视和故障排除工具;已经根据自己对用户的分析,拿出了容器报告。 Part of the report includes data on container runtimes that are in use. In 2017, they analyzed data from 45,000 containers. There’s no graph available for that because 99% of those were Docker. So, they didn’t feel the need to split up the results. In 2018, however, they doubled their sample size to 90,000 containers.
如你所见,83%是Docker, 12%是CoreOS RKT集装箱,4%是Mesos集装箱,1%是LXC。看起来其他容器运行时可能正在一点点蚕食Docker。接下来是2019年。这是最新的Sysdig集装箱报告,包括超过200万个集装箱的统计数据。他们确实陈述了包括来自SaaS和on-prem用户的数据。我不太确定在过去的两年里,它是否只是在prem上,或者为什么他们觉得有必要把这些信息放在那里。但是200万是个很大的数字,所以开始吧。Docker仍然保持相对强劲的79%,18%是容器的。但值得注意的是,container-d是Docker实际构建在其之上的运行时。我以后会告诉你更多的。 and the last 4% is Cri-o. So, I don’t know that there’s enough data here to determine whether Docker is going to stay on top in the future, or something completely different will prevail that remains to be seen. But it’s interesting especially because of what’s been happening over the last few years, which we’ll get to that later. But now that I’ve introduced a few of these other container runtimes that exist out there besides Docker; it’s time to start talking about what a container actually is, and what Docker actually provides in order to appreciate the differences between them. So, what exactly is Docker anyway? This is key. What Docker had over the players, the other players in the container game was this steadfast focus on commoditizing a complete solution, complete end-to-end solution that made it easy for developers to package, and deploy their applications.
一旦容器变得易于使用,我们都目睹了围绕容器的工具和资源的爆炸式增长,Docker图像格式上升为市场上事实上的标准。2022世界杯阿根廷预选赛赛程我向您展示的来自Sysdig的统计数据是特定于容器运行时的,记住这个术语很重要。我将解释使用容器所涉及的各个部分,您将立即理解Docker为什么会如此迅速地占领市场。作为用户,让我们想想我们需要什么才能让我们的应用运行起来。这一领域的每一项创新都纯粹基于用户的需要或想要。不管背后动机是什么。如果用户非常需要或想要某样东西,那么解决方案提供商就有巨大的机会。这似乎是一种常识,也许不值得说,但我们经常会发现自己陷得太深,以至于忽视了我们试图解决的实际问题。这当然会导致大量错失和忽视的机会。所以,这是一个需求列表,被分解成不同的特征。
首先,我们需要容器本身,你们中的一些人现在可能会问关于虚拟机的问题。这些都已经存在了,讨论最终结果超出了本次会议的范围。因此,我不打算深入讨论vm和容器之间的区别,或者为什么要使用其中一个而不是另一个。我想说的是虚拟机不是容器的同义词;最大的区别在于虚拟机本身包含一个完整的操作系统,而容器共享它们运行的系统操作系统。容器的重点是轻量级,并且能够无缝、快速地从一个环境移动到另一个环境。我知道在虚拟机领域有一些发展,但那是另一个话题了。
所以,这个列表的其余部分我们需要一个图像格式来定义一个容器。我们需要一种方法来构建容器的映像、一种方法来管理映像、一种方法来分发和共享容器映像、一种方法来创建、启动和运行容器环境,以及一种方法来管理运行中的容器的生命周期。我甚至都没讲到配器什么的但这足以证明我的观点了。所以道克已经准备好了所有问题的答案。你想开始使用容器,使用Docker引擎。哦,你需要一个图像格式,这是Docker图像格式。你需要一种方法来构建一个映像,使用Docker文件并调用Docker build。你想要共享你的图片或使用别人的图片,调用Docker push或Docker pull。哦,顺便说一下,我们有Docker Hub,你可以在那里存储和分享你的图片。您需要一个公众,您需要一种方式来启动、运行和管理您的容器及其生活方式。 You can call Docker run, Docker stop Docker ps.
Docker成功地快速满足了饥渴的容器市场的迫切需求,此外,Docker提供的工具集使这一切变得如此简单。这足以让他们一路走下去,获得巨大的市场份额。
顺便说一下,找到一张与这张幻灯片相关的香蕉图片真的很困难。所以,我希望你们喜欢这个。记得在历史课上我讲过开放容器倡议。在我们刚刚谈到的所有这些特征中,有两个是由OCI提出的。映像格式和容器运行时。Docker做了相当多的重组他们的代码库,开发抽象,提取伟大的功能。他们是OCI的重要贡献者。将Docker V2镜像规范作为OCI镜像规范和runC的基础,这是作为OCI运行时规范的完整实现的参考。还有很多其他的容器运行时,包括,containd, rkt, cri-o和Kata,它们都具有针对特定用例的不同级别的功能。值得指出的是,container实际上是由Docker贡献给CNCF原生云,并在内部使用runC。Containerd也已经集成到Docker中,它从1.11版本开始使用,所以现在已经有相当长的一段时间了。 So, the next few years will be interesting to observe what happens with these specs and how the OCI moves forward. It doesn’t seem that they’re done yet.
关于容器运行时的标准中应该包含什么,不应该包含什么,人们有很多不同的意见。很多人都在讨论这个问题。我在这里添加了几个很棒的链接,如果你好奇的话,可以从这里开始学习更多关于容器运行时的知识。第二篇文章是Ian Lewis系列博客的开篇。他是谷歌开发倡导者。那篇博客的第一个副标题是,为什么容器运行时如此令人困惑?我也附和了,是的,是的。为什么呢?总之,他很好地解释了一些问题。所以,现在我们了解了Docker需要的一切,以及市场上正在发生的一些事情。 Let’s focus on just the container itself and what that actually looks like on your system. I’ll show you how it’s stored and what is actually happening under the covers. You’ll discover pretty quickly that images and containers aren’t really all that magical. So, my first experience with containers was as a new developer on a project with a tight deadline.
当然,我认为这是对大多数项目的病态描述。对我来说,最好的做法是立即开始在我的本地机器上启动并运行一些东西。我从实践中学得最好,Docker文档实际上非常好。所以,如果你发现自己也有类似的情况,我建议你去看看他们的入门文档,我在这里分享了一个链接。我通过这个指南会让你,对你需要的很多Docker命令感到舒服。首先要注意的是,Docker映像只是一个完整文件系统的tarball。当一个映像在您的系统上实际解包时,它只是被扔到它自己的目录中,该目录成为它的根文件系统。第二,运行容器所涉及的进程只是普通的Linux进程。
他们真的没什么特别的。从技术上讲,您可以创建并运行容器,而不需要调用适当的Linux命令。因此,名称空间是值得指出来的。这是非常重要的成分,因为这是用来提供容器之间的虚拟分离。这就是一个容器内的进程,不要干扰另一个容器内的进程。在这里,您可以看到一些为postgres容器设置的名称面,我在我的盒子上运行。cgroups功能对于限制容器可以使用多少东西是不可或缺的,比如CPU、内存、网络带宽等等,当我启动一个映像时,我可以通过在Docker run命令中包含选项来设置这些限制。你可以在这个例子中看到。
我限制了其中一个容器的内存使用限制。这不是用来证明正确的,正确的极限。看起来在Docker的后续版本中已经修复了。因此,我想快速地忽略一些文件系统细节,其中容器和图像实际上存储在文件系统中。首先,在你安装了Docker之后,运行Docker info命令会显示出一堆关于你的安装的信息,包括你的Docker根目录,我在这里已经提到过了。这是你所关心的关于Docker映像和容器的大部分内容将被存储的地方。
注意,如果你在Mac上,你的容器实际上运行在一个小型的Linux虚拟机上。你需要使用一个屏幕,或者其他东西来进入那里,并实际进入Docker根目录来检查它。如果你不熟悉如何使用screen命令,一定要先熟悉它。如果你没有以正确的方式进入和退出屏幕,它会很好地打乱你的文本显示。如果你以前没做过,会有点沮丧。本幻灯片展示了如何获取有关存储在系统上的图像的信息。首先,我使用Docker images命令列出了可用的图像。我实际上已经安装了几个,但我只列出了前一对在这里显示。使用Docker inspect命令。我可以使用图像ID检查我喜欢的任何图像。
原谅我。这会吐出大量的信息。但这里我想强调的是图形驱动程序部分,其中包含指向属于该图像的所有层所在目录的路径。因此,Docker映像由层组成,层表示Docker文件中最初用于构建映像的指令。这些层实际上转换为目录,为了节省空间,可以在图像之间共享这些层。下目录、合并目录和上目录部分很重要。lowerdir包含用于构建原始映像的所有目录或层。这些都是只读的。上层目录包含了容器运行时修改过的所有内容。重要的是要记住,这是短暂的数据,并且只有容器存在的时间才存在。 In fact if you have data that you intend to keep you should utilize the volume features of Docker, and mount a location that will stick around after the container dies.
这是大多数运行数据库的容器的运行方式。mergedir就像一个虚拟目录,它结合了从lowerdir到upperdir再到workdir的所有内容。工作目录就像一个内部目录。这张幻灯片显示,实际上我的系统上运行了一些容器,其中两个是本地的JFrog容器注册表安装,其中包括一个用于Artifactory的容器,另一个用于postgres数据库的容器。另一个是一个简单的测试容器,我一直在摆弄它。实际上,我清理了我的系统,这样我就可以得到一些干净的屏幕截图。在此之前,我有大量的图像和容器正在运行。不管怎样,请注意正在运行的容器的容器id与容器子目录名称相匹配,然后还要记住这里的其他内容。
哦,如果你停止一个容器,相应的目录不会消失,直到容器被实际删除。使用Docker remove命令。所以,如果你停止了,如果你停止了到处都是从未清理过的容器,你可能会看到你的可用空间开始减少。Docker有一个修剪命令,你可以时不时地使用它来帮助清理东西。因此,围绕构建和运行映像和容器的工具集使事情变得如此简单,以至于在一些地方也很容易搬起石头砸自己的脚。以下是我遇到的3个最常见的陷阱,当我第一次开始使用容器时,我几乎马上就遇到了这些陷阱。
第一种是,作为根用户运行容器化应用程序。在这里我要诚实地说,当我最初建立和运行容器时。我对它的工作效果感到非常兴奋,所以我没有把它当回事。我听到了,但我没有,你知道,它没有落地。现在你知道这个进程在一个运行的容器中就像系统中的其他进程一样。我会遇到一些限制条件。现在在容器中以根用户身份运行是很可怕的。这样做可以使进程摆脱容器的预期限制,并获得对主机资源的访问权。2022世界杯阿根廷预选赛赛程这正是我们不希望发生的。最好的方法是创建一个用户,并在容器构建时在Docker文件中使用user命令,以便运行该用户的进程。
当使用Docker run命令时,有一种方法可以指定用户,但这可能会导致忘记这样做。如果映像只是默认设置,而不是以根用户运行,那就太好了。还要注意从Docker Hub中提取的官方映像,无论它们是否以根目录运行,或者它们是否让您自行判断。因此,尽管Docker为你提供了在容器上设置资源限制的能力。它不会自动为你做这些。事实上,默认设置对所有人都是免费的,没有任何限制。因此,确保您了解应用程序的资源需求,太少的容器会饿死,太多的容器会窒息系统上的其他容器。容器的资源使用情况也是您希望随时监控并根据需要进行调整的内容。这是一种很好的方法,可以确定是否出现了问题,或者系统上的负载是否由于某种原因发生了变化。所以,这是一个相当大的安全问题。
当您构建映像时,很容易变得自满,而不注意实际引入了什么。你不仅需要提防你在Docker文件中指定的过时版本,还需要注意基本映像中的内容来自哪里。不更新容器内库中的包可能会导致一些令人尴尬的结果,特别是现在有可用的工具可以在发现特定工件的安全问题时提醒您。说到帮助管理图像的工具。JFrog Artifactory支持Docker注册表和镜像。您可以像使用其他类型的工件一样使用它,既可以作为基于第三方的映像的现金,也可以作为您自己的内部注册表。上传Docker图像后,你可以收集统计数据,甚至可以深入到图像的每一层以获取更多信息。如果集成了CICD解决方案,还可以确定哪个构建生成了特定的映像,或者哪个构建使用了该映像。我们之前讨论过不定期更新图像的问题,JFrog Xray是一个安全扫描工具,如果存在任何已知的安全漏洞,甚至是您的工件的许可问题,它会提醒您。对于Docker图像,它尤其有用,因为它能够深入到图像的各个层中,以确切地找出哪些库或包被标记为问题。 You have control over how sensitive to make these alerts, and what actions to take when they’re triggered Whether to fill a build, prevent a download, or simply send a notification about the problem. All right. We’ve come to the end of our time here.
谢谢大家的到来。我希望你们喜欢这次会议,希望你们从中得到一些东西可以带回给你们的团队,如果有任何问题,请随时联系我。享受剩下的沼泽在线。

试试JFrog免费!