Docker被认为是建立本地开发环境的领先解决方案。 由于docker-compose文件的简单性,每个项目可以有一个隔离的环境,并且该环境反映了生产环境的相同配置。
而且,该解决方案使开发不受您所拥有的操作系统的约束。 简而言之,即使您的容器是Linux映像,也可以使用Windows或Mac进行开发。
无论如何,在某些设置中,性能可能会降低,从而影响生产率。
从最近的Docker更新开始,Docker工程师增加了使用WSL2技术提高性能的可能性,从而在包括Windows在内的所有平台上提供了相同的开发经验。
本文介绍了为什么我们在Windows上可能存在性能问题,以及如何正确安装WSL2以提高性能。
WSL2如何改变Docker
Docker如何工作
关于Docker的中心部分是它在Windows下的工作方式。因为它共享操作系统,而不是硬件,过去Windows上没有任何基于Linux的容器, 但是每个人都要Windows上使用Linux容器,为了解决这个问题, Docker工程师巧妙地采用的使用虚拟机监控程序(通常是Microsoft HyperV)运行虚拟机,并将VM OS共享到Docker容器。事情就是这样运作的,如下图。

这种架构的主要问题是:
- 资源限制。 尽管docker专为共享OS而设计,但管理程序仍在使用硬件,因此您需要为其分配资源。 这导致了与使用虚拟机时同样的性能问题。
- 磁盘开销。 容器映像位于VM内,它以卷的形式存储文件,但是您可能希望共享Windows环境中的文件夹,尤其是在开发时。 这是图中的红色箭头往返及其影响性能。
由于Windows上的Docker如果主要用于开发环境中运行Linux容器,那么性能并不重要。实际上,大多数解决方案都需要很少的资源来一次处理一个请求。但是,在某些情况下,这种性能很重要。
某些应用程序状态的可执行文件仅在其中编译和加载一次,因此磁盘延迟不会太多。使用.net或Java开发,只需按下执行按钮,等待一分钟,然后您的应用程序就可以进行测试了,所有已编译的源代码或多或少都在RAM中,而您不需要读取硬盘。
相反,对于PHP或Python应用程序,则有所不同。由于它们没有任何应用程序状态,因此每个请求都是独立解释的,因此您需要每次扫描并加载所需的所有文件。这意味着要读取大量文件,因此您的等待时间将乘以大量文件。
对于此系统,在Windows上使用卷映射非常昂贵,并且会降低性能。您可以使用安装到Linux OS的卷,但是在这种情况下,您将无法从Windows UI进行编辑。
因此,在大多数情况下,我们接受了最慢的性能(在大多数情况下,对于开发环境是可接受的),或者在其他情况下,我们被迫切换到Linux,这抵消了使用Docker具有多操作系统可用性的优势。
什么是WSL2
WSL(Linux的Windows子系统)是用于在Windows上本地运行Linux二进制可执行文件的兼容性层。 从Windows 10开始它就可以使用,并且可以在Windows内部使用Linux而不使用虚拟机。 自2019年6月以来,Windows 10随附了WSL(WSL 2)的增强功能。此更新通过一组优化的Hyper-V功能带来了许多性能改进。
简而言之,您现在在Windows机器中拥有Linux发行版比运行虚拟机更快。
好消息是Docker Desktop支持它,并且可以增强您的容器。
WSL2如何改变Docker
使用WLS2和Docker的结合,我们实际上跳过了一步。
Windows和Linux文件系统是相互共享的:您可以通过Windows访问共享驱动器\\WSL$ 来查看Linux,或者可以通过/mtn/ c来查看Windows。
docker容器使用Linux WSL,没有任何资源限制,并且具有更好的性能。

在这种情况下,有很多坏消息。 仍然可以共享Windows文件夹,但性能比标准情况下差。 这不是Java或.net中的问题,也不是可容忍的问题,但是使PHP开发不可行。
幸运的是,有一个解决方案将使用WSL2的好处与丰富的开发经验结合在一起。 实际上,Visual Studio Code可以在WSL2子系统上远程工作,因此您可以执行以下操作:
将卷保留在WSL2内,作为常规卷安装,以便获得最佳的文件系统访问性能。
照常在Windows上工作,在Linux上编辑代码。
很明显,如果您在IDE中双击一个项目或将其保存时要花更多的钱访问文件,这是一个非常可接受的解决方案。 问题与大量文件负载有关。
Visual Studio做得更好。 它具有一个扩展,可以与它们的远程子系统进行远程交互,因此您可以将UI保留在Windows中,但可以从Linux内部的实例使用引擎。 因此,作为开发人员的用户体验也很好。

