Webhostingtalk资讯网

Windows和Docker容器进阶教程

2017-09-04 11:36
作者:admin

首先您要了解一下Linux容器、Windows Server容器以及Hyper-V容器之间的区别。才能更好的定义、创建和运行多容器Docker应用程序,并将现有的Windows虚拟机容器添加至Docker容器中。

· 第一部分 - 基础知识:讨论在Windows Server 2016操作系统中实施容器虚拟化的基本原理。

· 第二部分——启动和运行:重点介绍了如何使用Docker容器来创建和管理Windows Server 容器。

Windows上的Linux容器:缩小差距

在深入开展本文之前,我必须先向您证明,如果我尝试在Windows容器主机上运行Linux容器,那将会失败,因为Windows内核和Linux内核是截然不同的。目前,我们无法在Windows容器主机上运行基于Linux的容器:

这一问题正在解决中,而且微软在于德克萨斯州奥斯汀举行的DockerCon 2017大会上宣布,开发人员将很快能够使用Hyper-V容器隔离技术在Windows Server上运行Linux容器。当该技术推出后,Windows和Linux这两个操作系统将不再需要单独的基础架构和开发工具。在该大会上,Docker团队也宣布将推出LinuxKit,它是用于容器迁移的一种安全且轻便的Linux子系统,且会提供能允许我们构建自定义的Linux子系统(只包含运行时平台所需的组件)的工具。在此次大会上,Docker团队官方宣布了将推出这项新功能,并表示将与微软合作,将LinuxKit子系统与Hyper-V隔离技术相集成。

Docker-Compose

尽管Docker为我们提供了一个允许我们能简单且快速地完成部署的容器平台,但创建新环境的过程仍很耗时——特别是当您有多个服务需要部署时。 Docker-Compose将该安装过程简化为了单个部署命令,它能大幅减少定义和运行多容器Docker应用程序所需的时间和精力。有了该工具,您就能使用docker-compose.yml文件来配置应用程序服务了。接着,仅需一条命令,您就可以使用文件中的数据来创建并启动您配置的所有服务。

使用Docker-Compose需遵循两个步骤:

· 定义在docker-compose.yml中组成应用程序的服务,以便它们能在隔离的环境中一起运行

· 启动docker-compose来运行您的整个应用程序

请使用以下命令安装Docker-Compose可执行文件:

如果您已经安装了Docker-Compose.yml文件,那么您只需运行以下命令即可:

您的应用程序就这样部署完毕了!

这里发生了什么?

当我运行Docker-Compose命令时,Docker将从Docker-Compose.yml文件中构建一个Windows容器。无需一个或多个docker文件,这里我可以部署基于Web服务器和数据库的一整个应用程序。以下是使用YAML编写的Docker-Compose.yml文件示例:

“服务:”部分将定义两种服务:“db”和“web”。 “db”服务是微软的Microsoft SQL Express映像。此服务包含以下参数:

· SA帐户的密码设置为“Password1”

· 主机上的1433端口映射到容器中公开的1433端口

接下来,名为“Web”的第二个服务是从我的自定义存储库处构建的——特别是从包含一个自定义网站的自定义IIS映像处构建的。然后,我们使用了一个环境变量来定义数据库的位置以及连接它的方式。最后,将端口5000映射到容器中公开的端口5000。这样,这两个服务就都被添加到一个名为nat的现有网络中了。

Docker Compose能很好地管理包含数据库和Web前端的多个容器。

Image2Docker

将应用程序迁移出虚拟机很困难,尤其是那些具有多个组件的分布式应用程序。 Image2Docker是将您的旧应用程序迁移至较新操作系统的最简单的方式。

什么是Image2Docker?

Image2Docker是将现有的Windows应用程序工作负载从虚拟机转移至Docker映像的PowerShell模块。它支持多种应用程序类型,但最初重点支持的是IIS。您可以使用Image2Docker来从一台虚拟机中提取ASP.NET网站,随后您就可以在Docker容器中运行它们,而无需更改应用程序。不过,要想使用Image2Docker,您需要拥有Windows Server 2016或Windows 10才行。

它是如何运作的?

Image2Docker首先会检查WIM、VHD或VHDX格式的Windows Server 2003、2008、2012或2016 虚拟机映像中的工作组件。然后,它会从VHD文件中提取整个虚拟机或特定工作组件。 接下来,它会生成一个可以构建到Docker映像中的Docker文件。不过,此PowerShell模块需要PowerShell 5.0或更高版本。

现在,我将描述提取IIS工作组件所需的步骤。 在下方的截图中,我部署了一台安装了名为“IIS01”的IIS角色的Windows Server 2016虚拟机。该虚拟机配有两个IIS网站:

首先,在您的容器主机上安装Image2Docker PowerShell模块:

接着,您可以使用ConvertTo-DockerFile cmdlet。 此cmdlet将扫描您的源映像(例如VHDX或WIM文件)以对该工作组件进行确认。 Image2Docker目前支持以下工作组件:

