普段の開発にはWindows上でDockerを使っています。しかし、Docker上で動作するアプリケーションのレスポンスが遅く、作業の効率が著しく低下していました。最初は、自分のマシンのスペックが原因かと考えていたのですが、調査をする中で、より根本的な問題が明らかになりました。それは、WindowsとLinuxのファイルシステムの違いに起因するものでした。
今回は、Windows上でDockerを使用する際に遭遇するパフォーマンス問題を解決するための方法を、具体的に解説していきます。
Contents
WindowsでDockerを使用する際のパフォーマンス問題への対処法
WindowsでDockerを利用する際、ファイルシステムの違いがパフォーマンスに大きな影響を及ぼすことがあります。特に、LinuxベースのDockerコンテナをWindows上で動作させる際には、この問題が顕著になることがあります。
ファイルシステムの違いとその影響
WindowsのファイルシステムとLinuxのファイルシステムは、基本的な構造が異なります。これにより、ファイルの読み書き操作において、互換性の問題が生じることがあります。特に、Windows上のDockerでLinuxコンテナを動かす場合、このファイルシステムの違いがパフォーマンスの低下を引き起こす主な原因となります。
WSL 2の設定と利用
Ubuntuのインストールと設定
Microsoft StoreからUbuntuをインストールし、既定のディストリビューションとして設定することで、ファイルシステムの互換性を高めることができます。
Microsoft StoreからUbuntuをインストールした後、エクスプローラーで\wsl.localhost
を開くとWSL2内のディレクトリを開くことができます。
しかし私の環境では、\wsl.localhost
には初めdocker-desktop
とdocker-desktop-data
のディレクトリしか表示されておらず、期待していたUbuntu-22.04
のディレクトリは見当たりませんでした。
原因を調査したところ、実はUbuntuをインストールしただけでは不十分で、一度はそのアプリケーションを実行する必要があることが分かりました。Microsoft Storeから「開く」ボタンをクリックして初回実行を行うと、ようやく\wsl.localhost
にUbuntu-22.04
のディレクトリが追加され、正常にアクセスできるようになりました。
この状態ではDocker DesktopとUbuntuの両方のディストリビューションが存在するため、先ほどインストールしたUbuntuを既定に設定するには、PowerShellで以下のコマンドを実行します。
wsl -s ubuntu-22.04
Ubuntu上でのユーザー追加と設定
次にWindowsのWSL 2環境内でUbuntuを使用する際には、ユーザーアカウントを設定する必要があります。
新しいユーザーの作成
PowerShellを開き、以下のコマンドでUbuntuのシェルにアクセスします。
wsl -d Ubuntu-22.04
Ubuntu内で新しいユーザーを作成します。以下のコマンドを実行し、ユーザー名とパスワードを設定します。このコマンドは、新しいユーザーのアカウント情報(フルネームなど)の入力を求める場合がありますが、必要に応じてスキップすることができます。
sudo adduser ユーザー名
Gitプロジェクトの準備
先ほど作成したユーザーのディレクトリに移動して、Gitリポジトリをクローンしようとしたところ、ちょっとした問題に直面しました。具体的には、以下のようなエラーメッセージが表示され、pullができない状況が発生しました。
'git status' がコード 128 で終了しました: fatal: detected dubious ownership in repository at '//wsl.localhost/Ubuntu-20.04/home/ユーザー名/プロジェクト名'
To add an exception for this directory, call:
git config --global --add safe.directory '%(prefix)///wsl.localhost/Ubuntu-22.04/homeユーザー名プロジェクト名'
このエラーは、Gitがリポジトリの所有権を疑問視していることが原因です。ローカルリポジトリのディレクトリの所有者が自分のユーザーでは無い場合に起きるようです、
所有権エラーの解決方法
エラーメッセージの通り、コマンドを実行することでエラーが解決します。これにより、Gitは特定のディレクトリに対する所有権のチェックを行わなくなります。
このgitコマンドはWindows側で実行します。
git config --global --add safe.directory '%(prefix)///wsl.localhost/Ubuntu-22.04/home/ユーザー名/プロジェクト名'
設定を更新した後、もう一度Gitコマンドを実行します。今度は問題なくGitは動作するはずです。
ファイルの権限問題
しかし、このままではマウントしたディレクトリ内のファイルのWSL2側から編集できないという問題が発生しました。
そのためWordPressの管理画面から行うアップデートや、テンプレート編集機能が使用できません。
この問題を解決するためには、ディレクトリやファイルの権限を変更しWSL2側のユーザー合わせる必要があります。
所有権エラーの解決方法
Ubuntuのシェルにアクセスしている状態で以下のコマンドを実行します。
sudo chown -R www-data:www-data /home/ユーザー名/プロジェクト名
www-data
はUbuntu上のWEBサーバーがデフォルトで使用するユーザーです。
プロジェクトファイルの所有権をWEBサーバーのユーザーに変更するとこで、Dockerのコンテナ側とのユーザーの差異がなくなり、WSL2側からコンテナ側のファイル操作が可能になります。
まとめ
WindowsでDockerを使う際のパフォーマンス問題は、ソースファイルの管理をWSL2側に移すことでかなり改善しました。特にファイルシステムの違いに起因する遅延は、この方法で効果的に軽減できたことが分かりました。所有権に関する問題を解決するのに時間がかかりましたが、何とか問題解決につなげることができました。