NET 开发人员在使用 Docker 时会遇到的常见术语和短语。

集装箱化世界与任何技术都没有什么不同,因为它有相当多的概念和术语。本节将探讨Docker、它如何与容器化相关,以及我们在进入这个不断扩大的应用程序开发利基市场的旅途中可能会遇到的其他重要术语。
让我们从集装箱化的概念开始。为了简单起见,我们可以将容器看作是虚拟机的一种变体。容器允许一个可以托管我们的应用程序的环境。虽然在概念上类似,但容器与传统虚拟机的不同之处在于,容器依赖于主机操作系统和执行引擎层,而不是由 Hypervisor 管理独立的操作系统(OS)实例。
image.png
托管模型是一个关键区别,在决定VM和容器之间时应该考虑到这一点。
在选择容器化时,.NET开发人员希望看到哪些优势?

  • 更好地利用资源,因为资源是共享的。
  • 更快的部署和启动时间,因为主机操作系统已经运行。
  • 简化了容器主机的管理。管理一个主机操作系统,而不是单个来宾操作系统。

正如我们提到的,这是考虑容器时的基本知识,容器将依赖于主机操作系统。这意味着我们不能在Windows主机上托管MacOS容器,也不能在Linux主机上托管Windows容器。Linux主机和容器对于容器化来说无处不在,因为Linux可以在所有主要操作系统上运行,既可以在本地运行,也可以在虚拟机中运行。
开发人员应该记住,对于集装箱化的一些妥协:

  • 容器可能能够与主机操作系统交互,这可能允许安全性暴露。
  • Windows依赖项需要大小为千兆字节的基于Windows的容器,而Linux容器的大小范围为MB。

    Docker

    Docker已成为容器化的同义词,许多开发人员将交替使用这两个术语。Docker是一个工具集,可以让开发人员更轻松地开始应用程序的容器化。以下是Docker公司向开发人员推销其工具的方式。

    Docker消除了重复的、平凡的配置任务,并在整个开发生命周期中用于快速、轻松和便携的应用程序开发-桌面和云。Docker全面的端到端平台包括UI、CLI、API和安全性,它们可以在整个应用交付生命周期内协同工作。—Docker

.NET开发人员看待Docker的方式与他们看待.NET生态系统的工具集和语言的方式大致相同。相比之下,有经验的.NET开发人员可能会热情地告诉新手“学习.NET!”当他们可能推荐的是探索C#或F#等语言时,构建ASP.NET应用程序,或者做一些Xamarin移动开发。
对于初学者来说,使用Docker的第一步是安装Docker Desktop。Docker Desktop产品将配置一个可托管集装箱化应用程序的环境。所有操作系统都将获得Linux虚拟机和运行特定于主机的容器的本机能力。Windows用户可以运行Windows Containers,MacOS用户可以运行MacOS Containers。
Docker提供了广泛的功能,这超出了本教程的范围。如果您对学习Docker工具感兴趣,我们建议您访问他们的入门指南,然后继续学习本教程。
至少,开发人员应该在他们的开发环境(MacOS和Windows)上安装Docker Desktop,正如我们将在本教程后面使用的那样。

Images

容器我们的应用程序首先从选择一个基本映像开始。映像是我们选择构建和运行应用程序的基础。

镜像是一个只读模板,包含创建Docker容器的说明。通常,一个映像是基于另一个映像的,并进行了一些额外的自定义。—Docker

大多数.NET开发人员将从Microsoft的映像开始,但我们也可以构建自定义映像并将其存储在映像注册表中。基本映像包括:

选择基本映像可能会对部署以及生产环境中的资源利用率产生重大影响。我们的.NET应用程序的依赖性可能会将我们限制到特定的主机环境和基础映像。对于使用.NET Core和.NET5+运行时的.NET开发人员来说,幸运的是,我们可以使用Linux基础映像来减小最终容器的大小。新创建的映像将只包含构建在基本映像之上的附加数据,通常是我们的应用程序及其占用空间。

Containers

容器是运行在执行引擎和主机操作系统上的映像的实例。对于.NET开发人员来说,映像类似于Windows上的可执行文件或MacOS中的应用程序。容器类似于该可执行文件或App的运行进程。
在使用容器时,我们必须配置我们的实例以公开端口、附加卷和指定入口点。我们将在本教程的稍后部分了解如何做到这一点。

Ports

容器可以是自包含的,并且可以与所有外部连接隔离,但这不会有太大帮助。与物理机一样,容器可以通过端口进行通信,这些端口是在创建容器时定义的。例如,SQL Server数据库容器可能希望公开端口1433,该端口通常是远程数据库连接的端口。对于ASP.NET容器,我们可能希望HTTP端口和/或HTTPS端口都可以访问。

Volumes

一次性是集装箱最大的优点之一。也就是说,当容器被停止和删除时,容器中的内容就会消失。如果我们的映像写入磁盘,则可能存在数据丢失的合理担忧。别害怕!我们可以将持久存储挂载到任何容器,也称为
卷在容器启动时装入,并在主机操作系统上保持不变,允许我们删除一个容器实例并创建一个附加到同一卷的新容器实例。我们可以使用Docker CLI工具管理卷。
我们可以在Docker官方文档网站上阅读更多关于卷的内容。

Multi-Container Applications

在使用分布式应用程序时,开发人员会希望从不同的容器创建逻辑应用程序。我们可以让核心应用程序与数据库容器、缓存服务和全文搜索引擎对话。Docker附带了一个名为Compose的工具,它允许我们定义不同容器之间的关系拓扑。
编写工具有许多好处,.NET开发人员应该会立即看到这些好处:

  • 对开发环境和依赖项(如数据库、缓存、队列等)进行编码。入门从来没有这么简单过。
  • 为质量保证团队和持续集成管道提供可重复的测试环境。
  • 提供生产环境蓝图,同时允许我们独立扩展每个容器服务。

使用Compose工具的一个缺点是它侧重于单主机部署。开发人员可以使用Kompose等补充工具将Docker Compose定义文件转换为针对Kubernetes集群的文件。
在本教程中,我们的重点是Docker在.NET开发过程中提供帮助的能力,因为还有其他很好的资源来部署其他人已经编写的容器化应用程序。

Container Image Registries 容器图像注册表

创建映像的一个好处是在团队成员和环境中共享它们。我们可以通过将镜像从本地开发环境推送到容器镜像注册表来共享镜像,并通过持续集成构建管道。最著名的图像注册表是Docker Hub,它保存了社区的大部分共享图像,并为商业用例提供了私有注册表。
大多数云提供商还提供服务中映像注册表:

希望保持快速部署和较低预算支出的开发人员会希望考虑在其生产托管环境的信封内建立容器注册中心。例如,如果我们在DigitalOcean中托管容器,那么使用DigitalOcean容器注册表就很有意义。同样的逻辑也适用于所有其他主机平台。