您只需调用ConvertTo-Dockerfile cmdlet,并指定包含VHDX文件的-ImagePath参数就能扫描映像了。 输出的文件夹将包含生成的docker文件。 在扫描映像之前,请先关闭虚拟机。

您还可以使用后面带有IIS网站名称的-ArtifactParam参数来从IIS虚拟机中提取单个网站:

现在,您可以点开输出文件夹,并会发现一个Docker文件已经创建完毕了。

如果您只有一个VMDK文件,那您可以使用Microsoft虚拟机转换工具,将VMDK映像转换为VHD映像。

Hyper-V隔离技术

当您使用Windows 10时,您就只能使用Hyper-V容器,但是,如果您使用的是Windows Server 2016,那您不仅可以选择Hyper-V容器,也可以选择使用Windows Server容器。默认情况下,当您运行docker run命令时,它将启动一个Windows Server容器,但您也可以指定使用—isolation=hyperv参数来运行Hyper-V容器。

运行Hyper-V容器之前,请先在容器主机上安装Hyper-V角色:

运行上一个命令时,如果您的容器主机是虚拟机,那您可能会收到以下报错信息:

这意味着系统上未启用嵌套虚拟化功能,它能允许您运行一个虚拟机管理程序,而该程序运行于虚拟机管理程序上的虚拟机中。要想在Hyper-V中启用嵌套虚拟化功能,请先关闭容器主机虚拟机,然后运行以下PowerShell命令:

此功能目前仅支持Intel,且必需Intel VT-x。 在安装了Hyper-V角色之后,您就可以使用容器主机上的以下脚本来运行您的第一个Hyper-V容器了:

在此示例中,我使用了—isolation=hyperv参数部署了一个名为“MyNanoHYPV”的Hyper-V容器,该参数基于微软的Nano Server映像。

您可以看到,Hyper-V容器在几秒钟内就可以启动,这比虚拟机要快得多,而且您可以通过运行一个非常简单的检查程序来确认自己运行了Hyper-V 容器。先打开PowerShell控制台,接着使用Get-Process cmdlet列出与Hyper-V进程对应的“VMWP”进程:

我们可以从上述的结果中看出,该容器主机上运行着两个进程。现在,您只需在Hyper-V容器中输入“exit”命令,然后重新运行上一个命令即可:

结果显示正在运行中的进程只有一个。这是为什么呢?因为Hyper-V容器在某些方面就像虚拟机,但在其它方面却有别于虚拟机。当您运行Hyper-V容器时,Windows将会创建一个Hyper-V容器,它跟虚拟机类似,但实际上并不是虚拟机!当然,您在Hyper-V控制台管理器中是看不到此虚拟机的,您唯一能看到的就是这个进程,因为使用Hyper-V容器会提供内核模式隔离,而不是用户模式隔离。

接着让我们研究一下另外一个示例,以了解Windows Server容器和Hyper-V容器之间的区别。请运行以下命令:

此命令部署了一个基于Nano Server映像的Windows Server容器。我们在该容器内运行了一个永久的ping。现在,请使用Docker Top命令来显示在此容器中运行的进程列表:

我们可以看到最后一个名为“PING.EXE”的进程与容器中的ping命令相对应。 但是,请在容器主机上运行Get-Process cmdlet,您会注意到,同一个进程存在相同的PID! 这意味着我们的Windows Server容器使用了容器主机中的内核资源。现在请使用Docker Stop命令停止此容器,并通过附加—isolation=hyperv参数来执行相同的操作:

并运行Docker Top命令:

出现了PowerShell错误! 容器主机上不存在任何PING进程。这意味着出于Hyper-V隔离——尤其是内核模式隔离,容器主机和Hyper-V容器之间不共享内核资源。

您可能也遇到了下列的错误:

这意味着您的系统上未安装Hyper-V角色,所以您才无法运行Hyper-V容器。 如果您在使用特定容器时遇到了问题,那您可以使用Docker Logs命令进行故障排除。Docker logs命令显示了由正在运行的容器记录的信息,而记录的信息内容及日志的格式几乎完全取决于容器的端点命令:

小结

在本文中,我们对Docker Compose进行了探讨。Docker开发了Docker-Compose,使得我们可以更轻松地配置和运行由多个容器组成的应用程序,以便构建一个多容器应用程序。此外,Docker-Compose还允许您使用单个命令就能启动所需的容器。

接着,我们使用了Image2Docker,它允许您在Hyper-V虚拟机中使用虚拟化的Web服务器,并为虚拟机中的每个网站提取Docker映像。 另外,它还会查看磁盘上的已知工作组件,然后列出安装在虚拟机上的所有工作组件,并生成一个Docker文件来打包这些工作组件。

最后,我们介绍了Hyper-V容器的概念。Hyper-V容器提供的是内核模式隔离,而不是用户模式隔离。而且,Hyper-V容器使用了一台自动生成的Hyper-V虚拟机,而容器实例正运行于该虚拟机之上。

相关文章推荐:Windows容器的内部构造和Docker连接介绍

网友评论
暂无评论!