はじめに
Docker for Windows + WSL2 + Ubuntuの組合わせができるようになり、Dockerを使ったローカル環境構築がとてもしやすくなりました。
しかし、誤った使い方をしていると、とても処理が重くなります。
動作確認のためLaravelの初期ページの表示体感速度で比較したところ、明らかな差がありました。
今回のこの記事では、どうやったら重くなり、逆にどうやったら快適な速度になるのかを記事にまとめたいと思います。
[2021.08.10 追記]
当記事で紹介した方法が使えなくなることがありました。間違った情報の配信を避けるため記事を一時削除しましたが、回避策が見つかりましたので改めて記事を表示させたいと思います。詳細についてはトラブルシューティングをご確認ください。
動作確認環境
- Windows10 Home
- wsl2
- Docker Desktop for Windows
- Ubuntu20.04 LTS
- Laravel8
- PhpStorm
※LaravelのコードをVolume(bind)を使ってコンテナとホストとで共有して開発作業することを想定しています。
遅いパターン
- その1
- Windows側(CドライブやDドライブ)のデータをもとにコンテナを生成する
※ファイルの実体がWindows側にあり、そのデータをコンテナと共有している状態
- Windows側(CドライブやDドライブ)のデータをもとにコンテナを生成する
- その2
- Ubuntuには、/mnt/c/hogehogeなどといった形でWindowsのデータが自動的にマウントされているので、このUbuntuにマウントされたデータをもとにコンテナを生成する
※ファイルの実体がWindows側にあり、そのデータをコンテナと共有している状態
- Ubuntuには、/mnt/c/hogehogeなどといった形でWindowsのデータが自動的にマウントされているので、このUbuntuにマウントされたデータをもとにコンテナを生成する
WSL2とWindowsとではファイルシステムが異なるため、それらを共通に扱おうとするとどうしても遅くなってしまいます。
Laravelでいうと、vendor以下をWindowsとコンテナとで共通に扱おうとすると、作業に支障が出るほどページ読み込み等の速度が落ちます。
vendor以下は共通化しないという方法で解決することもできましたが、さらに良い方法がありましたので以下に続きます。
速いパターン
ベストプラクティスのページにも書いてありました。
ファイルのマウント(bind-mount)時に最高のシステムパフォーマンスを得るためには、Windowsホストの内容ではなく、Linux上のファイルをバインド・マウントするほうがパフォーマンスがより優れるようです。
具体的には、Ubuntuの「/home/{ユーザー名}」以下に直接Laravelのソースコードを配置します。
コンテナとの共有においてもこのLinux上のファイルをコンテナと共有します。
IDEでのコード編集について
エクスプローラー等で「\wsl$」と入力するとUbuntuのファイル群を確認することができるようになるので、そこからファイルを編集します。
まとめ
Windowsでコード実装すると遅くなるので、Linux(Ubuntu)上でコード編集すると快適な速さになります。
LaravelのコードはCドライブやDドライブに配置せず、Ubuntuのhome以下に直接配置しましょう。
トラブルシューティング
Windows側とUbuntu側に同じ内容のディレクトリを配置して、交互に内容をコンテナにマウントしていると、Dockerの不具合なのか、Volumeのマウント先が正しく認識しなくなるという問題が発生しました。
Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /run/desktop/mnt/host/wsl/docker-desktop-bind-mounts/ 以下略
調べたところDockerの再起動で改善されるという記事を見かけましたので、下記方法で再起動を実行したところ無事に解消されることを確認しました。
※常駐ソフトのDockerアイコンを右クリックした時に表示されるメニューの「Restart Docker...」を実行する
トラブルシューティング2
参考ページ