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 环境中检索这些文件每次。
小智 10
您只需将所有源项目移至文件夹即可
\\wsl$\Ubuntu-20.04\home\<User Name>\<Project Name>
Run Code Online (Sandbox Code Playgroud)
在 Linux Native 上运行速度会非常快
您正在该/mnt/xxx文件夹上运行您的项目,不是吗?
这是因为/mnt 中的 wsl2 文件系统性能比 wsl1 慢得多。
如果您想要一个非常简短的解决方案,就在这里。适用于 Windows 商店中的 Ubuntu 18.04 和 Debian:
Expose daemon on tcp://localhost:2375 without TLS和关闭Use the WSL 2 based engine。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)
我在 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代码
从 Visual Studio 打开项目文件夹: CTRL + P,>Remote-WSL:在 WSL 中打开文件夹...
从命令行打开项目文件夹: code --remote wsl+Ubuntu /home/username/yourProject
| 归档时间: |
|
| 查看次数: |
16447 次 |
| 最近记录: |