Docker sur Windows : pourquoi vos volumes plombent vos performances (et comment WSL2 change la donne)

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.

Débat audio sur l'article :

# DEBATE-028 : Docker sur Windows — pourquoi vos volumes plombent vos performances et comment WSL2 change la donne **Source :** published/blog/ARTICLE-028-migration-wsl2-docker-performance.md **Speakers :** Mathieu (homme), Vivienne (femme) **Duration :** ~10 minutes **Date :** 2026-03-06 **Note :** Termes anglophones conservés quand ils sont des termes techniques courants (Docker, bind-mount, inotify, hot reload). Ton neutre sans émotion. Les nombres sont écrits en toutes lettres. --- [Vivienne] Mathieu tu utilises Docker sur Windows depuis des années. Mais tu avais un problème avec les volumes. [Mathieu] Oui. Tous mes projets tournaient sur Windows avec Docker Compose. Bases de données et services d'embeddings et outils de monitoring. Tout était containerisé et ça fonctionnait. Sauf les volumes. [Vivienne] Qu'est-ce qui ne fonctionnait pas exactement. [Mathieu] Chaque fois que je montais un répertoire Windows dans un conteneur Linux les performances s'effondraient. On parle d'un facteur dix à vingt fois plus lent sur les opérations de lecture et d'écriture de fichiers. Du coup j'avais pris l'habitude de désactiver les volumes bind-mount et de copier les fichiers manuellement dans les conteneurs. [Vivienne] Pourquoi cette lenteur. [Mathieu] C'est une question d'architecture. Quand Docker tourne via Docker Desktop sur Windows les conteneurs Linux s'exécutent dans une machine virtuelle WSL2. Jusque-là pas de problème. Le problème apparaît quand tu montes un répertoire Windows dans un conteneur Linux. [Vivienne] Parce que les systèmes de fichiers sont différents. [Mathieu] Exactement. Le chemin traverse une frontière entre le système de fichiers NTFS côté Windows et ext4 côté Linux dans WSL2. Cette traduction passe par le protocole neuf P. C'est le protocole Plan neuf qui expose les fichiers Windows via le chemin slash mnt slash c. Chaque opération fichier fait un aller-retour NTFS vers neuf P vers ext4. [Vivienne] Et les benchmarks confirment cette dégradation. [Mathieu] Les chiffres de la communauté sont sans appel. La lecture séquentielle passe d'une milliseconde en natif à quinze à vingt millisecondes en cross-filesystem. L'écriture aléatoire passe de deux millisecondes à vingt-cinq à quarante millisecondes. Et le scan d'un répertoire node_modules passe de deux cents millisecondes à quatre à huit secondes. Soit vingt à quarante fois plus lent. [Vivienne] Et le hot reload. [Mathieu] Complètement cassé. Les événements inotify qui sont utilisés par webpack et Vite et nodemon pour détecter les changements de fichiers en temps réel ne traversent pas la frontière du système de fichiers. Tes outils de développement ne voient plus les modifications. [Vivienne] Docker est au courant de ce problème. [Mathieu] Oui c'est le problème numéro un identifié dans leur documentation officielle sur WSL2. La recommandation est littérale. Stockez le code source dans le système de fichiers Linux et pas dans le système de fichiers Windows. [Vivienne] Et comment tu as découvert la solution. [Mathieu] 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 répertoires aux conteneurs Docker en gardant les performances. Ma réaction a été de demander si c'était possible. [Vivienne] Quelle est la solution concrètement. [Mathieu] Au lieu de garder les projets sur C deux-points antislash Users et de les monter dans Docker tu les stockes directement dans le système de fichiers Linux de WSL2 sous slash home slash user slash projets. Docker accède alors à des fichiers qui vivent dans le même système de fichiers que les conteneurs. Plus aucune traduction entre systèmes de fichiers. [Vivienne] Comment se passe la migration en pratique. [Mathieu] Quatre étapes. D'abord tu installes WSL2 Ubuntu avec la commande wsl tiret tiret install tiret d Ubuntu. Ensuite tu actives systemd dans le fichier de configuration wsl point conf. Puis tu copies les projets depuis Windows vers le système de fichiers Linux avec la commande cp tiret r. Et enfin tu adaptes les fichiers Docker Compose si nécessaire. [Vivienne] Il faut modifier les fichiers Docker Compose. [Mathieu] Généralement non. Si tu utilises des chemins relatifs comme point slash data au lieu de chemins absolus Windows ça fonctionne directement. Les volumes pointent vers des chemins locaux dans le même système de fichiers. [Vivienne] Et pour les services comme Ollama. [Mathieu] Pour mes projets la migration incluait aussi Ollama pour le LLM local et pgvector pour la base vectorielle. Le point clé c'est que tu peux copier les modèles Ollama depuis Windows sans les retélécharger. Les binaires sont identiques. Ensuite tu configures un service systemd avec un port personnalisé. [Vivienne] Parlons des résultats. [Mathieu] J'ai benchmarké mes deux modèles LLM sur les mêmes tâches avant et après migration. Le GPU est identique c'est une RTX trois mille cinquante avec six gigaoctets. Seul l'OS change. [Vivienne] Et la latence initiale. [Mathieu] C'est l'amélioration la plus spectaculaire. Le temps avant le premier jeton sur une instruction courte passe de deux mille deux cent soixante-quinze millisecondes sur Windows à environ cent quatre-vingts millisecondes sur Ubuntu WSL2. Soit douze fois plus rapide. Sur un message de commit de dix-sept jetons on passe de deux mille sept cents millisecondes à deux cent vingt-sept millisecondes. Toujours douze fois plus rapide. [Vivienne] L'hypothèse pour expliquer ce gain. [Mathieu] Le stack TCP loopback de Windows introduit un overhead fixe d'environ deux secondes. Ce surcoût est absent avec le socket Linux natif dans WSL2. C'est un coût fixe qui pénalise toutes les requêtes courtes de manière disproportionnée. [Vivienne] Et le débit soutenu. [Mathieu] Le modèle qwen2 point 5 coder trois milliards de paramètres passe de quarante à cinquante-six jetons par seconde sur Windows à cinquante-sept à soixante-dix-huit jetons par seconde sur Ubuntu WSL2. Soit un gain de vingt-huit à quatre-vingts pourcent. Le modèle qwen3 nothink quatre milliards passe d'environ vingt et un jetons par seconde à environ trente-quatre. Soit plus soixante-deux pourcent. [Vivienne] Et l'impact sur le workflow quotidien. [Mathieu] Le smart commit qui utilise le LLM pour générer les messages de commit passe de deux virgule sept secondes à zéro virgule quatre seconde. C'est quasi-instantané. La revue de code IA passe de cinq virgule sept secondes à deux virgule neuf secondes soit divisé par deux. Le score qualité passe de deux virgule trois secondes à zéro virgule deux seconde. [Vivienne] Aucune régression observée. [Mathieu] Aucune. Le débit soutenu sur les générations longues de six cent quarante jetons reste identique ou supérieur. On gagne partout sans rien perdre. [Vivienne] Il y a des pièges à éviter pendant la migration. [Mathieu] Quatre principaux. Premier piège les binaires installés dans le répertoire local de l'utilisateur comme Claude Code ne sont pas accessibles via sudo à cause du secure path d'Ubuntu. La solution est de créer un lien symbolique dans slash usr slash local slash bin. [Vivienne] Le deuxième piège. [Mathieu] Les adresses IP hardcodées. Si tes scripts utilisaient l'IP gateway WSL2 pour communiquer entre Windows et WSL2 ces adresses ne fonctionnent plus quand le service tourne directement dans WSL2. Il faut remplacer par localhost. [Vivienne] Et l'espace disque. [Mathieu] Le système de fichiers WSL2 vit dans un fichier VHD sur le disque Windows. Il faut surveiller la taille et penser à redimensionner si nécessaire avec la commande wsl tiret tiret manage Ubuntu tiret tiret resize. [Vivienne] Dernier piège. [Mathieu] Les sauvegardes. Les fichiers dans WSL2 ne sont plus visibles directement dans l'explorateur Windows sauf via un chemin réseau spécial. Il faut adapter les stratégies de backup. [Vivienne] Le point le plus ironique de cette histoire. [Mathieu] C'est une IA qui m'a suggéré cette migration. Parfois les solutions les plus impactantes ne sont pas les plus complexes. Elles sont juste celles qu'on n'avait pas encore envisagées. [Vivienne] Le conseil final pour les développeurs sur Windows. [Mathieu] Si vous développez sur Windows avec Docker et que vous n'avez pas encore migré vos projets dans le système de fichiers WSL2 faites-le. C'est une journée de travail pour des mois de gain. Latence divisée par douze sur les opérations courtes. Débit en hausse de trente à quatre-vingts pourcent. Hot reload fonctionnel. Architecture simplifiée.

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 :

  1. Copier les modeles depuis Windows sans retelecharger (les binaires sont identiques) :
cp -r /mnt/c/Users/mathi/.ollama/models/ ~/.ollama/models/
  1. 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
  1. Corriger les scripts qui hardcodaient l'IP gateway WSL2 (192.168.65.254) en localhost.

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

Mathieu Grenier 6 mars 2026
Partager cet articlE