docker - 在 Nginx 容器 wsl2 上运行 Laravel 时,Docker 非常慢
问题描述
我已经将 Windows 10 更新到 2004 最新版本,安装并更新了 wsl2,安装了 docker 和 ubuntu。
当我使用“Hello World”创建一个简单的index.php文件时,它运行良好(响应:100-400ms)但是当我添加我的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 天,但找不到答案。
谢谢
解决方案
看起来您正在将 Laravel 项目安装在容器中。如果您将这些文件从 Windows 环境挂载到 WSL 2,这可能会导致文件 I/O 非常差,因为 WSL 2 目前在访问 Windows 环境中的文件时存在很多问题。此 I/O 问题截至 2020 年 7 月存在,您可以在 Github 上找到该问题的持续状态。
我能想到的三种可能的解决方案现在可以解决这个问题。
为 docker 禁用基于 WSL 2 的引擎,直到问题得到解决
由于此问题仅在 WSL 2 尝试访问 Windows 文件系统时发生,因此您可以选择禁用 WSL 2 docker 集成并改为在 Windows 环境中运行容器。您可以在 Docker Desktop 的 UI 中找到禁用它的选项:
将项目存储在 WSL 2 的 Linux 文件系统中
同样,由于当 WSL 2 尝试访问 Windows 文件系统的挂载点时会出现此问题/mnt
,因此您可以选择将项目存储到 WSL 2 的 Linux 文件系统中。
构建自己的 Dockerfile
您可以选择创建自己的 Dockerfile,而不是挂载您的项目,而是可以COPY
将所需的目录放入 docker 映像中。这将导致构建性能不佳,因为 WSL 2 仍然必须访问您的 Windows 文件系统才能构建这些 docker 映像,但运行时性能会好得多,因为它不必从 Windows 环境中检索这些文件每次。
推荐阅读
- regex - htaccess 重定向 301 没有分隔符
- javascript - 模块覆盖先前附加的窗口 mouseup 事件
- java - 带有 MediaPlayerService 的 java.lang.IllegalStateException
- flutter - 如何在颤动中显示动画 gif?
- python - 如何获取组合框的选定值(并将其存储在变量中)?
- laravel - 如何将数据传递给 Laravel 5.6 中的所有视图?
- r - 让您的统计学家满意:Stata 与 R 学生的 t 检验
- sql - 我们可以在组子句中使用相关子查询吗?
- metadata - 从网页获取元信息,给定它的 url?
- java - Oracle 和 java 自动启动