WSL2でDocker開発環境を整える

問題提起

「Docker Desktop for Windows...いらなくね?」

Linuxマシンで開発を行っているとき、開発環境は全てDockerコンテナで整えていた。 コンテナやイメージ、ボリューム、ネットワークの管理は全てdockerコマンドから行っていて、特に不自由を感じなかった。 むしろLinuxの方がコンテナの起動が速くて快適。

Windows11のニューマシンを手に入れて、いざ開発環境を整えようと時に思ったのが冒頭である。 わざわざGit for WindowsとかDocker Desktop for Windowsとかmsys2とかをmsiでインストールするのは面倒だし、アップデート管理も大変である。

まあ色々言いたいことはあるが、とにかく開発する上で欲しいのはLinux環境。 でも手元にはWindowsマシン。 そこでWSL2を使おうと決意したのであった。

下準備

  • WSLの有効化
  • BIOS/OSレベルの仮想化の有効化

Windowsにある程度精通していればやり方はすぐわかる。 Google it♡)

Ubuntuをインストール

wslコマンドの確認

$ wsl --help

入手できるディストリビューションを確認。

$  wsl --list --online
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl --install -d <Distro>' を使用してインストールします。

NAME            FRIENDLY NAME
Ubuntu          Ubuntu
Debian          Debian GNU/Linux
kali-linux      Kali Linux Rolling
openSUSE-42     openSUSE Leap 42
SLES-12         SUSE Linux Enterprise Server v12
Ubuntu-16.04    Ubuntu 16.04 LTS
Ubuntu-18.04    Ubuntu 18.04 LTS
Ubuntu-20.04    Ubuntu 20.04 LTS

Ubuntu 20.04 LTSをインストール。

$ wsl --install -d Ubuntu-20.04

このディストリビューションをDocker専用にするためusernamedockerにして進める。 パスワードを設定すればWSLが利用できるようになる。

いろいろ設定

面倒なのでsudoのパスワード要求を切っておく。

$ sudo visudo
- %sudo   ALL=(ALL:ALL) ALL
+ %sudo ALL=(ALL:ALL) NOPASSWD: ALL

全てのパッケージを更新する。

$ sudo apt update
$ sudo apt upgrade -y

デフォルトのユーザをdockerに。

$ sudo nano /etc/wsl.conf
+ [user]
+ default=docker

bash起動時にdockerdが動くようにしておく。

$ nano ~/.bashrc
+ sudo service docker start > /dev/null

Dockerのインストール

docs.docker.com (accessed on 2022/01/17)

必要があればdocker-composeも。

$ sudo apt install -y docker-compose

一度ディストリビューションを落としてから再度WSL内へ。

$ exit
$ wsl --terminate Ubuntu-20.04
$ wsl -d Ubuntu-20.04

dockerの確認。

$ docker --version
Docker version 20.10.12, build e91ed57
$ docker images # dockerdが起動していなければエラーが返る
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

新たなディストリビューションとしてインポート

作成したディストリビューションtarファイルとしてエクスポートする。

$ wsl --export Ubuntu-20.04 docker.tar.gz

カレントディレクトリに仮想ディスクを作るようにインポートする。

$ wsl --import Docker . docker.tar.gz --version 2
$ wsl -d Docker

問題がないようであればUbuntu-20.04を削除する。

$ wsl --unregister Ubuntu-20.04

これでWSL2上で開発する準備が整った。

ディスクを圧迫してきたらdiskpartで圧縮する。

$ diskpart
DISKPART> select vdisk file=path/to/ext4.vhdx
DISKPART> attach vdisk readonly
DISKPART> compact vdisk
DISKPART> detach vdisk
DISKPART> exit

オプショナル

ホストのsshをWSLから叩けるようにする。

$ sudo mv /usr/bin/ssh /usr/bin/ssh.original # 元々のsshをリネーム
$ sudo ln -s `which ssh.exe` /usr/bin/ssh

ついでにWSLにもssh接続できるようにする。

$ sudo service ssh start