当前位置: 首页 > 科技观察

我可以在Windows上使用Docker吗?

时间:2023-03-17 16:24:39 科技观察

Docker,准确的说是容器技术,这几年几乎已经成为了应用分发和集群部署的默认技术。Docker生态系统的成熟还取决于其周边工具和实践模型的兴起。比如曾经异军突起的编排技术,以及基于容器技术的DevOps实践已经大规模开展。那么这么好的技术,能在Windows上使用吗?在不同的场合,人们和我讨论过这个话题。每次听到这样的问题,我都觉得很无奈。毕竟,稍微搜索一下,不难回答:是的。但是,仔细想想,人们有这样的疑虑也是情有可原的:毕竟Docker是一项起源于Linux的技术。Docker是基于Linux内置的Namespace、CGroup等系统隔离机制抽象出来的一种轻虚拟化技术。相对于虚拟机,它以轻量级的方式实现了运行空间的隔离。如果物理机是住宅楼,虚拟机就是楼里的套房,容器技术就是套房里的隔断。不难理解,Docker作为一个分区,无法在一个内核(Linux)的基础上为另一个内核(Windows)提供虚拟化的运行环境。因此,基于Linux的Docker不支持运行Windows应用程序。早在Docker之前,Linux就提供了Docker今天使用的底层技术。Docker仿佛一夜之间突然风靡全球的背后,技术的积累并不是一蹴而就的。在Windows上,这一切似乎都有点滞后。在Docker已经家喻户晓的时候,Windows系统根本就没有类似的机制,更不用说Windows特有的工具链和实践方法了。因此,我们看到早期Windows与Docker的交集只是为其提供一个应用开发环境。boot2docker和DockerforWindows可以开发Docker部署在Windows上的应用——Windows的桌面体验比Linux好很多,所以在异构操作系统上以虚拟机运行Docker的项目很早就出现了。那就是boot2docker。它同时支持Windows和macOS。后来,Docker公司开始推出自己的DockerforWindows工具包,旨在为开发者提供完整的工具链,用于在Windows上开发面向Docker的应用程序,包括运行时环境、客户端、DockerSwarm编排工具等工具。DockerforWindows中负责运行环境配置的工具是DockerMachine。与boot2docker类似,DockerMachine也在Windows上创建了一个Linux虚拟机来运行Docker引擎。也就是说,这个环境只支持Linux应用格式,不支持Windows应用的运行。Windows上运行的DockerforWindows(图片来自Docker文档)Windows容器技术正当Linux世界的容器技术借助Docker风靡全球的时候,Windows系统也发现了容器粒度的重要性。微软与Docker于2014年宣布合作,将容器技术引入WindowsServer操作系统,为传统Windows应用的容器化提供更直接的支持。不久之后,微软在Ignite2015上宣布将推出针对容器优化的WindowsNanoServer;Windows容器第一次真正与开发者见面是在Windows10的年度更新(2016.8)上,正式提供了Windows容器开发环境。2017年10月发布的WindowsServer1709包括Windows容器,这意味着该技术已准备好用于生产。Windows容器是一种真正可以运行Windows应用程序的容器技术,包括依赖大量Windows特性的应用程序,如IIS、注册表等,都可以在Windows容器中运行。虽然Windows对容器的支持有些晚,但社区对Windows容器的关注和使用却异常活跃。这主要得益于容器技术本身生态的成熟。首先,人们对这项技术有了充分的认识,同时,周边的工具和实践也越来越完善。另一方面,在用Docker构建这项技术的过程中,我们也注意了与现有技术的兼容性。人们发现,在电脑上开启WindowsContainer功能后,接下来的操作还是以Docker客户端为主,命令行参数与Linux上的Docker相同。几乎在Windows容器技术本身日趋成熟的同时,外围工具对Windows容器的支持也在同步完善。DockerforWindows在新版本中加入了贴心的菜单,可以一键切换Linux容器和Windows容器;Kubernetes从1.5版本开始增加了对Windows容器的支持;在云环境方面,包括Azure、AWS在内的众多云环境都在第一时间提供了对Windows容器的支持……Windows在切换容器运行时是如何提供自己的容器技术和兼容Docker的操作界面的Windows容器架构?下图上图是Linux容器的架构,下图是Windows容器的架构。可以发现两者的结构非常相似。与Linux类似,Windows也新抽象了CGroup和Namespace的概念,提供了一个新的抽象层次,称为ComputeService,即HostComputeService(hcs)。相对于底层可能频繁重构的实现细节,hcs旨在为外界(如Docker引擎)提供更稳定的运行接口。hcs的操作界面目前有Go语言版本和C#语言版本。前者目前在Docker客户端中用于操作Windows容器。图片来自BlackBelt在DockerCon上的演讲:DockerandWindowsContainersDemystifiedContainerMirroring在容器镜像方面,微软自己提供了两个服务器版本,ServerCore和NanoServer。ServerCore可以理解为WindowsServer去掉了GUI部分,所以功能更齐全(如文件服务器、DNS服务器等),镜像体积也更大(2GB~5GB);而NonoServer针对容器进行了优化,迷你系统只包含Windows服务器的核心功能,镜像大小为(130MB~400MB)。基于基础镜像构建自己的镜像的方法和Linux镜像是一样的,所以DockerFile文件的格式和语法没有区别。在授权方面,只要用户获得了宿主机的授权,微软就不会向用户单独收取容器镜像的授权费。总结容器技术本身以及围绕它的一系列工具和实践规范了应用的打包和发布,可以在很大程度上消除应用对特定环境的依赖,从而为高效的集群部署和运维提供有力支持。保证。作为容器技术的代表,Docker可以以两种形式运行在Windows上:以Hyper-V虚拟机的形式运行Linux格式的容器,或者运行原生的Windows容器。前者运行Linux风格的应用程序,后者运行Windows应用程序。通过一些技巧,您还可以让两者同时在Windows计算机上运行。Windows10和WindowsServer都提供了对Windows容器的支持,各种容器化工具对Windows容器的支持也在日益完善。基于Windows开发新应用时,一方面可以优先考虑部署跨平台容器的能力;另一方面,和存量应用一样,也可以考虑利用Windows容器技术实现容器化和云原生特性。