容器详解(非开发人员撰写)
由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!
节日快乐!我想在年底前再写一篇博文,所以特意选了个特别有趣的话题来为2020年画上句号。让我们一起来看看神秘、难以捉摸却又神奇的容器(没错,我就是这么称呼它的)。在做研究之前,我一想到容器,第一个想到的就是Docker和他们可爱的蓝鲸。我想象着一个特百惠的容器,里面有几个隔间(就像日式便当盒),每个隔间里放着不同的食物。当你打开这个容器,把所有食物都吃完,就能得到一顿营养均衡、能量满满的午餐。现在是不是已经迫不及待地想去吃午饭了?
容器历史
所以,大家是不是都觉得容器技术是比较新的概念?还是只有我这么想?哎呀,告诉你个秘密,它们比我们想象的要古老得多!我找到一篇文章,说容器技术可以追溯到1979年Unix V7发布的时候。Unix V7允许用户使用系统调用chroot,这意味着他们可以将进程的根目录重定向到文件系统中的新位置。因此,进程隔离是一种简单有效的进程隔离方法,也是后来容器化技术的核心组成部分。进程隔离的例子包括:阻止进程A访问进程B使用的内存,以及阻止进程B打开进程A已经打开的文件。这样,进程A和进程B就永远不可能同时存在……现在我感觉自己好像在写下一个罗密欧与朱丽叶的故事了。
2000 年,科技界蓬勃发展。它虽然年轻,但正稳步迈向辉煌。有些人可能将这段时期称为“互联网泡沫”。容器技术的首次实现是在FreeBSD 系统的一种名为 jails 的新机制中。jails 的目标有三个:虚拟化、安全性和易于委派。这里的易于委派指的是系统管理员能够分配和委派一些需要超级用户权限的任务,而无需授予对系统的完全控制权。虚拟化意味着每个 jail 都是一个运行在宿主机上的虚拟环境,拥有自己的文件、进程、用户和超级用户账户,从而将每个环境完全隔离。从 jail 中的进程来看,该环境几乎与真实系统无异。以上内容直接引自 jails 的维基百科条目。
到 2001 年,Linux 上已经出现了容器技术,这要归功于 VServer 项目。该项目由 Jacques Gélinas 创建,它允许用户在一台服务器上运行多个 Linux 服务器,同时保持安全性和独立性。此后,容器技术不断发展完善,市场上涌现出各种各样的产品,例如 Solaris Containers、OpenVZ、Process Containers、LXC、Warden 和 Let Me Contain That For You(我喜欢这个名字!)。2013 年,Docker 横空出世,成为市场上的领军企业,并一直保持着容器技术的领先地位。如果您想了解更多关于上述技术的信息,可以阅读这篇精彩的总结。
容器究竟是什么?
那么,为了更好地理解容器这种神秘的技术,我应该向谁求助呢?当然是 Docker!我最初对容器的描述并非完全错误。Docker 将容器软件称为“包”,我个人更喜欢用便当盒来比喻,但我算是“吃货”,所以用食物来描述事物更容易理解。以下是 Docker 的定义:
“容器是一种标准软件单元,它将代码及其所有依赖项打包在一起,从而使应用程序能够在不同的计算环境中快速可靠地运行。”
图片来源:https://www.docker.com/resources/what-c ontainer让我们来分析一下这个定义。这里的“软件单元”指的是容器,它代表一种技术,一个单一的“东西”。哎呀,我又用了“东西”这个词。我的理解是,虽然有些应用程序可以包含多个方面,但容器则不然。当我们把代码及其所有依赖项打包在一起时,这一点就显得尤为重要。所以,回到我之前提到的便当盒比喻。容器就像一道菜。应用程序是由多个相互协作的容器构建而成,就像便当盒是由多道菜组成一样。与我最初对容器的理解不同的是,重点不在于便当盒里的食物,而在于当你把食物装进盒子里时,你可以轻松地把它带到任何你想去的地方。同时,它也关乎确保食物之间不会相互接触……你肯定不希望汤和米饭混在一起。
容器包含了应用程序运行所需的一切,使其能够在隔离的环境中运行,这样你就可以轻松地将应用程序迁移到不同的计算环境中。哪个更快?是把食物打包好,然后在下一个地方重新装盘……还是把食物放进便当盒里,然后随身携带,保持整洁?好吧,我的便当盒比喻现在有点牵强了,不过算了,我就继续用下去吧。
让我再解释一下 Docker 对计算环境的定义。当计算机解决问题时,它会使用许多设备,这些设备以多种方式排列,并协同工作以解决问题。这些设备构成了你的环境。你可能在笔记本电脑上使用个人环境,但在工作电脑上使用不同的环境,而为客户编写应用程序时可能又会使用不同的环境。你在个人或工作项目中可能经常用到的环境是“测试环境”和“生产环境”。生产环境是运行代码以确保应用程序/软件/产品正常运行的环境,而测试环境则是编写和测试代码以确保其在生产环境中正常运行的环境。其他类型的计算环境包括但不限于:分布式计算、云计算和集群计算环境。
所以,你可以把你的计算环境比作便当盒,比如你的家、你的工作场所、你的健身房(如果你在健身房吃东西的话?哈哈),或者你可能还在上夜校。你可以带着你精心整理的便当盒,更高效、更轻松地享用零食。把所有零食都放在一个盒子里更可靠、更安全。当所有零食都放在便当盒里时,你不太可能在路上丢失它们。你喜欢我的便当盒比喻吗?请在评论区告诉我!最后,我给你列出一些容器的优点:
- 敏捷开发——容器意味着你可以更加敏捷,如果你不遵循敏捷实践,你还能算得上是开发人员吗?
- 容器=可移植性——有了容器,部署到不同的计算环境就容易多了!
- 效率——使用容器后,您可以更智能地工作,完成更多工作,因为您可以相信您的代码将会正常运行(万岁!)。
- 一致性和可靠性——这与效率密不可分。让我们通过一个例子来了解容器是如何实现这一点的。Docker 容器无论安装在何处,都能保证运行行为完全一致。例如,HarperDB 容器可以在 Linux、Mac 和 Windows 上的 Docker 中运行。因此,即使您无法在 Windows 上安装 HarperDB,也可以在 Windows 版 Docker 中安装 HarperDB 容器,并获得一致的运行结果。
- 比虚拟机开销更低——再说回我的便当盒。如果你整天都用便当盒吃饭,你需要的东西就少得多。你的便当盒甚至可以配上精致环保的刀叉(绿色万岁!),这样你就不用到处找新的餐具,也不用买新的盘子等等。虚拟机以后可以另写一篇精彩的博客文章来详细讲解,这里先奉上Docker的解析!
如何以及用容器盛装什么
所以我们知道了容器是什么,也了解了它们的由来,但它们究竟有什么用途呢?我在前面谈到测试环境和生产环境时,简要地提到了一个最常见的用例。开发团队为什么要使用测试环境而不是生产环境呢?这就像我们为什么要在发布博客之前先在笔记/Word/Google文档里写草稿一样。你可以把测试环境想象成代码的草稿。你肯定不想把代码直接放到生产环境,然后搞砸了整个产品,毕竟真正的用户正在使用它,除非你像硅谷的贾里德·邓恩那样,花钱雇佣全球各地的点击农场来提升你的日活跃用户数。🙂所以,测试环境就是一个你可以自由发挥、测试代码、让它变得出色的地方。
容器的另一个应用场景是通过“迁移”方法实现组织应用程序的现代化。容器化后,您可以将应用程序迁移到云端。此外,容器还能更好地支持微服务架构。如果将不同的微服务容器化,您就拥有了构建模块,可以像专业人士一样部署和扩展这些微服务。
最后一个例子(尽管容器的应用可能性无穷无尽)是将你的机器学习 (ML) 模型容器化。在生产环境中部署可扩展的 ML 模型是一项巨大的挑战,而容器通过在多台机器上启动多个容器来分布式部署 ML 应用,从而实现这一目标!之后,你可以利用Kubernetes等工具进行编排,轻松管理所有不同的 ML 容器。编排对于容器来说至关重要。我可能应该在不久的将来写一篇“容器编排详解”的博客文章,因为这完全是另一个复杂的领域。
冷藏容器结论
没错,这篇博文很棒,它讲的是容器,而且是一个总结。哇,关于容器,需要了解的东西真多。这篇博文当然不可能解释关于容器的一切,但希望它能帮助你理解一些关于这个神奇软件的基础知识。Zach最近写了一篇关于HarperDB 容器化之旅的精彩博文,如果你想继续深入学习容器在实际应用中的知识,我认为这篇文章是这篇博文的绝佳补充。另外,我还要推荐一下Docker Hub 上的 HarperDB 容器。Docker 让探索和开发 HarperDB 变得轻而易举。安装 Docker 后,只需一个简单的命令就能在本地环境中启动并运行 HarperDB。Docker 抽象了 HarperDB 的安装和配置过程,因此开发人员可以快速迭代新的或现有的 HarperDB 数据存储。
最后,祝你们这些肮脏的畜生节日快乐,新年快乐!
文章来源:https://dev.to/harperdb/containers-explained-by-a-non-developer-269a


