我已经更新了Windows 10到2004最新版本,安装了wsl 2并更新了它,安装了docker和ubuntu。
当我用“Hello World”创建一个简单的 * index.php * 文件时,它工作得很好(响应:100- 400 ms),但是当我添加我的 Laravel 项目时,它变得很糟糕,因为它在执行请求之前加载了7秒,并且响应是4 - 7秒😢,即使 PHPMyAdmin 运行得非常顺利(响应:1 - 2秒)。
我的docker-compose.yml文件:
version: '3.8'
networks:
laravel:
services:
nginx:
image: nginx:stable-alpine
container_name: nginx
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
- mysql
- phpmyadmin
networks:
- laravel
mysql:
image: mysql:latest
container_name: mysql
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: secret
SERVICE_TAGS: dev
SERVICE_NAME: mysql
networks:
- laravel
phpmyadmin:
image: phpmyadmin/phpmyadmin
restart: always
depends_on:
- mysql
ports:
- 8081:80
environment:
PMA_HOST: mysql
PMA_ARBITRARY: 1
php:
build:
context: .
dockerfile: Dockerfile
container_name: php
volumes:
- ./src:/var/www/html
ports:
- "9000:9000"
networks:
- laravel
composer:
image: composer:latest
container_name: composer
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
depends_on:
- php
networks:
- laravel
npm:
image: node:latest
container_name: npm
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
entrypoint: ['npm']
artisan:
build:
context: .
dockerfile: Dockerfile
container_name: artisan
volumes:
- ./src:/var/www/html
depends_on:
- mysql
working_dir: /var/www/html
entrypoint: ['php', '/var/www/html/artisan']
networks:
- laravel
我一直在试图解决这个问题2天,但找不到答案。
谢谢
9条答案
按热度按时间gwo2fgha1#
看起来像是在容器中安装Laravel项目。如果您将这些文件从Windows环境装载到WSL 2,这可能会导致非常糟糕的文件I/O,因为WSL 2当前在访问Windows环境中的文件时存在很多问题。此I/O问题截至2020年7月存在,您可以在GitHub here上找到该问题的持续状态。
我能想到的三种可能的解决方案可以暂时解决这个问题。
在问题解决之前,禁用docker基于WSL 2的引擎
由于此问题仅在WSL 2尝试访问Windows文件系统时发生,因此您可以选择禁用WSL 2 docker集成并在Windows环境中运行容器。您可以在Docker Desktop的UI中找到禁用它的选项:
将项目存储在WSL 2的Linux文件系统中
同样,由于当WSL 2尝试访问
/mnt
下的Windows文件系统的挂载点时会发生此问题,因此您可以选择将项目存储到WSL 2的Linux文件系统上。构建自己的Dockerfiles
你可以选择创建自己的Dockerfiles,而不是挂载你的项目,你可以将所需的目录
COPY
到docker镜像中。这将导致构建性能低下,因为WSL 2仍然必须访问Windows文件系统才能构建这些docker镜像,但运行时性能会好得多,因为它不必每次都从Windows环境中检索这些文件。zyfwsgd62#
您只需将所有源项目移动到文件夹
速度将非常快,这样的运行在Linux本机
之前
之后
zynd9foi3#
您正在
/mnt/xxx
文件夹上运行项目,是吗?因为wsl2 filesystem performance is much slower than wsl1 in /mnt.
如果你想要一个简短的解决方案,它在这里。适用于Ubuntu 18.04和Windows商店中的Debian:
1.进入Docker设置,打开
Expose daemon on tcp://localhost:2375 without TLS
并关闭Use the WSL 2 based engine
。1.运行此命令:
我在这里写了关于如何将Docker Desktop与WSL 1集成的说明:https://github.com/CaliforniaMountainSnake/wsl-1-docker-integration
r8uurelv4#
好吧,我得到了一个有趣的事实:))
在没有WSL 2的Windows上运行Docker。
请求具有TTFB 5.41s。这是index.php文件。我使用die()来检查哪里的时间更长,我发现如果我在terminate之后使用die(),TTFB变为~2.5s。
wsxa1bj15#
我在Windows 11上使用Laravel/Docker/Nginx时遇到了同样的问题。
我无法禁用“使用基于WSL 2的引擎”,因为它是灰色的,即使在Windows 11 Home上安装了Hyper-v(调整)。
以下是我找到的最佳解决方案:
1 .将项目复制到WSL文件夹中
完整的URL将类似于:*wsl.localhost\ubuntu\home\username\yourProject*
2.启动docker容器
从这个文件夹打开一个终端,然后启动你的容器
例如:docker-compose up -d
3. Visual Studio代码
pod7payv6#
您可以从合成文件中排除
vendor
文件夹,如dffbzjpn7#
这是提高速度的粗略方法,但这里是:
问题
从
vendor
目录加载composer依赖项的速度目前非常慢,该目录通过WSL 2从Windows上的项目根目录Map到docker容器。解决方案
将vendor目录复制到docker镜像,并使用它,而不是项目根目录中的Map目录。
使用MySQL数据库和Apache PHP 7.4以及composer自动加载的项目结构如下所示:
这里的想法是将开发内容与主根目录分开。
dev/docker-compose.yaml
这里我们有两个服务,一个用于MySQL数据库,另一个用于Apache with PHP,它将web根
/var/www/html
Map到我们的项目根。这使Apache能够查看项目源文件(src
和index.php
)。dev/db/Dockerfile
dev/www/Dockerfile
我在PHP 7.4中使用了官方的Apache buster镜像。
1.在这里,我们将
vendor
目录和vendor-override.php
复制到webroot目录(/var/www
)之上的目录,这样就不会干扰项目根目录。1.接下来,我们为每个人设置读写执行权限,以便Apache可以读取它。这是必要的,因为它在webroot之外。
1.现在这里的技巧是确保composer从
src
目录自动加载类。这个问题可以通过在项目根目录中创建一个从/var/www/src/
到/var/www/html/src
的链接来解决。dev/www/vendor-override.php
只需在docker镜像中使用
vendor
目录即可。index.php
如果检测到
vendor-override.php
文件,则使用该文件而不是项目根目录中的文件。这确保了index.php
在docker镜像中加载dir,这要快得多。composer.json
简单的自动加载设置将“Namespace”Map到项目根目录中的
src
目录。注意事项
vendor-override.php
而不是vendor缺点
缺点是每次更新依赖项时都必须构建Docker镜像。
r6hnlfcb8#
默认情况下,docker容器php:8.0-apache中不启用opcache。在dockerfile中添加:
创建文件opcache.ini:
n6lpvg4x9#
我刚刚从PowerShell启用了Hyper-V:
重新启动,现在它工作得相当好。我没有改变任何其他东西。
查看有关如何启用Hyper-V here的详细信息。