计算机系统应用教程网站

网站首页 > 技术文章 正文

Docker:Windows与Linux Container

btikc 2024-12-16 11:15:14 技术文章 33 ℃ 0 评论

Docker 在window 上, 还是挺折腾的, Windows Container / Linux Container, Hyper-V, 好复杂!

一直在Mac 上使用Docker, 到生产环境也是使用Linux, 没感觉到Docker 安装有什么特别的, 直到昨天想在Window上配一个开发环境, 发现安装一个Docker 也不是那么容易, 记录一下Window下 Windows Container的特点.

环境是在VMWare Fusion上安装Windows 10 Enterprise (evaluation )版, 下载这个Windows VM 还是挺快的, 这里推荐大家到这个网址(在评论区显示这个网址)去下载, 微软官方提供的纯净环境, 里面包含Win7, Win8.1以及Windows 10 Enterprise, 90天试用期, 用来做临时开发环境还是不错的, 激活之后做一个快照, 以后到期了就使用快照恢复.

在Windows 10 上, 按照之前Mac 的经验, 直接下载Docker Desktop on Windows, 安装是很顺利 但是安装之后就启动不了Docker, 头一次看到Docker 那个图标, 那艘船上没有集装箱![笑哭]

来来回回试了几次, 如果切换到Windows Container, 就可以启动Docker, 但是运行一些Linux 容器就会失败. 切换到Linux Container, 就直接失败.


回头找原因吧, 这才发现, Docker 在Window 上, 真的不一样.


一 不是所有的Windows 版本都一样

在大多数情况下,Docker可以在Linux内核为3.10或更高版本的任何Linux系统上运行。 该内核版本出现在2011年,因此此后发布的大多数Linux发行版都可与Docker一起使用。 实际上,对于Linux系统管理员来说,您可以轻而易举地将一个容器运行在一种Linux系统上,然后将其移动到另一台Linux服务器上,这是Docker吸引人的一个重要原因。

然而, 这些在Windows上是不同的! Docker仅适用于Windows 10桌面系统以及Windows Server 2016和2019。Microsoft继续支持其他版本的Windows,因此仍可在生产中使用,但不适用于Docker。 因此,Docker在Windows生态系统中失去了部分吸引力,因为它不允许您在任何现代Windows版本上部署相同的容器化应用程序。

看看下面这个安装Docker 时候的需求, 就会明白, 这里面的要求好多!

经过持续努力, Docker 终于安装完成并启动起来了! 因为使用的是Vmware Fusion, 高级选项里面的支持intel VT-x/EPT, 以及支持IOMMU, 都需要支持才行:

Docker 运行界面:

Docker Desktop 安装完之后, 从设置页面上可以看到, Docker Desktop 也可以支持基于WSL 2 的Docker Engine:

安装完Docker Desktop for Windows, 硬盘上的文件结构是:

Windows Container提供2种运行时:Window Server Contianer 或者 Hyper-V Container


这里面不提运行在Windows上面的Linux虚拟机里面的容器,而是原生的Windows容器, Windows 提供2种类型的容器运行时模型。

Windows 容器(WCOW )包括两种类型:Windows Server Container和Hyper-V Container。 这两类容器基于不同的运行时隔离模式:process和Hyper-V。

Windows容器提供两种不同的运行时隔离模式:进程隔离和Hyper-V隔离。 在两种隔离模式下运行的容器的创建,管理和功能均相同。 它们还产生和使用相同的容器映像。 隔离模式之间的差异在于,容器,主机操作系统以及在该主机上运行的所有其他容器之间创建了何种程度的隔离。

基于进程隔离模式的Windows Server Container

Windows Server Container是基于进程隔离的容器,这是容器的“传统”隔离模式, 在容器主机上通过命名空间、资源控制和进程隔离技术提供的隔离,可以并发运行多个容器实例。

在此模式下运行时,容器与主机以及彼此共享同一内核( 这与 Linux 容器的运行方式大致相同)。容器进程实际上运行在宿主机上,可以通过任务管理器或者Powershell 命令 Get-Process 获取到这个进程的信息。

通过进程隔离,多个容器实例可以在给定主机上同时运行,并通过名称空间,资源控制和进程隔离技术提供隔离。 在这种模式下运行时,容器与主机以及彼此共享同一内核。 这与Linux容器的运行方式大致相同。

Windows Server Container 的这种进程隔离特性, 与大家所熟悉的Linux Contianer容器模型是一致的,容器与底层操作系统共享内核,所以它们会很轻量而且运行迅速。当你在容器中启动一个进程的时候,这个进程实际上运行在宿主机上,你可以使用任务管理器或者Powershell 命令 Get-Process 获取到这个进程的信息。

基于Hyper-V隔离模式的Hyper-V Container


Hyper-V Contianer是一种全新的容器运行时模型,它将在宿主机上启动一个很小的虚拟机,每个容器都在高度优化的虚拟机内运行,并具备自己独立的操作系统内核。 虚拟机的存在在每个容器和容器主机之间提供硬件级别隔离。

当你在Hyper-V Container中启动进程的时候,宿主机对这个进程是无感知的。Hyper-V Container提供了更好的隔离性,此隔离模式提供了主机和容器版本之间的增强安全性和更广泛的兼容性。而且这个虚拟机被裁减得非常小,所以性能仍然会不错。

Hyper-V Contianer的这种隔离模式提供了增强的安全性以及主机版本和容器版本之间的更广泛兼容性。 通过Hyper-V隔离,多个容器实例可在一个主机上同时运行。 但是,每个容器都在高度优化的虚拟机内部运行,并有效地获得了自己的内核。

在Windows Server 2016上,你可以在2种不同的运行时之间选择;而Windows 10上虽然也提供了容器服务,但是只能运行Hyper-V Contianer。

