首页 > 解决方案 > 在 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 天,但找不到答案。

谢谢

标签: dockerdocker-composewindows-subsystem-for-linuxdocker-for-windows

解决方案


看起来您正在将 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 环境中检索这些文件每次。


推荐阅读