ian-taylor-jOqJbvo1P9g-unsplash

WSL2環境でDocker Desktopを使わずにDockerを使う

2022年11月26日

AWSが先日公開したfinchのように、非Linux環境におけるDocker環境に関して脱Docker Desktopの流れがあります。実はWindows環境のWSL2では、つい最近素のDocker Engineが使えるようになったのはご存知でしょうか?

「Windows Subsystem for Linux」が「systemd」に対応へ - 窓の杜

Microsoft Store版「Windows Subsystem for Linux」がv1.0.0に到達、プレビューを卒業 - 窓の杜

鍵は11月16日に正式版になったばかりのStore版WSLです。

そもそもなぜWSLでは、今までDocker Engineを使えなかったのか

今までのWSL2はDocker Engineを動かすために必須の、systemdに対応していませんでした。

systemdはLinux環境で使われているinitというもので、このinitがすべてのプロセスの親になっており、バックグラウンドで常に動いているデーモンなども管理しています。Docker Engineはsystemdに依存しているので、systemdのないWSL環境では動作しなかったということです。今までのWSLはinitがWSL独自のものになっていたのですが、Store版WSL2ではついにsystemdに対応しました。

ちなみに、非Linux環境においてDockerを使うためのソリューションでは仮想マシンを立てるものが多いのですが、Dockerはコンテナにすぎないため「WSL2の中にさらに仮想マシンを動かす」というようなことにはなりません。Dockerを動かすにはLinuxの環境が必要なので、Windowsでは(本物のLinuxが動く仮想マシンである)WSL2の上に乗せる、macOSでは仮想マシンを立てる、という解決方法がとられているのです。

実際に使ってみよう

まずMicrosoft StoreからWSLをインストールします。また現在新規でwsl --installでのセットアップをするとStore版がインストールされるようになっているようです。

2211 0105 ApplicationFrameHost

PowerShellかコマンドプロンプトでwsl --versionを実行して、WSL バージョンが1.0.0.0以降になっていれば、その環境ではStore版WSLが使われています。

ArchWSL

普段使っているのがArchWSLなので、まずそこから試してみます。

WSL環境内の/etc/wsl.confでsystemdを使うように指定します。ArchWSLの場合は最初からいくつか記述がなされており、もしかすると比較的新しいものだと最初からsystemdの使用が指定されているかもしれません。

[boot]
systemd=true

systemdの使用を指定したら、いったんWSLを終了します。これはWindowsのコマンドプロンプトやPowerShellで行ってください。

wsl.exe --shutdown

WSL環境を開いたら、Dockerをインストールします。Arch Linuxでは特に難しいことはありません。

sudo pacman -Syu
sudo pacman -S docker

dockerのデーモンを登録し、起動します。これが以前のWSLではできなかったのです。

sudo systemctl enable docker
sudo systemctl start docker

動かしてみましょう。

docker run hello-world

2211 0102 WindowsTerminal

WSL2で、Docker DesktopやRancher DesktopでないDockerが動いています!

Ubuntu

WSLで動かすディストロとしてはより一般的なUbuntuでも試してみます。/etc/wsl.confを編集してsystemdを有効にするのは一緒です。

2211 0103 WindowsTerminal

有効にしたら忘れずにWSLの再起動を。

wsl.exe --shutdown

Ubuntuにおいて、Docker EngineのインストールはDocker公式の案内に従うことになります。Dockerとしては有償のDocker Desktopを推しているようで、Docker Engineのドキュメントは少し埋もれるような形になってしまいました。

インストールが終わったらデーモンを立ち上げておきます。

sudo systemctl enable docker
sudo systemctl start docker

dockerコマンドはUbuntuだとsudoが要ります。

sudo docker run hello-world

2211 0104 WindowsTerminal

WSL2環境では「ふつうのDocker」が使えます

焦っていろいろなソリューションを試すよりは、Dockerが提供しているものに乗っかるわけなので安心感があると思っています。ただしGUIがないこと、Kubernatesについてはまた別の話になってくる辺りには注意が必要でしょう(k8sについては私がよくわかっていないので、よくわかっている方におまかせします!)。