WSL2+Docker環境構築手順
はじめに
Webシステムの構築において、コンテナ技術(Docker)を用いて開発環境構築や本番環境へのデプロイを行うことは一般的になってきました。
しかし、これまでWindows環境ではコンテナ技術を動かすうえでのハードルが高く、WindowsOSの上でに仮想マシンを起動してさらにそのうえでコンテナを動かしたり、また、ファイルシステムの差異によるトラブルが多く起きていました。
そのため、Windows環境での開発は不人気でしたが、WindowsOS上でLinuxをネイティブに近い状態で動かす技術のWSL2が登場し、かなり高速にDockerを動かせるなど、利便性が向上してきています。
そこで、WindowsOS(Windows10/Windows11)上で、WSL2を用いてDocker開発環境を構築する手順をまとめておきます。
仮想化機構の有効化
Windowsで「Windowsの機能の有効化または無効化」を開きます。
Windowsの画面下部検索欄で「Windowsの機能」といった形で検索すると出てきますので、
- Linux用Windowsサブシステム
- 仮想マシンプラットフォーム
にチェックを入れます。
Linuxカーネル更新プログラムパッケージをインストールする
Linuxカーネル更新プログラムを適用し、カーネルを最新化します。
[ダウンロードサイト]
「x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ」をダウンロードしてインストールします。
WSL2を既定のバージョンとして設定する
WindowsのPowerShellを起動し、次のコマンドを実行します。
wsl --set-default-version 2
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
この操作を正しく終了しました。
と表示されれば、OKです。
※表示されない場合、--set-default-versionコマンドが存在しないと言われてしまう場合、「Windowsの機能の有効化または無効化」から「Hyper-V」を有効にしてみてください。
Microsoft Storeから最新のUbuntuをインストールする
Microsoft Storeで「Ubuntu」で検索し「Ubuntu 20.04 LTS」を選択しインストールします。
Windowsの画面下部検索欄で「Store」といった形で検索すると出てきます。
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x800701bc
Error: 0x800701bc WSL 2 ???????????? ??????????????????????? https://aka.ms/wsl2kernel ?????????
Ubuntuを起動しユーザーとパスワードを作成する
画面指示に従って任意のユーザ名とパスワードを設定します。
Ubuntuディレクトリをネットワークドライブに割り当てておく
WSL2は\\wsl$
というディレクトリパスでアクセスすることができます。(Windowsのエクスプローラで開いてみてください)
必須の手順ではありませんが、WSL2のディレクトリにドライブレター(Z:など)を割り当てておくと、後で便利です。
\\wsl$
ディレクトリを開くとUbuntu-20.04
というディレクトリが見えるので、右クリックして「ネットワークドライブの割り当て」から割り当てを設定します。
メモリの割り当てを実施する
デフォルトのままだと、メモリを際限なく使用してしまうため、メモリ使用量の設定を行います。
下記の位置に.wslconfig
ファイルを配置します。(デフォルトでは存在しないので新規に配置します)
C:\Users\[ユーザ名]\.wslconfig
下記のように、メモリとCPUプロセッサの使用量を設定します。
[wsl2]
memory=3GB
processors=2
※2GBだと足りなくなる場合が多くなるようですので、3GB程度で設定しています。
Dockerをインストールする
以下のサイトからダウンロードが可能です。
- 「Get Started」⇒「Docker Desktop」⇒「Download for Windows」でダウンロードします。
- インストールを開始し、「Install required Windows components for WSL 2」のチェックを入れたまま「OK」で進めます。
- Windowsからいったんログアウトするように言われるので、いったんログアウトして再度サインインすると完了です。
Dockerの有効化
Dockerデスクトップを起動し、「Start」→「Skip tuotrial」→「Settings(歯車アイコン)」と進め「Use the WSL 2 based engine」にチェックが入っていることを確認します。
この状態にすることで、PowerShellからもWSL2からもDockerが呼び出せるようになります。
docker -v
Docker version 20.10.12, build e91ed57
docker -v
Docker version 20.10.12, build e91ed57
※Windowsの権限docker-users
グループに操作ユーザを設定する必要がある場合があるようです。
下記手順で解消したという報告があります。
- コンピュータ管理を管理者権限で実行→
ローカルユーザとグループ
→グループ
→docker-users
をダブルクリック
追加→NT AUTHORITY\Authenticated users
を追加する。再起動でdockerが開けるようになる。 - windows powershell を開く(管理者権限でなく普通に開く)。
-
wsl -l -v
でubuntu20.04が追加されていることを確認。(追加されていない場合はwsl --install -d Ubuntu-20.04
を実行。) -
wsl --set-version Ubuntu-20.04 2
を実行。 -
wsl -l -v
でubuntu20.04
のversionが2になっていることが確認できる。 - Dockerを開き、システム(⚙)→
Resources
→WSL INTEGRATION Ubuntu-20.04
をONにする。
WSL2でDockerを使う場合の注意点
- /mnt/配下などWindows側のファイルシステムにいるファイルをマウントすると非常に遅くなります。
- Linux(WSL2)側の/home/にファイルを置いて、直接編集すると速くなります。
\\wsl\home\[ユーザ名]\sample
のようなフォルダにアクセスする場合、
ドライブレターを割り当てると、Windows側からは下記のようにアクセスできます。
Z:\home\[ユーザ名]\sample
Linux側から見ると、以下のパスが同じファイルを参照しています。
/home/[ユーザ名]/sample
dockerグループに自身のユーザを追加(権限の付与)
dockerグループに対して、OSを操作するユーザの権限がないと動かないので、権限を設定します。
sudo usermod -aG docker [ユーザ名]
※ユーザ名には、Ubuntuをインストールしたときの自身のユーザ名を設定します。
補足
dockerグループが存在せずエラーとなる場合は、以下コマンドを先に実行してから、ユーザをdockerグループに追加してください。
sudo groupadd docker
一度OSからログアウトして入りなおす
一度OS(Linux)からログアウトして入りなおすと、設定が有効になります。
su - $USER
以上で設定は終了です。
Dockerfileやdocker-compose.yamlファイルを作成し、docker-compose up
等が使用できる状態になります。
注意事項1
WSL2でDockerを動作させた状態で、Dockerコンテナ側からファイルを作成すると、ファイルの所有者がroot
になります。
一方で、WSL上の操作ユーザはデフォルトでroot以外のユーザとなっており、また、VSCodeなどでファイルを開いた場合もroot以外のユーザとなるため、ファイル更新しようとするとPermission denied
エラーが発生します。
対応としては、VSCodeのエクステンションを用いて、WSL2→VSCode用コンテナ→対象のフォルダという形で接続して作業を行う必要があります。
以下を参考としていただければと思います。
注意事項2
WSL2を起動させたまま長時間使用していると、メモリがひっ迫していくる場合があります。その場合はPCを再起動することをお勧めします。
Discussion