解决PHP项目在Docker(WSL2)中运行缓慢的问题

环境

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里后,再次运行项目,速度已经恢复正常~

参阅
### 如何在 Docker 中设置和使用 PHP 环境 #### 准备工作 为了在 Docker 容器内运行 PHP 应用程序,通常会创建一个基于官方 PHP 镜像的自定义镜像。这可以通过编写 `Dockerfile` 来实现,在其中指定所需的依赖项和服务配置。 #### 创建 Dockerfile 文件 下面是一个简单的例子来展示如何通过 Dockerfile 构建带有特定版本 PHP 的容器: ```dockerfile FROM php:7.4-fpm # 设置工作目录 WORKDIR /var/www/html # 复制项目文件到容器内的相应位置 COPY . . # 如果有额外扩展需求可以在此安装 RUN docker-php-ext-install pdo_mysql ``` 此脚本选择了 PHP 7.4 FPM 版本作为基础镜像,并设置了应用程序的工作路径为 `/var/www/html` 。还包含了复制本地代码至容器内部以及安装 PDO MySQL 扩展的操作[^1]。 #### 同步配置文件 对于更复杂的场景可能还需要同步一些重要的配置文件夹,比如 `php-fpm.d` 和 `conf.d` ,以便于调整性能参数或添加其他必要的设定: ```bash docker cp php74:/usr/local/etc/php-fpm.d /var/docker-data/php/php-fpm.d docker cp php74:/usr/local/etc/php /var/docker-data/php/conf.d ``` 这些命令允许宿主机上的开发者修改 PHP-FPM 及其关联模块的行为而无需重建整个镜像。 #### 解决 Windows 上的速度问题 当遇到在 Windows 平台上运行缓慢的情况时,优化措施可以从多个方面入手。例如减少不必要的服务启动、合理规划磁盘映射关系等。另外也可以考虑采用 WSL2 (Windows Subsystem for Linux version 2),因为相比传统方式它可以提供更好的兼容性和效率提升[^2]。 #### 使用 Docker Compose 组合多服务架构 如果计划部署完整的 LEMP 或 LNMP 堆栈(即 Nginx + MySQL/Redis),那么利用 Docker Compose 就显得尤为方便了。只需要编辑好对应的 YAML 格式的组合描述文档即可轻松管理各个组件之间的协作关系并快速完成环境初始化过程[^3]: ```yaml version: '3' services: webserver: image: nginx:latest ports: - "80:80" volumes: - ./src:/var/www/html - ./nginx.conf:/etc/nginx/nginx.conf database: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example cache: image: redis:alpine app: build: . depends_on: - ./src:/var/www/html ``` 上述实例展示了怎样借助 Docker Compose 实现由 Web Server(Nginx), Database(MySQL) 和 Cache(Redis)构成的应用集群结构;同时指定了各部分间的数据交换机制与端口暴露策略。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值