环境
Windows 11
Docker Desktop 4.17.1(开启WSL2)
WSL2(Ubuntu-22.04)
前言
最近在使用Docker容器运行PHP项目的时候,发现特别缓慢。例如一个干净的 ThinkPHP 5.1 框架,访问首页都需要1秒以上,如果再加上数据库查询、复杂的业务逻辑等代码的话,那速度可想而知。
我的开发模式是,在Windows上使用 IDE 开发,代码也是存储在Windows系统上,然后docker通过挂载的方式,将代码目录挂载到容器里去运行。
后面查资料得知,是因为Docker是跑在 WSL2 里的,虽说 WSL2 相比 WSL1 更先进,但在跨系统文件读写性能方面是比 WSL1 差的(参阅:比较 WSL 1 和 WSL 2),因此,跑在 WSL2 里的docker想要跨系统访问Windows系统上的代码文件的话,性能是很差的。
解决方法
第一种方法
让docker不要使用WSL2,改为使用WSL1。方法很简单,在设置里面关闭 WSL2 就可以:
但正如图中描述所说,Windows Home版本只能使用 WSL2,不支持WSL1,我的正好是Home版本,因此这种方法行不通。
第二种方法
既然问题起因是跨系统文件读写性能差,那么我们不要跨系统读写不就可以了?
所以我不再把代码存储在Windows系统上,改为存储在 WSL2 上。
1)首先要安装一个WSL系统,我选择的是Ubuntu 22.04,在Microsoft Store中搜索Ubuntu安装就可以:
因为我已经安装好了,所以图片中显示的是“已拥有”。
2)在Docker Desktop中开启WSL集成功能,并重启Docker:
开启WSL集成功能后,我们就可以在Ubuntu里使用docker命令了。3)进入Ubuntu shell命令行界面,如下图所示,搜索ubuntu,点击就可以:
或者在Powershell中执行
wsl -d Ubuntu-22.04
命令也可以。
4)进入ubuntu命令行界面后,发现执行docker命令会报错:
这是因为当前用户没有足够的权限,解决方法是,在前面加上sudo,即sudo docker ps
就可以。
但我不想每次都加sudo,太麻烦了。还有另外一种方法,执行sudo usermod -aG docker ${USER}
命令将当前用户加入到docker用户组就可以不用加sudo了。
注意:加入到docker用户组后,要关闭当前窗口,重新进入ubuntu命令行才会生效!
5)在ubuntu中选一个路径作为你项目的存储目录,我选的是 /home/workspace 目录,因为我的项目有上传到git仓库,因此我使用 git clone 命令将代码下载到 /home/workspace 目录即可。
6)在ubuntu中启动docker容器,将代码目录挂载到docker容器里去,命令参考:
docker run -d -v /home/workspace:/var/www/html --name {CONTAINER_NAME} {IMAGE_NAME}
/home/workspace
是宿主机路径,/var/www/html
是容器路径,{CONTAINER_NAME}
是容器名字,{IMAGE_NAME}
是镜像名字,需自行替换。
7)现在我的代码都存储在ubuntu里了,那在Windows上我还怎么用IDE进行开发?
不用急,在Windows上我们也是可以访问ubuntu里的文件的。
例如下图,在IDE里打开项目的时候,选择\\wsl$\Ubuntu-22.04\
,这个文件夹里的就是ubuntu系统里的文件目录,然后选择你代码所在的文件夹打开就可以了:
8)将代码改为存储在ubuntu里后,再次运行项目,速度已经恢复正常~