Débat audio sur l'article :
Meta description : Les volumes Docker bind-mount sur Windows degradent les performances jusqu'a 20x. Decouvrez comment migrer vers WSL2 Ubuntu pour retrouver des performances natives Linux.
Mots-cles : WSL2 Docker performance, Docker volumes Windows lent, migration WSL2 Ubuntu, Docker Compose WSL2
Pendant des mois, tous mes projets tournaient sur Windows avec Docker Compose. Bases de donnees, services d'embeddings, outils de monitoring -- tout etait containerise. L'architecture fonctionnait. Mais il y avait un probleme que je contournais sans jamais le resoudre : les volumes.
Chaque fois que je montais un repertoire Windows dans un conteneur Linux, les performances s'effondraient. Pas un ralentissement discret. Un facteur 10 a 20x sur les operations d'I/O fichier. Du coup, j'avais pris l'habitude de desactiver les volumes bind-mount et de copier les fichiers manuellement dans les conteneurs. Fonctionnel, mais frustrant.
Un jour, en pleine session de travail, Claude (mon assistant IA) me dit : "Pourquoi tu ne mets pas en place WSL2 Ubuntu sur ta machine ? Tu pourras connecter tes repertoires aux conteneurs Docker en gardant les performances."
Ma reaction : "C'est possible ?"
La reponse etait oui. Et depuis, tous mes projets tournent sur WSL2. Ca fonctionne du feu de dieu.
Avant de continuer de lire la suite de l'article, je vous invite à vous inscrire à ma newsletter, pour connaître en avant première les futurs sujets traités chaque semaine.
Le probleme : les systemes de fichiers ne se melangent pas
Pour comprendre le probleme, il faut connaitre l'architecture sous-jacente. Quand Docker tourne via Docker Desktop sur Windows, les conteneurs Linux s'executent dans une machine virtuelle WSL2. Jusque-la, rien de grave.
Le probleme apparait quand vous montez un repertoire Windows (C:\Users\mathi\projet) dans un conteneur Linux. Le chemin traverse une frontiere : du systeme de fichiers NTFS (Windows) vers ext4 (Linux dans WSL2). Cette traduction a un cout.
Les benchmarks de la communaute sont sans appel :
| Operation | Systeme de fichiers natif | Cross-filesystem (Windows → WSL2) | Degradation |
|---|---|---|---|
| Lecture sequentielle | ~1 ms | ~15-20 ms | 15-20x |
| Ecriture aleatoire | ~2 ms | ~25-40 ms | 12-20x |
| Scan de repertoire (node_modules) | ~200 ms | ~4-8 s | 20-40x |
| Hot reload (inotify) | Instantane | Non supporte | Casse |
Le dernier point est critique : les evenements inotify (utilises par webpack, Vite, nodemon pour le hot reload) ne traversent pas la frontiere du systeme de fichiers. Vos outils de developpement ne detectent plus les changements de fichiers en temps reel.
C'est le probleme numero un identifie par Docker dans sa documentation officielle sur WSL2 : "File I/O across OS filesystems is slow. Store source code in the Linux filesystem."
La solution : deplacer les projets dans le systeme de fichiers Linux
L'idee est simple. Au lieu de garder vos projets sur C:\Users\... et de les monter dans Docker, vous les stockez directement dans le systeme de fichiers Linux de WSL2, sous /home/user/projets/.
Docker accede alors a des fichiers qui vivent dans le meme systeme de fichiers que les conteneurs. Plus de traduction NTFS → ext4. Plus de latence cross-filesystem.
Ce que ca change concretement
Avant la migration, mon architecture ressemblait a ca :
Windows (NTFS)
└── C:\Users\mathi\projets\
└── docker-compose.yml
└── volumes: C:\Users\mathi\data → /data (LENT)
Apres :
WSL2 Ubuntu (ext4)
└── /home/mathieu/projets/
└── docker-compose.yml
└── volumes: ./data → /data (NATIF)
Les conteneurs Docker et les fichiers vivent dans le meme monde. Le gain est immediat.
Mon retour d'experience : la migration en pratique
Etape 1 -- Installer WSL2 Ubuntu
Si WSL2 n'est pas encore installe :
wsl --install -d Ubuntu
Activer systemd (necessaire pour les services) :
# /etc/wsl.conf
[boot]
systemd=true
Redemarrer WSL (wsl --shutdown puis wsl).
Etape 2 -- Deplacer les projets
Copier les projets depuis Windows vers le systeme de fichiers Linux :
cp -r /mnt/c/Users/mathi/projets/ ~/projets/
Point important : ne pas utiliser de symlink vers /mnt/c/.... Les symlinks traversent la frontiere du systeme de fichiers et annulent le gain de performance. Les fichiers doivent physiquement vivre dans ext4.
Etape 3 -- Adapter Docker Compose
Les docker-compose.yml n'ont generalement pas besoin de modification si vous utilisez des chemins relatifs (./data au lieu de C:\Users\...). Verifiez simplement que les volumes pointent vers des chemins locaux.
Etape 4 -- Migrer les services (Ollama, pgvector...)
Pour mes projets, la migration incluait aussi Ollama (LLM local) et pgvector (base vectorielle). Le processus :
- Copier les modeles depuis Windows sans retelecharger (les binaires sont identiques) :
cp -r /mnt/c/Users/mathi/.ollama/models/ ~/.ollama/models/
- Configurer le service systemd avec port personnalise :
sudo mkdir -p /etc/systemd/system/ollama.service.d
printf '[Service]\nEnvironment="OLLAMA_HOST=127.0.0.1:11700"\nUser=mathieu\n' \
| sudo tee /etc/systemd/system/ollama.service.d/port.conf
sudo systemctl daemon-reload && sudo systemctl enable --now ollama
- Corriger les scripts qui hardcodaient l'IP gateway WSL2 (
192.168.65.254) enlocalhost.
Les resultats : des chiffres qui parlent
Apres la migration, j'ai benchmarke mes deux modeles LLM (qwen2.5-coder:3b et qwen3-nothink:4b) sur les memes taches. Le GPU (RTX 3050 6GB) est identique, seul l'OS change.
Time-to-first-token (latence initiale)
| Tache | Windows natif | Ubuntu WSL2 | Gain |
|---|---|---|---|
| Instruction courte (2 tokens) | 2 275 ms | ~180 ms | 12x plus rapide |
| Commit message (17 tokens) | 2 707 ms | 227 ms | 12x plus rapide |
| Code review (85 tokens) | 4 052 ms | ~1 500 ms | 2.7x plus rapide |
L'amelioration la plus spectaculaire concerne le TTFT (time-to-first-token). L'hypothese : le stack TCP loopback Windows introduit un overhead fixe d'environ 2 secondes, absent avec le socket Linux natif dans WSL2.
Debit soutenu (tokens/seconde)
| Modele | Windows GPU | Ubuntu WSL2 | Delta |
|---|---|---|---|
| qwen2.5-coder:3b | 40-56 t/s | 57-78 t/s | +28 a +80 % |
| qwen3-nothink:4b | ~21 t/s | ~34 t/s | +62 % |
Impact sur le workflow quotidien
| Hook / Operation | Avant (Windows) | Apres (WSL2) | Impact |
|---|---|---|---|
| Smart commit (LLM) | ~2.7 s | ~0.4 s | Quasi-instantane |
| Code review IA | ~5.7 s | ~2.9 s | Divise par 2 |
| Score qualite | ~2.3 s | ~0.2 s | Quasi-instantane |
Aucune regression n'a ete observee. Le debit soutenu sur les generations longues (640 tokens) reste identique ou superieur.
Les pieges a eviter
La migration n'est pas sans surprises. Quelques points de vigilance :
1. sudo et les binaires locaux
Les binaires installes dans ~/.local/bin (comme Claude Code) ne sont pas accessibles via sudo a cause du secure_path d'Ubuntu. Solution : creer un symlink dans /usr/local/bin.
sudo ln -sf ~/.local/bin/claude /usr/local/bin/claude
2. Les IP hardcodees
Si vos scripts utilisaient l'IP gateway WSL2 (192.168.65.254) pour communiquer entre Windows et WSL2, ces adresses ne fonctionnent plus quand le service tourne directement dans WSL2. Remplacez par localhost.
3. L'espace disque
Le systeme de fichiers WSL2 vit dans un fichier VHD (.vhdx) sur le disque Windows. Surveillez la taille et pensez a wsl --manage Ubuntu --resize si necessaire.
4. Les sauvegardes
Vos fichiers dans WSL2 ne sont plus visibles directement dans l'explorateur Windows (sauf via \\wsl$\Ubuntu\home\...). Adaptez vos strategies de backup.
Conclusion
La migration de Windows vers WSL2 Ubuntu pour Docker n'est pas un luxe d'optimisation. C'est un changement d'architecture qui elimine un goulot d'etranglement fondamental : la traduction entre systemes de fichiers.
Les resultats sont mesurables : latence divisee par 12 sur les operations courtes, debit en hausse de 30 a 80 %, hot reload fonctionnel, architecture simplifiee.
Le plus ironique ? C'est mon assistant IA qui m'a suggere cette migration. La lecon : parfois, les solutions les plus impactantes ne sont pas les plus complexes. Elles sont juste celles qu'on n'a pas encore envisagees.
Si vous developpez sur Windows avec Docker et que vous n'avez pas encore migre vos projets dans le systeme de fichiers WSL2 : faites-le. C'est une journee de travail pour des mois de gain.
Mathieu GRENIER -- Consultant IA & Architecture technique
Sources :
- Docker Desktop WSL 2 Best Practices
- Increase WSL2 and Docker Performance on Windows By 20x
- Docker on Windows vs Linux -- The Differences Nobody Warns You About
- Comparing WSL Versions -- Microsoft Learn
- Poor performance with Docker Desktop on Windows in WSLv2
Docker sur Windows : pourquoi vos volumes plombent vos performances (et comment WSL2 change la donne)