はじめに
Windows で Docker を使っていると、
「docker build が遅い」「npm install が重い」「レスポンスが遅い」「動きがもっさりする」
こんな悩みを抱える人は多いと思います。
自分も例外ではなく、特に Windows ファイルシステム(NTFS)上のプロジェクトを bind mount したときの I/O の遅さ にずっと困っていました。
ところが、プロジェクトを WSL 側(ext4)に置くだけで一気に改善したので、その内容をまとめます。
※本記事では「Ubuntu などの WSL2 Linux ディストリビューションをインストールしている」環境でDockerを起動している方を前提にしています。
なぜ遅いのか:Windows と WSL の I/O の違い
Docker Desktop は内部的に WSL2 上で動いています。
そのため、Windows 側のファイルを bind mount すると、WSL ↔ Windows 間の I/O が発生します。
- NTFS は Linux から見ると I/O が遅い
- 特に大量の小さなファイルを扱う npm / composer / pip 系は顕著
- Docker build の COPY も遅くなる
つまり、Windows 側に置いたプロジェクトを Docker に渡すと、常に“境界越え”が発生してしまうわけです。
WSL 側に置くとどう変わるのか
WSL のファイルシステム(ext4)は Linux ネイティブなので、
Docker から見ると「同じ Linux 内の高速なファイルシステム」として扱われます。
結果として、
- bind mount が高速化
- npm install が体感で数倍速くなる
- docker build の COPY が劇的に改善
- DB の初期化もスムーズ
と、全体的に I/O が軽くなります。
実際の移行手順
1. WSL のディストリビューションを確認
コマンドプロンプト
>wsl -l -v
NAME STATE VERSION
* Ubuntu Running 2
docker-desktop Running 2
2. WSLターミナルを起動
コマンドプロンプト
>wsl
3. プロジェクトを WSL 側へコピー
wslターミナル
$ mkdir ~/projects
$ cp -r /mnt/c/Users/xxx/projects ~/projects
4. VSCode で開く
wslターミナル
$ code ~/projects
※VS Codeの拡張機能「Remote - WSL」を使うとVSCode のサーバー部分が WSL 内で動いてファイルアクセスがLinuxネイティブになりとても快適です。
注意点・ハマりポイント
- Windows 側のエディタで直接編集すると遅いので、VSCode Remote を使うのがベスト
- Windows ↔ WSL 間のファイルコピーは少し遅い
- WSL のディスクサイズが足りなくなる場合がある(後で拡張可能)
まとめ
- Windows 上の Docker が遅い原因の多くは NTFS の I/O
- プロジェクトを WSL 側に置くだけで高速化できる
- 特に npm / docker build / DB 起動で効果が大きい
- 手順も簡単
Docker のパフォーマンスに悩んでいる人は、試してみてください!

