ブログ WindowsにUbuntuを入れて快適にDocker Composeする方法のサムネイル

WindowsにUbuntuを入れて快適にDocker Composeする方法

Created at

モチベーション

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をインストールする。

Ubuntu 22.04.01LTS インストール

インストールが完了したら早速起動してみる。 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ライフを。