WSLのsystemdサポートでDocker Engineをサービスとして利用する
背景
WSLでのsystemdサポート
WSL (Windows Subsystems for Linux) でsystemdのサポートがプレビューリリースとして公開されたことがアナウンスされました。
Systemd support is now available in WSL! - Windows Command Line
Docker DesktopなしでのWSL
WindowsでLinux用の(Windows Containerではない)Dockerを利用するときには、
- Docker for Desktopを利用する方法
- WSL2のディストリビューションに直接インストールする方法
があると思います。 後者の、Docker DesktopなしでWSL2ディストリビューションに直接インストールして使う場合、systemdが動かない現行のWSL2では、
sudo /etc/init.d/docker start
のようなコマンドでデーモンを起動する必要がありました(プロファイルなどを使って自動化することはできます)。
参考: Docker Desktopに依存しない、WindowsでのDocker環境 - Qiita
systemdがサポートされることで、Dockerもsystemdのサービスとして利用できるため、自動でサービスが起動され、systemctl
等のコマンドでデーモンを制御できるようになります。
プレビューリリースのWSLで試してみる
Disclaimer
WSLのsystemdサポートは執筆時点でプレビューリリースですので、試す場合は自己責任でお願いします。 筆者の環境は Windows 11 Pro 22H2 (Build 10.0.22621.521) 、インストールしたプレビューリリースのWSLのバージョンは 0.68.4 です。
プレビューリリースのWSLの入手
アナウンス の発表時点(2022年9月21日)では、 WindowsのInsiderビルドを利用している場合は、Microsoft Store経由でインストール(アップデート)できます。そうでない場合もGitHubからインストーラを入手できるということです。
https://github.com/microsoft/WSL/releases
最新バージョンのAssetsから Microsoft.WSL_{version}_x64_ARM64.msixbundle
のようなファイルをダウンロードし、ダブルクリックしてインストールします。
WSL2のディストリビューションのインストール
PowerShell等から wsl --install
コマンドを使ってディストリビューションをインストールします。筆者はDebianを使っているので以降はDebianでの例になっています。
WSLのインストールが初回の場合はここでWindowsの再起動が必要になるかもしれません。
WSLの設定ファイルでsystemdサポートを有効に
公式ドキュメント: https://learn.microsoft.com/en-us/windows/wsl/wsl-config#systemd-support
インストールしたWSLのディストリビューションを起動して、 /etc/wsl.conf
を作成し、以下の内容を書き込みます。
[boot]
systemd=true
設定を反映するため、PowerShell等で wsl --shutdown
でWSLを終了し、再び起動します。以下のコマンドでサービスの状態を確認できたら、正しく設定できているといえるでしょう。
sudo systemctl list-unit-files --type=service
Docker Engineのインストール
続いてDockerをインストールします。Docker Desktopは使わないので、公式ドキュメントのLinux向けのDocker Engineのインストール方法に従ってWSL上でインストールします。
Install Docker Engine | Docker Documentation
上記のページからディストリビューションごとにインストール方法のページに飛べるのでWSLのディストリビューションに合わせてインストールしてください。
Dockerがサービスとして動作していることを確認
インストールが終わったら、Dockerのデーモンがサービスとして動作しているか確認します。
$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2022-10-08 18:19:09 JST; 11min ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 155 (dockerd)
Tasks: 13
Memory: 104.0M
CGroup: /system.slice/docker.service
└─155 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
active (running)
になっていればOKです。 docker run hello-world
などで動作確認もしておきましょう。
一度 wsl --shutdown
でWSLを終了した後、再び起動したときにもデーモンが動いていることが確認できると思います。
おまけ: VSCodeのRemote ContainersでWSL内のDockerを利用する
先ほど参照したQiitaの記事(Docker Desktopに依存しない、WindowsでのDocker環境)でも言及されていますが、 Visual Studio Codeでコンテナ内に直接接続できる機能において、常にWindows上のDockerではなくWSL上のDockerを利用するオプションがあります。
remote.containers.executeInWSL
で機能のオンオフ、 remote.containers.executeInWSLDistro
でディストリビューションを指定できます。
まとめ
WSLのsystemdサポートによって、WSL2のディストリビューション上でサービスとしてDockerを利用できることを確認できました。