在 Nginx 容器 wsl2 上运行 Laravel 时,Docker 非常慢

Wai*_*aly 22 docker docker-compose windows-subsystem-for-linux docker-for-windows

我已经将 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
Run Code Online (Sandbox Code Playgroud)

我一直试图解决这个问题 2 天,但找不到答案。

谢谢

oct*_*pus 19

看起来您正在将 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 桌面 UI 中找到禁用它的选项: 在此处输入图片说明


将您的项目存储在 WSL 2 的 Linux 文件系统中

同样,由于当 WSL 2 尝试访问 下的 Windows 文件系统的挂载点时会发生此问题/mnt,因此您可以选择将项目存储到 WSL 2 的 Linux 文件系统上。


构建自己的 Dockerfile

您可以选择创建自己的 Dockerfile,而不是挂载您的项目,而是可以COPY将所需的目录放入 docker 镜像中。这会导致构建性能不佳,因为 WSL 2 仍然需要访问您的 Windows 文件系统才能构建这些 docker 镜像,但运行时性能会好得多,因为它不必从 Windows 环境中检索这些文件每次。

  • 禁用基于 WSL 2 的引擎对我有用,谢谢! (4认同)
  • @user3529607 在 WSL 中,您有 Linux 文件系统(例如目录 `\\wsl$\Ubuntu-18.04`)和 Windows 文件系统作为挂载点(例如 `\\wsl$\Ubuntu-18.04\mnt\c`)。简而言之,请将项目文件放置在 `/mnt/` 子目录以外的位置,否则很有可能将项目文件放置在 Windows 文件系统中,这就是导致不良 IO 的原因。 (2认同)
  • 禁用 WSL2 效果很好!非常感谢! (2认同)
  • 禁用 WSL2 docker 引擎并在 Windows 10 专业版中启用 Hyper-V,对我有用,谢谢。:-) (2认同)

小智 10

您只需将所有源项目移至文件夹即可

\\wsl$\Ubuntu-20.04\home\<User Name>\<Project Name>
Run Code Online (Sandbox Code Playgroud)

在 Linux Native 上运行速度会非常快

前

后


Jam*_*ond 6

您正在该/mnt/xxx文件夹上运行您的项目,不是吗?

这是因为/mnt 中的 wsl2 文件系统性能比 wsl1 慢得多。

如果您想要一个非常简短的解决方案,就在这里。适用于 Windows 商店中的 Ubuntu 18.04 和 Debian:

  1. 转到 docker 设置并打开Expose daemon on tcp://localhost:2375 without TLS和关闭Use the WSL 2 based engine
  2. 运行这个命令:
clear && sudo apt-get update && \
sudo curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh get-docker.sh && sudo usermod -aG docker $USER && \
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && sudo chmod +x /usr/local/bin/docker-compose && \
echo "export PATH=\"$PATH:$HOME/.local/bin\"" >> ~/.profile && source ~/.profile && \
echo "export DOCKER_HOST=tcp://localhost:2375" >> ~/.bashrc && source ~/.bashrc && \
printf '[automount]\nroot = /\noptions = metadata' | sudo tee -a /etc/wsl.conf
Run Code Online (Sandbox Code Playgroud)

我在这里编写了有关如何将 Docker Desktop 与 WSL 1 集成的说明: https://github.com/CaliforniaMountainSnake/wsl-1-docker-integration


小智 5

好吧,我得到了一个有趣的事实:))

在没有 WSL2 的 Windows 上运行 docker。

请求有 TTFB 5.41 秒。这是index.php 文件。我使用 die() 来检查哪里时间更大,我发现如果我在终止后使用 die(),TTFB 会变成约 2.5 秒。

<?php
/**
 * Laravel - A PHP Framework For Web Artisans
 *
 * @package  Laravel
 * @author   Taylor Otwell <taylor@laravel.com>
 */

define('LARAVEL_START', microtime(true));

require __DIR__.'/../../application/vendor/autoload.php';

$app = require_once __DIR__.'/../../application/bootstrap/app.php';

#die(); <-- TTFB 1.72s
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$response->send();

#die(); <-- TTFB 2.67s

$kernel->terminate($request, $response);

#die(); <-- TTFB 2.74s

#if there is no die in the file then TTFB is ~6s
Run Code Online (Sandbox Code Playgroud)


Sqd*_*qdz 5

我在 Windows 11 上使用 Laravel/Docker/Nginx 时遇到了同样的问题。

我无法禁用“使用基于 WSL 2 的引擎”,因为即使在 Windows 11 Home 上安装 Hyper-v(调整)后,它也是灰色的。

这是我找到的最佳解决方案:

1. 将您的项目复制到 WSL 文件夹中

  • 打开 Windows 资源管理器并输入以下地址:\ wsl.localhost \
  • 选择您的 WSL 实例,然后您可以将项目复制到/home/yourUsername/

完整的 URL 类似于:\ wsl.localhost\ubuntu\home\username\yourProject

2.启动docker容器

只需从此文件夹打开一个终端,然后启动容器

例如: docker-compose up -d

3.Visual Studio代码

从 Visual Studio 打开项目文件夹: CTRL + P,>Remote-WSL:在 WSL 中打开文件夹...

从命令行打开项目文件夹: code --remote wsl+Ubuntu /home/username/yourProject