好了,一旦我们了解了如何以及为什么可以提高Docker的性能,我们只需要遵循一些简单的步骤即可完成工作。
我们将需要执行几个步骤,但是,从更高的角度来看,我们必须:
- 启用WSL2环境
- 配置IDE并开始编码。
启用WSL2环境
本节说明如何安装WSL2版本,以准备开始使用Docker和WSL2进行编码。
启用WSL
第一步启用了Window子系统。 您必须在具有管理权限的命令行上运行它。
dism*ex.e** /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
启用WSL虚拟机
第二个命令激活虚拟机平台(是的,WSL仍然在后台使用hyper-v)。 如果您的PC尚未打开虚拟化功能,则可能需要通过BIOS进行设置。
dism*ex.e** /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
安装WSL2更新
安装和配置WSL2的最后一步是安装更新。 这是一个简单的MSI软件包,因此您可以*载下**并双击安装。
https://docs.microsoft.com/it-it/windows/wsl/install-win10
将WSL2设置为默认值
将版本2设置为所有子系统的默认设置。
wsl --set-default-version 2
从Microsoft市场安装ubuntu
要在子系统上运行Docker,我们需要*载下**Linux发行版。 由于Microsoft +开源现已成为现实,因此可以直接从Microsoft商店购买。 我使用了Ubunto,它只有440MB,所以不用担心会占用磁盘空间。
完成此步骤后,您将看到所有安装为子系统的操作系统。
wsl --list --verbose
您应该在WSL 2上看到docker,docker-data,ubuntu。
激活Docker WSL2扩展
在Docker Desktop内部,只需检查配置并启用WSL2功能。 可能需要重新启动docker或重新启动PC。
警告:从标准模式切换到WSL2时,您将需要重新*载下**所有映像(位于Hyper-v VM而不是WSL2内)。 此外,命名卷中的数据存储在VM中,因此您不会在新的WSL2计算机中找到它们。 因此,首先,从Docker容器提取并备份所有相关数据。 根据本地设置,您可能会丢失数据。
选中“使用基于WSL2的引擎”

然后,您解锁WSL集成面板,您可以在其中激活Ubuntu发行版。

安装VsCode扩展
最后一步是安装和*载下**Visual Studio插件。 通常,您可以通过单击网站上的安装或通过Visual Studio Code UI来执行此操作。

插件地址: https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl
WSL2使用
此时,所有步骤都完成了,您可以开始编码了。
对于开始编码,您有两个选择:从WSL或Windwsow开始。
就个人而言,我喜欢第二个,因为它非常独立。
1.命令行:
1.打开WSL终端或在shell中输入命令“ WSL”。 由于Ubunto是首选的子系统,因此您将位于其中。
2.输入“code .”。 这将在Windows计算机上打开Visual Studio Code。(如果不起作用,需要先将vscode 安装目录下的bin文件夹加入linux系统变量)
2.UI
1.打开Visual Studio代码。
2.单击WSL框(左下角,底部工具栏中的绿色按钮)或F1 + Remore WLS +新窗口

3.新窗口与Linux OS连接
从那一刻起,您就可以使用Visual Studio Code来完成所需的一切。 实际上,您可以从文件树中打开一个终端。 终端将位于WSL机器内部,如果您运行docker-compose up,您将在主机docker系统上激活容器。 您还可以使用git工具来处理提交。
由于许多原因,许多开发人员正在使用Windows作为开发环境。与Linux相比,这是获得最佳程序兼容性或更好的用户体验的常见选择。其他人正在使用Windows来获得比Mackbook便宜的笔记本电脑。
Docker在所有OS系统上都具有相同的开发经验,但在某些情况下可能会导致Windows上的性能问题。
WSL2可以提高性能,但是需要注意将文件放置在何处以及如何创建卷。
完成这些步骤后,您便可以享受与Linux相同的性能,并获得舒适的Windows用户体验。