背景
通俗讲,Docker就是便携式的VMWare,把虚拟机的整个大环境优化压缩到应用支撑的容器环境,这种环境的变化对软件平台性能提升是非常明显的,所以牢牢占领了市场,也成了系统维护人员必学的一个工具。
Docker
Docker是一个开源项目,用于自动将应用程序部署为可在云端或本地运行的可移植,自给自足的容器。Docker还是一家与云、Linux和Windows供应商合作,促进和发展该技术的公司。
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随附了适用于Windows或macOS的Docker社区版(CE)。这些产品将安装必要的VM(Docker主机)以托管容器。Docker还提供了Docker企业版(EE),该版本专为企业开发而设计,并由IT团队使用,这些IT团队在生产中构建,交付和运行大型业务关键型应用程序。
要运行Windows容器,有两种类型的运行时:
Windows Server容器通过进程和名称空间隔离技术提供应用程序隔离。Windows Server容器与容器主机以及主机上运行的所有容器共享一个内核。
基于Windows Server容器提供的独立环境来支持Hyper-V扩展,容器通过在高度优化的虚拟机中运行。在此配置中,容器主机的内核不与Hyper-V容器共享,从而提供了更好的隔离性。
这些容器的图像以相同的方式创建并具有相同的功能。不同之处在于如何从运行Hyper-V容器的映像创建容器的过程需要一个额外的参数。
虚拟机包括应用程序,所需的库或二进制文件以及完整的来宾操作系统。完全虚拟化比容器化需要更多的资源。 容器包括应用程序及其所有依赖项。但是,它们与其他容器共享OS内核,并在主机操作系统上的用户空间中作为隔离的进程运行。(在Hyper-V容器中,每个容器在每个容器的特殊虚拟机内部运行。)
对于虚拟机,主机服务器从下至上有三个基础层:基础架构,主机操作系统和虚拟机监控程序,最重要的是每个虚拟机都有自己的操作系统和所有必要的库。对于Docker,主机服务器仅具有基础结构和操作系统,最重要的是容器引擎,该容器引擎使容器保持隔离状态,但共享基本的OS服务。
因为容器需要的资源要少得多(例如,它们不需要完整的操作系统),所以它们易于部署并且启动速度很快。这样可以提高密度,这意味着可以在同一硬件单元上运行更多服务,从而降低成本。
作为在同一内核上运行的副作用,与VM相比,获得的隔离更少。
映像的主要目标是使不同部署之间的环境(依赖项)相同。这意味着您可以在计算机上对其进行调试,然后将其部署到保证相同环境的另一台计算机上。
容器映像是一种打包应用程序或服务并以可靠且可复制的方式部署它的方法。您可以说Docker不仅是一项技术,还是一种哲学和一个过程。
使用Docker时,您不会听到开发人员说:“它可以在我的机器上运行,为什么不在生产环境中使用?” 他们可以简单地说“它在Docker上运行”,因为打包的Docker应用程序可以在任何受支持的Docker环境中执行,并且可以按预期的方式在所有部署目标。
一个简单的比喻
也许简单的类比可以帮助您掌握Docker的核心概念。
让我们暂时回到1950年代。没有文字处理程序,并且影印机无处不在(种类繁多)。
想象一下,您有责任根据需要快速发布一批信件,使用真实的纸张和信封将其邮寄给客户,然后实际发送到每个客户的地址(当时没有电子邮件回信)。
在某个时候,您意识到字母只是由大量段落组成的,并根据字母的目的根据需要选择和排列这些段落,因此您设计了一个系统来快速发布字母,以期获得大量的字母增加。
系统很简单:
首先从一叠透明纸开始,每张纸都包含一个段落。
要发布一组字母,请选择带有所需段落的工作表,然后将它们堆叠并对齐,以使它们看起来和阅读都很好。
最后,将套装放到复印机中,然后按开始以产生所需数量的字母。
因此,简化,这就是Docker的核心思想。
在Docker中,每一层是执行命令(例如安装程序)后文件系统发生的更改的结果集。
因此,在复制完图层后,当您“查看”文件系统时,您会看到安装该程序时包含该图层的所有文件。
您可以将映像视为已准备好在已经安装了操作系统的“计算机”中安装的辅助只读硬盘。
同样,您可以将容器视为安装了图像硬盘的“计算机”。就像计算机一样,该容器可以打开或关闭电源。
你可以理解为VMWare针对操作系统API和操作系统管理进行了虚拟机化,而Docker主要针对了文件系统层面文件数据层面的虚拟机化,实际上Docker比这个理解复杂,这个理解只是为了加强印象。
Docker安装部署
Docker安装包已经成熟,难在多个应用时建立多容器协调,这需要配置更多项目。
例如,您可以在docker-compose.yml文件中明确描述如何部署多容器应用程序。
基本上,您定义要部署的每个容器以及每个容器部署的某些特征。有了多容器部署描述文件后,您可以通过docker-compose up CLI命令安排的单个操作来部署整个解决方案,也可以从Visual Studio透明地部署它。否则,您将需要使用Docker CLI通过docker run从命令行使用命令来按容器分多个步骤部署容器。因此,在docker-compose.yml中定义的每个服务必须恰好指定一个映像或构建。其他键是可选的,类似于它们的docker run命令行对应键。