Windows 10 Home现在支持Docker。它使用WLS 2,它在后台是一个虚拟机,因此与Docker Toolbox类似,但效率更高。


三 Hyper-V 运行时: 容器 or 虚拟机?


看看虚拟机的架构图, 是不是很像Hyper-V 的隔离模式?

实际上, 从虚拟机的角度来看, Hyper-V 模式的Container, 近似于一个在Window 上运行的虚拟机,在虚拟机里面再去运行容器里面的各个应用和服务.

来看看维基百科上的Hyper-V 的介绍, 会更加清晰:

Microsoft Hyper-V,代号为Viridian ,在其发布之前简称为Windows Server Virtualization,是本机虚拟机管理程序。 它可以在运行Windows的x86-64系统上创建虚拟机。

从Windows 8开始,Hyper-V取代Windows Virtual PC,成为Windows NT客户端版本的硬件虚拟化组件。 可以将运行Hyper-V的服务器计算机配置为将单个虚拟机公开到一个或多个网络。

Hyper-V最初随Windows Server 2008一起发布,自Windows Server 2012和Windows 8开始免费提供。独立的Windows Hyper-V Server是免费的,但仅具有命令行界面。

当然, Hyper-V 有着不同于一般虚拟机的设计, 来看其架构

Hyper-V 架构图:


Hyper-V在分区方面实现了虚拟机的隔离。分区是管理程序支持的隔离的逻辑单元,每个host操作系统都在分区中执行。虚拟机监控程序实例中必须至少有一个父分区,该分区运行Windows Server的受支持版本(2008及更高版本)。虚拟化软件在父分区中运行,并且可以直接访问硬件设备。父分区创建承载host操作系统的子分区。父分区使用hypercall API创建子分区,hypercall API是Hyper-V公开的应用程序编程接口。

子分区无法访问物理处理器,也无法处理其实际中断。相反,它具有处理器的虚拟视图,并在“host虚拟地址”中运行,根据“虚拟机管理程序”的配置,该地址可能不一定是整个虚拟地址空间。根据VM配置,Hyper-V可能仅向每个分区公开处理器的子集。系统管理程序将中断处理到处理器,然后使用逻辑综合中断控制器(SynIC)将其重定向到相应的分区。 Hyper-V可以使用CPU提供的第二级地址转换来硬件加速来宾虚拟地址空间的地址转换,这在Intel上称为EPT,在AMD上称为RVI(以前称为NPT)。

子分区没有直接访问硬件资源的权限,而是具有虚拟设备资源的虚拟视图。对虚拟设备的任何请求都将通过VMBus重定向到父分区中的设备,该父分区将管理这些请求。 VMBus是启用分区间通信的逻辑通道。响应也通过VMBus重定向。如果父分区中的设备也是虚拟设备,它将被进一步重定向,直到到达父分区为止,在父分区中它将访问物理设备。父分区运行虚拟化服务提供程序(VSP),该服务提供程序连接到VMBus并处理子分区的设备访问请求。子分区虚拟设备在内部运行一个虚拟化服务客户端(VSC),该客户端通过VMBus将请求重定向到父分区中的VSP。整个过程对来宾OS是透明的。

虚拟设备还可以利用Windows Server虚拟化功能(称为Enlightened I / O)来实现存储,网络和图形子系统等。 Enlightened I / O是高级通信协议(例如SCSI)的一种专用于虚拟化的实现,允许绕过任何设备仿真层并直接利用VMBus。这样可以提高通信效率,但是需要客户机OS支持Enlightened I / O。

从Hyper-V和其他虚拟机软件相比较的角度来看, Hyper-V和Oracle VM VirtualBox都是旨在运行虚拟机的服务器虚拟化产品。 Hyper-V是Type 1的虚拟机管理程序,它通过直接在计算机的硬件上运行来管理操作系统。 相反,Oracle VM VirtualBox是类型2虚拟机管理程序,它在主机操作系统上运行。

四 Windows 的Linux Container :Moby VM

自Docker于2016年首次发布以来(在Hyper-V隔离或Windows上的Linux容器可用之前),Docker就能够在Windows桌面上运行Linux容器,使用的是在Hyper-V上运行的基于LinuxKit的虚拟机。

在此模型中,Docker Client在Windows桌面上运行,但在Linux VM上调用Docker Daemon。


在此模型中,所有Linux容器共享一个基于Linux的容器主机和所有Linux容器:

  • 彼此和Moby VM共享内核,但不与Windows主机共享内核。
  • 与在Linux上运行的Linux容器具有一致的存储和网络属性(因为它们在Linux VM上运行)。

这也意味着Linux容器主机(Moby VM)需要运行Docker Daemon及其所有依赖项。

若要查看是否正在使用Moby VM运行,请使用Hyper-V Manager UI或在提升的PowerShell窗口中运行Get-VM,检查Moby VM的Hyper-V Manager。

但是我这里始终连接不上这个虚拟机, 所以无从检查:

有头条网友熟悉这块的,可以说说, 我在connect 到这个虚拟机的时候, 始终不成功:


写在最后

为了在Window 10 安装这个Docker, 可实在是花了大力气, 配置方面就是高配, 4核i9处理器, 6G内存. 为了安装这个环境, 中间还从配置比较低的Mac mini 电脑, 切换到高配的MacBook Pro, 折腾了大概2天时间. 当然对这个不熟练, 时间花费比较多些, 但是也看得出Window 平台上, 对于Docker的支持和使用, 注定要多花费很多力气.


对于容器化, Microsoft 也是认真对待的, 并且和Docker 公司一起去搭建Window平台上的容器化, 尽管现在在Window 上使用Linux 容器, 还不是那么直接和方便, 但是相信Window 上的Docker 也会越来越好用.

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表