🐷

WSL2にDocker代替のNerdCtl(containerd)を入れてみる

2022/01/17に公開

関連記事:
WSLにDocker代替のPodmanを入れてみる
Distrodを使ってWSLでsystemdを動かす

失敗すると記事が増えるの法則

------------------- ↓ 前書はここから ↓-------------------

以前、Distrodを使ってWSLでsystemdを動かすという記事を書いた。
そもそもなんでsystemdが必要だったかというと、
WSL上でcontainerdを動かすためだった。
インストール途中でsystemdが必要とわかり断念したわけだ。

別方面の調査でDistrodを発見し、
ならばということでcontainerdを入れてみることにする。
なお、筆者はdocker(d)とcontainerdの違いが全く分かってない。

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

事前準備

systemd入りのゲストOSを設置

今回もゲストOSにはUbuntu(WSL版)を使用

wsl --install ubuntu

先にWSLにsystemdを組み込んでおく必要がある。
これは以下の記事などを参照のこと

Distrodを使ってWSLでsystemdを動かす

事前設定

インストーラー起動前にいろいろ準備が必要
追加で必要なパッケージをインストール

sudo apt install -y uidmap fuse-overlayfs

非rootユーザーでsystemctlが実行できるようにしておき、
runtimeのパスを通しておく。
ユーザー名を dozo とすると

sudo loginctl enable-linger $(id -un)
ls /run/user/$(id -u)
export XDG_RUNTIME_DIR=/run/user/$(id -u)

nerdctlをインストール

公式Githubよりnerdctlをインストールする。

https://github.com/containerd/nerdctl/releases

これのついでにcontainerdが入るっぽい。
通常版とfull版があるようだが、
full版を選択。
インストール先は~/.localか/usr/localのどちらかのようだ。

mkdir .local
cd .local/
wget https://github.com/containerd/nerdctl/releases/download/v0.15.0/nerdctl-full-0.15.0-linux-amd64.tar.gz
tar xfz nerdctl-full-0.15.0-linux-amd64.tar.gz
cd ~/

binディレクトリのパスを通してインストーラーの実行

export PATH=$HOME/.local/bin:$PATH
containerd-rootless-setuptool.sh install
 [INFO] Checking RootlessKit functionality
pgrep contain -a
 615 containerd

------------------- ↓ 後書はここから ↓-------------------

今回もトラブル多発。
本編ではスムーズにインストールできているっぽく見えるけど、
実際は全然違った。

トラブルシューティング

systemdが見つからない

dozo@WARDOG:~$ containerd-rootless-setuptool.sh install
[ERROR] Needs systemd (systemctl --user)

( ゚Д゚) なんでや

そ、そんなはず。
指定のコマンドを打ってみると

systemctl --user
Failed to connect to bus: No such file or directory

( ゚Д゚)( ゚Д゚) 阪神関係ないやろ

詳しくはわからんが以下のコマンドを実行がする必要がある

sudo loginctl enable-linger dozo
export XDG_RUNTIME_DIR=/run/user/$(id -u)

XDG_RUNTIME_DIRはデフォルトで/mnt/wslg/runtime-dirが設定されているので、
wsl特有の問題なんだろう。

参考: ユーザー権限のsystemdにFailed to connect to busで繋がらない時の対処方法

インストールされてないといわれる

nerdctl pull alpine
 FATA[0000] rootless containerd not running? (hint: use `containerd-rootless-setuptool.sh install` to start rootless containerd): stat /mnt/wslg/runtime-dir/containerd-rootless: no such file or directory

これもruntimeのパスが通ってない話。
exportを.bashrcに入れるって手もあるが、
aliasで設定付きのコマンドにするほうがいい気がする。

~/.bashrc
alias nerdctl="XDG_RUNTIME_DIR=/run/user/$(id -u) nerdctl $@"

/etc/subuidがない

Ubuntuでは出なかったが、
他OSインストール実行時に

containerd-rootless-setuptool.sh install
[INFO] Checking RootlessKit functionality
[rootlesskit:parent] error: failed to setup UID/GID map: failed to compute uid/gid map: open /etc/subuid: no such file or directory
[ERROR] RootlessKit failed, see the error messages and https://rootlesscontaine.rs/getting-started/common/ .

これはまぁpodmanのインストールの時にもでたから対応はできるか。
uidmapかshadowをインストールの上で以下を実行

sudo touch /etc/subuid /etc/subgid
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $(whoami)
sudo chmod u+s $(which newuidmap)
sudo chmod u+s $(which newgidmap)

Discussion