Symfony 在使用 WSL2 的 Docker 中仍然很慢

Mar*_*nst 7 php symfony docker windows-subsystem-for-linux

TL;DR: 在我读到 WSL2 将用于 Windows(和 Docker)14 个月后,我尝试了 Symfony 5,但它仍然像巧克力球一样慢。

早在 2020 年第一季度,我就了解到 Symfony 和 Docker 在简单的设置环境中非常慢。我们尝试了又尝试,但没有成功:无论我们如何努力,我们都无法获得 Symfony sub 4.000ms。解决方案之一显然是将供应商文件夹移到由 Docker 和 Window 管理的绑定安装之外(可通过 explorer.exe 访问),同样的情况也适用于 var 目录(用于日志和缓存)。

现在是 2021 年第二季度,一年多后,我在 PHP 和 .NET 之间轮换,但我仍然想尝试一下。我下载了我能找到的最新版本的 Windows 版 Docker Desktop,以及 Hyper-V 和 WSL2 支持。我安装了 Microsoft 的支持驱动程序,然后就可以开始了。

一个小时后,在查找了一些有关 Docker 如何实际工作的数据后,我快速部署了 PHP 7.4、NGINX、PostgreSQL、MongoDB 和 Redis 容器/堆栈,并且通过简单的 phpinfo() 和一些随机调用,一切都可以流畅地运行上述数据库。

我安装了全新的 Symfony 5,令我惊讶的是我仍然发现问题仍然存在。甚至没有与数据库建立连接,但它仍然无法运行。很自然地,我将堆栈简化回 PHP 7.4 和 NGINX 堆栈,希望在某个地方我急切地迷失了方向。不幸的是,我猛然醒悟——它仍然很糟糕。

我的设置

# ./docker-compose.yml
version: '3'

services:
  php-fpm:
    build:
      context: ./php-fpm
    volumes:
      - ../src:/var/www
    networks:
      - symfony

  nginx:
    build:
      context: ./nginx
    volumes:
      - ../src:/var/www
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/sites/:/etc/nginx/sites-available
      - ./nginx/conf.d/:/etc/nginx/conf.d
      - ./logs:/var/log
    depends_on:
      - php-fpm
    ports:
      - "80:80"
    networks:
      - symfony

networks:
  symfony:
Run Code Online (Sandbox Code Playgroud)

PHP-FPM

# ./php-fpm/Dockerfile
FROM php:7-fpm-alpine
RUN apk --update --no-cache add git nano
COPY --from=composer /usr/bin/composer /usr/bin/composer
WORKDIR /var/www
CMD php-fpm
EXPOSE 9000
Run Code Online (Sandbox Code Playgroud)

NGINX

FROM nginx:alpine
WORKDIR /var/www
CMD ["nginx"]
EXPOSE 80
Run Code Online (Sandbox Code Playgroud)

正如您可以从我上面的示例中确定的那样,我有一个src文件夹,其中简单地保存了一个symfony new src --full安装,其中包含基本安装提供的所有花哨功能 - 仅此而已。

我能找到的使安装顺利进行的唯一解决方案是在容器内执行以下操作php-fpm

cd /var/www
rm -rf var/
mv vendor ..
ln -s /vendor vendor/
mkdir /var-symfony
chmod 777 /var-symfony
ln -s /var-symfony var/
Run Code Online (Sandbox Code Playgroud)

虽然我可以简单地将其放入 Dockerfile 或 compose YAML 中,但它引出了一个问题:为什么 Flippin' freck 如此缓慢?我认为经过至少一年的大量投诉后他们可能已经解决了这个问题。

我还找到了networks反映在我的 YAML 中的选项。那也没有解决任何问题。也许它会降低 TCP 连接,因为它是 TCP,而不是直接连接到套接字,但我还没有尝试和测试它。

我阅读了一些使用 docker 创建卷的内容,这在一定程度上解决了问题,但并不能完全解决。它仍然感觉像是一些应该开箱即用的东西的拼凑而成。

有人有一个现实世界的用例吗?

Jul*_* B. 14

如果您的绑定挂载指向 Windows 分区上的文件夹,您很可能会获得糟糕的性能。我所做的就是克隆 WSL 中的存储库~/dev(我放置所有项目的位置),然后从 WSL 的 shell 运行我的容器(我使用 Ubuntu 20.04)。然后,为了能够使用我的 IDE (PhpStorm) 并同步代码,我从\\wsl$\Ubuntu-20.04\home\julien\dev\my-prohect\. 如果您使用 VS Code,则有一个扩展https://code.visualstudio.com/blogs/2019/09/03/wsl2

我确实创建了一个映射驱动器以使这一切变得更加容易。在 Windows 的 CMD 中:

net use U: \\wsl$\Ubuntu-20.04 /PERSISTENT:YES