【Docker】windwos docker 下 laravel 项目运行慢的问题?

问题描述

我在windows 下安装的 docker for windows 自己创建了lnmp环境,
但是遇到了很尴尬的问题同样的代码,在我的云服务器上响应时间很短:

【Docker】windwos docker 下 laravel 项目运行慢的问题?

但是在windows docker 环境下 响应时间需要一两秒,相差几乎十倍

【Docker】windwos docker 下 laravel 项目运行慢的问题?

docker-compose
文件如下:

问题出现的平台版本及自己尝试过哪些方法

出现平台:windwos
我自己在网络上查找了相关的解决办法,说是io的问题 需要加上cached 参数
但是我加入这个参数之后,响应速度几乎没有提升?
请问有什么可以解决的办法吗??

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

version: "3"
services:

nginx:

image: nginx

container_name: lnmp_nginx

ports:

- "80:80"

- "443:443"

networks:

lnmp:

ipv4_address: ${NGINXADDR}

volumes:

- ./log/nginx/nginx:/var/log/nginx

- ./code/php:/var/www/html/:cached

- ./config/nginx/nginx.conf:/etc/nginx/nginx.conf

- ./config/nginx/conf.d:/etc/nginx/conf.d

mysql:

image: mysql

container_name: lnmp_mysql

environment:

MYSQL_ROOT_PASSWORD: root

volumes:

- ./data/mysql:/var/lib/mysql

networks:

lnmp:

ipv4_address: ${MYSQLADDR}

ports:

- "3306:3306"

phpfpm:

build: ./Dockerfiles/php/

container_name: lnmp_phpfpm

links:

- mysql:mysql

- redis:redis

volumes:

- ./code/php:/var/www/html/:cached

- ./config/php/:/usr/local/etc/

networks:

lnmp:

ipv4_address: ${PHPFPMADDR}

ports:

- "9000:9000"

- "9501:9501"

- "8000:8000"

redis:

image: redis

ports:

- "6379:6379"

container_name: redis

volumes:

- ./data/redis:/data

networks:

lnmp:

ipv4_address: ${REDISADDR}

command: redis-server --appendonly yes

networks:

lnmp:

driver: bridge

ipam:

driver: default

config:

- subnet: 172.16.238.0/24

回答

Docker for Windows是在Hyper-V虚拟机上跑Linux,文件挂载是通过SMB协议从Windows挂载到Linux,文件读写都经过网络,遇到Laravel这种每次启动就要加载几百个文件的框架,文件性能问题就尤其明显。

最好的验证方法就是进到容器里,strace一下php-fpm进程,看下系统调用的耗时,你就会发现大部分时间都是在stat或read,所以解决的思路就是减少网络文件系统的读写。

方案0: 开opcache,减少read调用

方案1:不使用SMB协议挂载文件,通过union、rsync之类的工具同步文件修改。

方案2: 用WSL2

方案3:修改cifs内核模块,单独加大vendor目录的缓存时间,因为vendor目录下的文件很少变更,加大文件信息的缓存时间可以减少大量网络调用。加上方案0,响应时间从1秒减少到0.1秒。(现在我就在用这个方案,自己在Hyper-V跑Arch Linux + 修改过的cifs模块化 + docker)

Github有相关的讨论:Shared Volumes Slow ,基本都是方案0-2。

在mac电脑上,可以使用"docker-machine-nfs"这个工具,把你的user文件夹挂载到docker容器中,这样就能解决使用传统的SMB协议进行挂载时需要通过网络来进行文件读取时的高延时问题。
但是这个工具在windows上不能使用,目前windows上可以考虑使用楼上所说的方法。
或者这样:
在容器中安装ftp服务,在phpstorm上配置laravel项目的文件夹映射,保存文件时实时FTP同步文件到docker容器中。在实例化镜像生成容器时,不要对laravel项目进行文件夹映射(-v参数设置),但是仍然可以对其他项目(不会出现运行时可能同时加载很多文件(超过17k))进行文件夹映射。这样相当于,单独对laravel项目的文件同步机制做了设置(使用FTP同步,而不是SMB),同时在nginx的虚拟主机文件配置处,设置root为对应的docker容器的项目路径。
这个过程略为繁琐:
1) 容器中安装ftp默认是不能正常运行的,需要在实例化生成容器时加privilege参数;
2) 对于要进行ftp同步的项目,需要使用docker cp手动复制一次,如果项目文件比较大,会比较耗时;
3) 同时phpstorm也需要做相关的FTP同步设置。

备注:在linux系统中不会存在这个问题

参考:https://thepracticalsysadmin....

以上是 【Docker】windwos docker 下 laravel 项目运行慢的问题? 的全部内容, 来源链接: utcz.com/a/80268.html

回到顶部