WSL2にDocker代替のNerdCtl(containerd)を入れてみる
関連記事:
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を組み込んでおく必要がある。
これは以下の記事などを参照のこと
事前設定
インストーラー起動前にいろいろ準備が必要
追加で必要なパッケージをインストール
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をインストールする。
これのついでに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で設定付きのコマンドにするほうがいい気がする。
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