💡

「WindowsでDockerを動かしたら遅かった😥」を解決する方法をまとめました。

2023/09/16に公開

Dockerってこんなに遅いの?

Windows上にDockerを入れて、PHP/Laravelの環境構築を作ったのですが、Google Chromeからhttps://localhost:8080 にアクセスしてみると、Laravelのトップ画面が表示するのに約17秒も掛かっていました💦ゲキ遅です❗

「えーっ、こんなに遅いのー?」と思いながらも暫くは我慢して使ってました。でもやっぱりそんな訳ないと思って改善に取り組み、何とか2秒程度までに改善できました。

ということで、このページでは、Windwos上でDockerを快適に使うための環境構築について整理しましたので、同じ悩みをお持ちの方は参考にしてください。

遅い原因

難しいことは抜きにして遅くなっている原因を簡単に書くと、Dockerの中はLinuxなのに対して、ソースコードをWindowsの上に置いていて、Dockerからソースコードを参照すると、都度WindowsからLinuxへのファイル変換が行われるのが原因のようです。

対策方法

こちらも難しいことは抜きにして簡単に書くと、ファイル変換が起きないような構成にしてあげれば改善するということになります。

「ファイル変換が起きないようにする」ってことは、DockerはLinuxなので、Windows側に手を加えてあげればよいですね。Windwosの中にLinuxを入れて、そこにソースコードを置くことで解決できました。

「Windwosの中にLinuxを入れる」いい方法がありました。それがWSL(Windwos Subsystem for Liux)です。WSLをWindowsにインストールすることで、Windowsの中にLinux環境を作ることができます。WSLでできたLinux環境にソースコードを置いてdockerとつなげてあげれば、Dockerからもファイル変換なくソースコードを読み込むことがきて遅くならないのです。

またLinux環境と言ってもWSLなので、WindowsのファイルとしてExplorerで見ることができます。なのでVS Codeなどのエディタからも普通に使えます。

環境構築手順

(1) WSLをインストール
(2) WSLのフォルダ内にソースコードを置く
(3) docker-compose.ymlにWSLのパスを記入

以上で完了です。
簡単に説明します。

(1)は以下のページからインストーラをダウンロードして、手順に従っていけばできたと思いますので割愛します。
 参考:https://docs.docker.jp/desktop/windows/wsl.html#wsl-download

(2)のWSLのフォルダは

\\wsl.localhost\Ubuntu\home\xxxx

という感じでできるので、これをExplorerに入れてあげると開けます。入力するの面倒くさいので、ドライブ割当しておくといいと思います。
gitを使っている人は、この中に入って git clone して docker を取ってくればいいです。

(3) は少し手こずりました。
services > volumes に docker の /var/www/html にマウント(割り当てる)フォルダを書くのですが、以下のように相対パスで書くのがいいようです。

services:
     :
   volumes:
     - ./src:/var/www/html  (← ここ)

":"(コロン)の左側に書いてある "./src" が相対パスです。
"."で docker-compose.ymlが置いてある場所を指していて、"./src"でその下にある "/src" フォルダを指しています。これをDocker(linux)の"/var/www/html"にマウントしています。
つまり、dockerにログインすると、"./src" が "/var/www/html"として見えるようになります。

手こずったのは、参照した資料に

  • \wsl.localhost\Ubuntu\home\xxxx\docker\src:/var/www/html

と絶対パスで書かれていたのですが、少なくとも私の環境はこれではつながりませんでした。

課題

こうして、WindwosでDockerを動かしても遅くならなくなったのですが、実はまだ若干課題が残っています。

こちらはまだ解決できてないのですが、linux側のデフォルトユーザーを変更することで改善するような記事があったので、またやってみて解決できたらシェアしたいと思います。

Thank you for reading until the end !

Discussion