WindowsにUbuntuを入れて快適にDocker Composeする方法
モチベーション
PHPのテスト環境を構築するにあたってXAMPPやMAMPなど聞いたことはあるかと思う。それぞれよくできていて、私もサポート切れしたレガシーシステムの保守の際には重宝している。ただし、インストールや設定が勉強にはなるものの面倒であったりチーム内で同じ環境を共有するのにそれなりのコストがかかったり、サイズが大きくて容量を圧迫するなどデメリットもある。それの解決策のひとつにDockerがある。ただしDockerも使い方次第ではメモリ使用率が急激に高くなりPCが重くなって良い開発体験が得られない、こういった経験がある。特にRAMが8GBのPCではDocker+VSCODE+GoogleChromeを同時に起動した場合にフリーズさえしてまったことがある。快適にDockerで開発ができる環境を構築する方法を今回は試していく。
WSL2を使えるようにする
Windows PowerShellを管理者権限で起動して以下のコマンドを実行していく。
Windowsサブシステムの有効化
PS> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
仮想化マシンプラットフォームの有効化
PS> Enable-WindowsOptionalFeature -online -featurename VirtualMachinePlatform
Windowsサブシステム 最新バージョンのダウンロード
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
WSL2を既定のバージョンとして設定する
PS> wsl --set-default-version 2
後にsystemdを使うために下記コマンドで更新しておく。
PS> wsl --update
Linuxディストリビューションをインストール
Microsoft Storeで好みのLinuxディストリビューションをインストールする。今回はUbuntuのVer. 22.04.1 LTSをインストールする。
インストールが完了したら早速起動してみる。 CUIが表示され、ユーザー名とパスワードの設定を求められるため入力する。
入力したあと現在自分がどこにいるのか知るためにコマンドpwdを入力して、現在位置確認を行うと以下のように表示される。
$ pwd
/home/${USER_NAME}
WSL2のパフォーマンス
前提の知識としてWindowsのCドライブをUbuntuから参照する際にはどうすれば良いのかを知っておく。 ディレクトリ移動を行い、一覧を表示して確認する。
$ cd ../../ && ls
bin boot dev etc home init lib lib32 lib64 libx32 lost+found media mnt opt proc root run sbin snap srv sys tmp usr var
するとmntディレクトリがあることが分かる。このmntにWindowsフォルダがマウントされているので早速中身を見てみる。
$ cd /mnt && ls
c d wsl
cディレクトリが現れた✅
これはUbuntu側から/mnt/c/以下を編集すればWindowsのCドライブに反映されるし、逆もしかりWindowsでCドライブ以下を編集すればUbuntuの/mnt/c/にも編集した内容が反映される。ではプロジェクトをWindowsのCドライブに作成すればいいのではないかと思うかもしれないがこれはDockerのパフォーマンスを落とすアンチパターンであるようだ。場合によってはページが表示速度のパフォーマンスが著しく低下し良い開発体験が悪化することにもつながる。では何が最適解であるか公式を確認してみる。
https://docs.docker.jp/docker-for-windows/wsl.html#wsl-bestpractices
ファイルのマウント時に最高のシステムパフォーマンスを得るためには、Ubuntu上の
/mnt/c/ココ
にプロジェクトを作成するのではなく
/home/${USER_NAME}/ココ
にプロジェクトを作成すべきとのことだ。
ちなみにWindowsエクスプローラーからUbuntuのフォルダを参照するときにはエクスプローラーで下記のパスでアクセスできる。
\\wsl$
WSL2メモリの割り当て
開発を行う場合ブラウザとエディターは必須になる。VDCODE等のIDEを使用する場合にRAMの容量が8GB程度のPCを使用するとなかなか厳しいものがある。。そこで予めWSL2が使用するメモリを制限する。
WindowsのCドライブ上に.wslconfigで設定メモリの割り当てを設定
C:\Users\${USER_NAME}\.wslconfig
[wsl2]
memory=1GB
WSL2の再起動
Windows PowerShellを管理者権限で起動して以下のコマンドを実行。
PS> wsl --shutdown
ついでにsystemctlコマンドの有効化
Ubuntu上でsystemctlコマンドがつかえるようにするために/etc/wsl.conf
$ sudo vi /etc/wsl.conf
[boot]
systemd=true
PS> wsl --shutdown
Dockerの設定とインストール
ポートの競合など面倒なことが多かった経験があるのでDocker Desktopを今回はインストールせずにUbuntuですべて完結させる。
Dockerのリポジトリの設定
aptパッケージのリストを更新。
$ sudo apt update
必要なパッケージをインストールしてaptがHTTPSを通してパッケージを使用できるようにする。
sudo apt install apt-transport-https ca-certificates curl software-properties-common
Docker公式のGPG公開鍵をシステムにインストールする。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
stableバージョンのdockerリポジトリを追加
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
Dockerのインストール
aptパッケージのリストを更新。
$ sudo apt update
最新版のDockerをインストール。
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
Dockerを起動
$ sudo systemctl docker start
Hello Wordのイメージを入れて確認
$ sudo docker run --rm hello-world
$ sudo docker ps -a
d215cc645c28 hello-world "/hello" 3 minutes ago Exited (0) 3 minutes ago funny_kalam
確認できたのでHello Wordイメージを削除
$ sudo docker rmi hello-world
Docker Compose 2系のインストール
Docker ComposeのGithubでリリースされた最新の安定版のバージョンを確認する。現時点で2.15.1(2系) が最新盤ということなので下記コマンドでインストール。
$ sudo curl -L https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64 -o docker-compose
※1系と違ってバージョンにvつけること。 1.15.1→v2.15.1
/usr/local/bin/docker-compose: line 1: Not: command not found
docker-composeコマンドを実行する権限を付与。
sudo chmod +x /usr/local/bin/docker-compose
バージョンを確認✅
$ docker-compose --version
Docker Compose version v2.15.1
docker-composeができた。
Docker Composeのパフォーマンス
https://github.com/devil-works/devil-code/blob/master/docker-compose.yml このdocker-compose.ymlにある通り、各イメージにメモリの制限を記述している。これはDockerとDocker Composeがメモリを無限に使用するのが原因でPCが重くなってしまうことを防ぐため。
resources:
limits:
memory: 500m
以上で今回の記事は終わり。
気を付けるべきポイントをまとめると
- Docker Desktopは入れない✅
- Cドライブ上に.wslconfigで設定メモリの割り当てを設定✅
- インストールコマンドが1系と2系で変わってる✅
- docker-compose.ymlでイメージにメモリを制限する✅
快適なDockerライフを。