WSL2のAlpine LinuxでDockerを使う

以前WSL2にAlpine Linuxをインストールする手順を紹介しましたが、この環境にDockerを導入してみます。

WSL2でDockerを使用する方法については既に幾つものWebサイトで解説されていますので、後述の自動起動に関する手順など参考にさせていただきました。

情報
2023年7月頃にOpenRCによるdockerdの自動起動に失敗するようになってしまったため、本記事では暫定対応を含めた手順を紹介します。

dockerと関連パッケージ導入

docker-ceとdocker composeの他に、自動起動するためのOpenRCを導入します。

apk add openrc docker docker-cli-compose
openrc sysinit
touch /run/openrc/softlevel
rc-update add docker

一般ユーザー用設定

一般ユーザー権限でdockerを使用できるようにするためには、対象ユーザーをdockerグループに所属させる必要があります。

警告
一般ユーザーがdockerを使用できることは、コンテナを介してホストに対してroot権限を使用できてしまうことを意味します。 基本的には安易に設定しないようにしてください。
addgroup <ユーザー名> docker

自動起動失敗回避

2023年7月頃のdocker-openrcパッケージ更新によりOpenRC経由でのdockerdの起動が失敗してしまうようになりました。

これはAlpine Linuxのissueによるとdockerが生成したネットワークがnetworkingサービスの再起動時に壊れてしまうことに対応するため、dockerとnetworkingに依存関係を設定したことに起因するようです。

WSL2にAlpine Linuxのminirootfsをインポートした環境ではnetworkingサービスは使用されず、設定ファイルが存在しないためnetworkingの起動に失敗します。そのため、dockerの起動前提を満たせないことになりdockerサービスの起動に失敗してしまいます。

暫定対応として、dockerサービスの起動定義ファイル(/etc/init.d/docker)を、依存関係が追加されたときのコミットを参照して以前の状態に手動で戻します。

/etc/init.d/dockerdepend内のnetを削除します。

 depend() {
-	need sysfs cgroups net
+	need sysfs cgroups
 	after firewall
 }

これで、OpenRCからdockerが起動できるようになります。

自動起動設定

Windowsから以下のコマンドを実行することでOpenRCが起動し、OpenRCによってdockerサービスが起動します。

wsl -d Alpine -u root --exec /sbin/openrc sysinit

この方法では、タスクスケジューラーなどでWindowsログイン時に上記コマンドを実行してあげる運用が考えられます。

また、Microsoft Store版WSLではディストリビューション起動時にコマンドを自動実行する機能が追加されています。

情報
コマンド自動実行機能はWindows 11のinbox版WSLで追加された機能ですが、Store版WSL正式リリースによりWindows 10にバックポートされた形になります。

今更ながら WSL2 の Alpine で Docker 環境構築という記事に/etc/wsl.conf[boot]セクションに起動コマンド設定について書かれていました。通常はこちらの手順で自動起動するのが使い勝手が良いと思います。

<<HugoのRender Hooksを利用してブロックの表現を拡張する WSLでネットワーク不調時に試すこと>>