Sur Windows, un projet Symfony qui tourne dans Docker peut devenir très lent : premier chargement à 30–40 secondes, puis 2–3 secondes à chaque refresh… et dès que vous modifiez un contrôleur, vous repartez pour un gros délai.
La cause la plus fréquente : le projet est stocké dans le système de fichiers Windows (NTFS) et monté dans des conteneurs Linux. Résultat : énormément d’entrées/sorties (I/O) lentes (cache, vendor, autoload, fichiers temporaires…) et Symfony en souffre.
La solution la plus efficace (et la plus simple) : mettre le projet dans le système de fichiers Linux de WSL2 et lancer Docker depuis WSL.
Dans ce tutoriel, on reproduit exactement la démarche de la vidéo : installation d’un Ubuntu WSL dédié, copie du projet dans \\wsl$, configuration Docker Desktop, correction des permissions, puis mesure des gains.
Prérequis
- Windows 10/11 avec WSL2 activé
- Docker Desktop installé
- Un projet Symfony (ici Symfony 8) avec un
docker-compose.yaml - (Recommandé) PHPStorm (ou tout IDE compatible WSL)
1) Constater le problème
Dans la situation de départ :
- Projet Symfony 8 installé sur Windows
- Docker compose avec PHP + MySQL + Mailer + phpMyAdmin (donc “pas énorme” sur le papier)
Pourtant :
- Premier chargement : ~35 secondes
- Refresh : ~3 secondes
- Après une modif (contrôleur, template…) : parfois 30 secondes à nouveau
Avant de changer quoi que ce soit, notez vos temps (même “à la louche”) : ça permettra de valider le gain après migration dans WSL.
2) Stopper votre stack Docker Windows
Dans votre terminal (PowerShell ou terminal Docker), arrêtez les conteneurs du projet :
docker compose down
Si vous voulez repartir propre (facultatif), vous pouvez aussi supprimer volumes/containers liés au projet. Mais ce n’est pas obligatoire.
3) Vérifier vos distributions WSL existantes
Ouvrez PowerShell et listez vos distributions :
wsl --list --verbose Vous devriez voir quelque chose du genre : Ubuntu, docker-desktop, etc.
4) Installer un Ubuntu WSL dédié (“demo”)
Dans la vidéo, l’idée est d’avoir un Ubuntu séparé (nommé demo) pour travailler.
Cas A — si votre Windows supporte l’installation avec renommage
Certaines versions récentes permettent d’installer une distribution en lui donnant un nom (comme dans la vidéo). Si ça fonctionne chez vous, utilisez :
wsl --install -d Ubuntu --name demo
Cas B — si --name n’existe pas chez vous
Pas de panique : installez Ubuntu “normalement”, puis vous pourrez créer une seconde instance via export/import (méthode classique). Dans ce cas :
wsl --install -d Ubuntu
Ensuite, vous pouvez dupliquer/renommer via wsl --export et wsl --import
Première ouverture
Au premier démarrage, Ubuntu vous demande :
- un nom d’utilisateur
- un mot de passe
Ensuite, vous arrivez dans votre home Linux, généralement vide :
cd ~
ls 5) Mettre le projet Symfony dans WSL (le point clé)
Objectif : avoir votre projet dans un chemin Linux du type :
/home/<user>/symfony-wsl
Méthode 1 : via l’explorateur Windows (\\wsl$)
- Ouvrez l’explorateur Windows
- Dans la barre d’adresse, allez sur :
\\wsl$\
- Ouvrez votre distro
demo - Allez dans :
\\wsl$\demo\home\<user>\
- Créez un dossier (ex :
symfony-wsl) - Copiez votre projet dedans
Note : dans la vidéo, MySQL est retiré avant copie pour éviter des soucis de permissions. Ça peut arriver, surtout si vous copiez des fichiers déjà créés par des conteneurs.
Méthode recommandée : copier depuis WSL
Si votre projet est sur C:\..., vous pouvez copier depuis WSL via /mnt/c/... (ça évite certains effets de bord) :
mkdir -p ~/symfony-wsl
# exemple : copier un dossier projet depuis Windows vers WSL cp -R /mnt/c/chemin/vers/votre-projet/* ~/symfony-wsl/
6) Ouvrir le projet “dans WSL” (important)
Vous devez travailler dans l’environnement WSL.
Deux options :
- Ouvrir PHPStorm sur le dossier
\\wsl$\demo\home\... - Ou depuis un terminal WSL, si vous utilisez VSCode :
cd ~/symfony-wsl
code .
Vous saurez que vous êtes “bien” dans WSL si votre terminal intégré est un bash Ubuntu et que vos chemins commencent par /home/....
7) Vérifier Docker Desktop : activer l’intégration WSL pour “demo”
C’est le piège classique : Docker fonctionne, mais pas dans la distro WSL tant que l’intégration n’est pas activée.
Dans Docker Desktop :
- Settings
- Resources
- WSL Integration
- Activez votre distro demo
Ensuite, retournez dans le terminal WSL.
8) Lancer Docker Compose depuis WSL
Dans votre dossier projet (dans WSL) :
docker compose up -d
Si tout va bien, vos services démarrent.
Si un service ne démarre pas (ex : souci de certificats .crt)
Dans la vidéo, un conteneur ne démarre pas car des fichiers .crt n’ont pas été copiés / ou ne sont pas accessibles (permissions).
Deux options simples en dev :
Option 1 : désactiver SSL pour ce projet (si vous n’en avez pas besoin)
Option 2 : corriger la copie + permissions (voir section suivante)
9) Corriger le gros classique : fichiers copiés mais “propriétaire = root”
Après une copie vers Linux, il arrive que les fichiers appartiennent à root (visible avec ls -l).
Dans ce cas, vous allez galérer (édition, suppression, copie de fichiers, etc.) et vous serez tenté de mettre sudo partout.
Solution : reprendre la propriété du projet.
Dans le dossier du projet :
cd ~/symfony-wsl
ls -l
Si vous voyez root root un peu partout, faites :
sudo chown -R $USER:$USER .
Re-vérifiez :
ls -l
Vous devez maintenant voir votre utilisateur comme propriétaire.
10) Corriger les permissions Symfony : var/cache et var/log
Une fois la stack démarrée, vous pouvez tomber sur des erreurs Symfony liées à l’écriture dans :
var/cachevar/log
Dans la vidéo, la correction appliquée consiste à donner ces dossiers à www-data (l’utilisateur web dans beaucoup d’images PHP/Apache ou PHP-FPM).
Option A : changer le owner du dossier var
Depuis WSL, à la racine du projet :
sudo chown -R www-data:www-data var
Option B : faire le chown dans le conteneur PHP
Si votre code est monté dans /app dans le conteneur :
docker compose exec php bash -lc "chown -R www-data:www-data /app/var" Important : selon votre Dockerfile / image, le service ne s’appelle pas forcément
phpet le chemin n’est pas forcément/app. Adaptez à votredocker-compose.yaml.
11) Constater le gain de performance
Rechargez votre Symfony.
Dans la vidéo, on passe à :
~24 ms, 10 ms, 14 ms sur des refresh
Un premier chargement autour de quelques centaines de ms au lieu de dizaines de secondes
C’est exactement l’objectif : Docker tourne “dans” un Linux (WSL2) avec un FS Linux, au lieu de faire transiter chaque lecture/écriture par NTFS.
12) Tester un vrai workflow dev (création d’un contrôleur)
On se connecte au conteneur PHP et on génère un contrôleur :
docker compose exec php bash
Puis dans le conteneur :
symfony console make:controller MainController
Vous retrouvez votre contrôleur dans votre projet, vous modifiez la route / le contenu, et vous constatez que :
- le premier chargement après création est raisonnable
- les refresh suivants sont instantanés
- vous n’avez plus les “30 secondes à chaque modif”
Dépannage rapide (les soucis les plus fréquents)
“docker: command not found” dans WSL
- Vérifiez Docker Desktop
- Vérifiez WSL Integration activée pour votre distro (
demo)
Permissions impossibles / “Operation not permitted”
- Vérifiez le propriétaire des fichiers :
ls -l - Reprenez la main :
sudo chown -R $USER:$USER .
Symfony n’écrit pas dans var/
- Faites
sudo chown -R www-data:www-data var - Ou faites-le directement dans le conteneur (souvent mieux)
Certificats / .crt non copiés
- En dev : désactivez temporairement SSL si ce n’est pas le sujet
- Sinon : recopiez et corrigez les permissions après copie
Conclusion
Si vous développez Symfony sur Windows et que Docker est lent, la solution la plus efficace est :
- Installer WSL2 (Ubuntu)
- Mettre le projet dans le FS Linux (
\\wsl$\...//home/...) - Activer l’intégration WSL dans Docker Desktop
- Lancer
docker composedepuis WSL - Corriger les permissions (
chownutilisateur +var/pourwww-data)
Résultat : un Symfony qui redevient fluide, même sur Windows.
Obtenir de l'aide
Pour obtenir de l'aide, vous pouvez accéder au serveur Discord pour une entraide par chat.