什么是 Docker?

提示

此内容摘自电子书《适用于容器化 .NET 应用程序的 .NET 微服务体系结构》,可在 .NET Docs 上获取,或下载免费的 PDF 脱机阅读。

适用于容器化 .NET 应用程序的 .NET 微服务体系结构电子书封面缩略图 。

Docker 是一个 开源项目,用于将应用程序部署自动化为可在云或本地上运行的可移植的自足容器。 Docker 也是一家 公司,它促进和发展这项技术,并与云、Linux 和 Windows 供应商合作,包括Microsoft。

关系图,显示 Docker 容器可以运行的位置。

图 2-2。 Docker 在混合云的所有层部署容器。

Docker 容器可以在客户数据中心、外部服务提供商或云中的 Azure 中的任何位置运行。 Docker 映像容器可以在 Linux 和 Windows 上本机运行。 但是,Windows 映像只能在 Windows 主机上运行,Linux 映像只能在 Linux 主机和 Windows 主机上运行(到目前为止使用 Hyper-V Linux VM),其中主机表示服务器或 VM。

开发人员可以在 Windows、Linux 或 macOS 上使用开发环境。 在开发计算机上,开发人员运行 Docker 主机,其中部署了 Docker 映像,包括应用及其依赖项。 在 Linux 或 macOS 上运行的开发人员使用基于 Linux 的 Docker 主机,并且只能为 Linux 容器创建映像。 (使用 macOS 的开发人员可以从 macOS 编辑代码或运行 Docker CLI,但截至撰写本文时,容器不会直接在 macOS 上运行。在 Windows 上工作的开发人员可以为 Linux 或 Windows 容器创建映像。

若要在开发环境中托管容器并提供其他开发人员工具,Docker 会为 WindowsmacOS提供 Docker Desktop。 这些产品安装必要的 VM(Docker 主机)来托管容器。

若要运行 Windows 容器,有两种类型的运行时:

  • Windows Server 容器通过进程和命名空间隔离技术提供应用程序隔离。 Windows Server 容器与容器主机和主机上运行的所有容器共享内核。

  • Hyper-V 容器通过在高度优化的虚拟机中运行每个容器来扩展 Windows Server 容器提供的隔离。 在此配置中,容器主机的内核不会与 Hyper-V 容器共享,从而提供更好的隔离。

这些容器的映像以相同的方式创建,其功能相同。 区别在于,在运行 Hyper-V 容器的映像中创建容器的方式需要使用其他参数。 有关详细信息,请参阅 Hyper-V 容器

比较 Docker 容器与虚拟机

图 2-3 显示了 VM 与 Docker 容器之间的比较。

虚拟机 Docker 容器
显示传统 VM 的硬件/软件堆栈的 关系图。 显示 Docker 容器的硬件/软件堆栈的 关系图。
虚拟机包括应用程序、所需的库或二进制文件和完整的来宾操作系统。 完全虚拟化需要比容器化更多的资源。 容器包括应用程序及其所有依赖项。 但是,它们与其他容器共享 OS 内核,这些容器在主机操作系统上的用户空间中作为隔离进程运行。 (Hyper-V 容器例外,其中的每个容器都在各容器特定虚拟机内部运行。)

图 2-3。 传统虚拟机与 Docker 容器的比较

对于 VM,主机服务器中有三个基本层,从上到下:基础结构、主机操作系统和虚拟机监控程序,以及每个 VM 都有自己的 OS 和所有必要的库。 对于 Docker,主机服务器只有基础结构和 OS,并且顶部是容器引擎,它使容器保持隔离,但共享基本 OS 服务。

由于容器所需的资源要少得多(例如,它们不需要完整的 OS),因此它们易于部署,并且可快速启动。 这允许你拥有更高的密度,这意味着它允许在同一硬件单元上运行更多服务,从而降低成本。

由于在同一内核上运行,隔离程度比虚拟机更低。

映像的主要目标是使环境(依赖项)在不同的部署中相同。 也就是说,可以在计算机上调试它,然后将其部署到保证具有相同环境的另一台计算机上。

容器映像是打包应用或服务并采用可靠且可重现的方式部署它的方法。 你可以说 Docker 不仅是一种技术,而且是一种理念和过程。

使用 Docker 时,不会听到开发人员说:“它在我的计算机上工作,为什么不在生产环境中?他们只需说,“它在 Docker 上运行”,因为打包的 Docker 应用程序可以在任何受支持的 Docker 环境中执行,并且它以针对所有部署目标(例如开发、QA、过渡和生产)运行的方式运行。

简单的类比

也许一个简单的类比可以帮助掌握 Docker 的核心概念。

让我们回到20世纪50年代片刻。 没有文字处理器,复印机几乎随处使用(算是吧)。

假设你负责根据需要快速发出一批信件,使用真正的纸张和信封将其邮寄给客户,以便以物理方式传递到每个客户的地址(当时没有电子邮件)。

在某个时刻,你意识到信件其实是由大量段落组成的,并根据信件的目的来挑选和排列。所以,你设计了一个系统来快速发出信件,期待获得丰厚的加薪。

系统很简单:

  1. 先从一副透明薄片开始,每个薄片包含一个段落。

  2. 若要发出一组信件,请选取包含所需段落的纸张,然后堆叠并对齐它们,以便看上去整齐并便于阅读。

  3. 最后,你将其置于复印机中并按开始,以生成所需的多个信件。

因此,简化,这就是 Docker 的核心理念。

在 Docker 中,每个层都是执行命令(如安装程序)后对文件系统发生的一组更改。

因此,在复制层后“查看”文件系统时,会看到安装程序时层中包含的所有文件。

你可以将映像视为要在“计算机”中安装的辅助只读硬盘,其中操作系统已经安装。

同样,可以将容器视为安装了映像硬盘的“计算机”。 容器(就像计算机一样)可以打开或关闭。