第 5 章 使用容器 使用容器
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
在上一章中,我们学习了如何构建 Docker 映像,以及在容器中运行生成的映像所需的基本步骤。在本章中,我们将首先了解一下容器技术的历史,然后深入学习运行容器,并探索控制容器的整体配置、资源和权限的 Docker 命令。
什么是集装箱?
你可能对虚拟化 系统(如 VMware 或 KVM)并不陌生,它们允许你在虚拟化层(通常称为管理程序)之上运行完整的 Linux 内核和操作系统。这种方法在工作负载之间提供了非常强的隔离性,因为每个虚拟机都有自己的操作系统内核,而内核位于硬件虚拟化层之上的独立内存空间中。
容器与 有本质区别,因为它们都共享一个内核,工作负载之间的隔离完全是在这一个内核中实现的。这就是所谓的操作系统虚拟化。
libcontainer README提供了关于容器的简短定义:
容器是一个独立的执行环境,它共享主机系统的内核,并(可选择)与系统中的其他容器隔离。
容器的主要优势之一是资源效率,因为每个隔离的工作负载都不需要整个操作系统实例。由于共享的是内核,隔离任务和真正的硬件之间就少了一层间接关系。当一个进程在容器内运行时,只有少量代码位于管理容器的内核中。而在虚拟机中,还会有第二层代码在运行。在虚拟机中,进程对硬件或管理程序的调用需要两次进出处理器的特权模式,因此会明显减慢许多调用的速度。
备注
libcontainer是一个 Go 库 ,旨在为从应用程序管理 Linux 容器提供一个标准接口。
但容器方法确实意味着,你只能运行与底层内核兼容的进程。例如,与 VMware 或 KVM 等技术提供的硬件虚拟化不同,Windows 应用程序无法在 Linux 主机上的 Linux 容器内原生运行。不过,Windows 应用程序可以在 Windows 主机上的 Windows 容器内运行。因此,最好将容器视为一种特定于操作系统的技术,在这种技术中,你可以运行任何与容器服务器内核兼容的应用程序或守护进程。在考虑容器时,你应该尽量抛开你可能已经知道的关于虚拟机的知识,而将容器概念化为在服务器上运行的普通进程的包装。
备注
除了可以在虚拟机内运行容器外,在容器内运行虚拟机也是完全可行的。如果这样做,那么确实可以在运行于 Linux 容器内部的 Windows VM 内运行 Windows 应用程序。
集装箱的历史
通常情况下,革命性的 技术是一种较老的技术,但它终于成为人们关注的焦点。技术的发展一波三折,20 世纪 60 年代的一些理念又开始流行起来。同样,Docker 是一项较新的技术,它的易用性让它一炮而红,但它并不是存在于真空中。支撑 Docker 的大部分内容都来自于过去 30 年在几个不同领域所做的工作。从上世纪 70 年代末添加到 Unix 内核的一个简单系统调用,到为谷歌、Twitter 和 Meta 等众多大型互联网公司提供支持的现代容器工具,我们可以很容易地追溯到容器概念的演变过程。值得花点时间快速浏览一下这项技术是如何演变并导致 Docker 诞生的,因为了解这一点有助于你将其置于你可能熟悉的其他事物的背景中。
容器并不是一个新概念。它们是隔离和封装运行系统的一部分的一种方式。这方面最古老的技术包括最早的批处理系统。在使用这些早期计算机时,系统一次只运行一个程序,一旦前一个程序运行完毕或达到预定的时间跨度,系统就会切换运行另一个程序。这种设计实现了强制隔离:你可以确保自己的程序不会踩到别人的程序,因为一次只能运行一个程序。尽管现代计算机仍在不断切换任务,但其速度快得惊人,大多数用户完全察觉不到。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access