👌

WSLのLinux側からPodmanを利用する方法: ポッドマンが倒せない(5)

2022/11/14に公開

Docker Desktopの代替求めて三千里

関連記事:
Podman Desktopを試す: ポッドマンが倒せない(4)
Distrodを使ってWSLでsystemdを動かす

ポッドマンが倒せないシリーズ過去記事

Podmanを使い始めてから一年ぐらい経つだろうか。
Docker Desktopの代替を目指してあれこれ試しているが、
現状、まだ代替まで至ってない。

令和4年5月にPodman Desktopが登場して、
かなりDocker Desktopの環境に近くなった。
ただ、Docker Desktopの目玉機能でもある「WSL Integration」がついてない。
(時間の問題かもしれないけど)
これは専用のWSL上に常駐しているDockerを指定のLinux上にdockerを使えるようにする機能で、
WSLを指定するだけでDockerが利用することができる。

コマンドを用意するのはインストールすればいいのだが、
LinuxからLinuxへのアクセスする方法で確立した手法がないので、
現状実現しようがなかった。

そんなある日、
別の目的で調べてた時に以下の記事を見つけた。

https://devblogs.microsoft.com/commandline/cross-post-wsl-interoperability-with-docker/

DockerをWSLにインストールして他のLinuxからアクセスする方法が書いてある。
2017年の記事でWSL1の頃でDocker Desktopもなかった頃の話だが、
一番重要なのは以下の図

('ω') DockerでできるならPodmanでもいけんじゃね?

ということでやってみた。
キーとなるプロダクトは

npiperelay

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

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

事前準備

Systemd対応WSLを用意。
今回はUbuntu 22.04を選択。
(Podman4はUbuntu20.10以上が必要)

wsl.confにsystemdを追加して再起動。

/etc/wsl.conf
[boot]
systemd=true
wsl -t Ubuntu-22.04
wsl -d Ubuntu-22.04

事前に必要なパッケージを入れておく。

sudo apt update && sudo apt upgrade -y
sudo apt-get install  btrfs-progs crun git golang-go go-md2man iptables libassuan-dev libbtrfs-dev libc6-dev libdevmapper-dev libglib2.0-dev libgpgme-dev libgpg-error-dev libprotobuf-dev libprotobuf-c-dev libseccomp-dev libselinux1-dev libsystemd-dev pkg-config uidmap unzip

Podmanと Podman Desktop をインストール

windowsにPodmanPodman Desktopをインストール

winget install -e --id RedHat.Podman
winget install -e --id RedHat.Podman-Desktop

(。・ω・。) かわえー

Ubuntuにpodmanをインストール

インストールマニュアルに従ってPodmanをインストール。

https://podman.io/getting-started/installation

Podmanのリポジトリを登録
一見すると複雑にみえるけど、
鍵をダウンロードしてるのとリポジトリのテキストを作ってるだけ。

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.opensuse.org/repositories/devel:kubic:libcontainers:unstable/xUbuntu_$(lsb_release -rs)/Release.key | gpg --dearmor | sudo tee /etc/apt/keyrings/devel_kubic_libcontainers_unstable.gpg > /dev/null
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/devel_kubic_libcontainers_unstable.gpg] https://download.opensuse.org/repositories/devel:kubic:libcontainers:unstable/xUbuntu_$(lsb_release -rs)/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:unstable.list > /dev/null

Podmanインストール

sudo apt update
sudo apt install podman -y
podman --version
 podman version 4.3.0

(・∀・) おっけー

npiperelayとsocatのインストール

さて本題はここから。

上記の図にあるようにwslとwindowsのやりとりにnpiperelayとsocatという二つのアプリケーションを使う。
socatはsocketへのアクセスを監視して指定のコマンドに誘導するもの。
npiperelayは指定のpipe文字列に対応するサービスにコマンドを誘導するものだ。

socatのインストール

こちらはaptでインストール

sudo apt install socat -y

npiperelayをインストール

windowsのコマンドなのでwindows上にインストールする。
(インストール先を /mnt/c/Users/dozo/bin とする)

mkdir /mnt/c/User/dozo/bin
wget https://github.com/jstarks/npiperelay/releases/download/v0.1.0/npiperelay_windows_amd64.zip
unzip npiperelay_windows_amd64.zip
mv npiperelay.exe /mnt/c/Users/dozo/bin
sudo ln -s /mnt/c/Users/dozo/bin/npiperelay.exe /usr/local/bin/npiperelay.exe

podmanのnpipe値を確認

使用するnpipe値を確認する。
Podman Desktop上に表示されている。
デフォルトは「//./pipe/podman-machine-default」

Podman run実行

socatを常駐させてpullを実行してみる。
podmanコマンド実行時はリモートオプション(-r)をつける
ポートも確認したいのでnginxを選択

mkdir /run/user/`id -u`/podman
socat UNIX-LISTEN:/run/user/`id -u`/podman/podman.sock,fork,umask=007 EXEC:"npiperelay.exe -ep -s //./pipe/podman-machine-default",nofork &
podman -r run -p 8080:80 docker.io/library/nginx

(^_^)b いけるやん

podmanの特徴でもあるrootless実行ができて、
Windowsからもアクセスできている。

これでDocker Desktopの代替は完了したのでは?
(公式のWSL Integration待ってます)

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

常駐解除

socatを止めるには?

pkill socat

常駐コマンド作成

毎回コマンド打つのはアレなので。
常駐コマンドを作っておく。
sh は苦手じゃ

~/bin/podman-relay
#!/bin/sh
SOCKDIR="/run/user/`id -u`/podman"
if [ ! -d $SOCKDIR ]; then
    mkdir $SOCKDIR
fi
exec socat UNIX-LISTEN:$SOCKDIR/podman.sock,fork,umask=007 EXEC:"npiperelay.exe -ep -s //./pipe/podman-machine-default",nofork &

Ubuntu 20.04 にPodman4をインストールするには?

UbuntuにPodman4をパッケージでインストールするにはUbuntu20.10以上が必要。
現状ピンポイントでUbuntu20.10を利用するのは難しそうなので、
実質Ubuntu22.04が必要になりそうだ。

なのでビルドする必要があるのだが、
Homebrewを使ってインストールは可能っぽい。
Ubuntu20.04でsystemdを有効にしてHomebrewでインストールする。
Ubuntuに限らず他のディストリビューションでもパッケージで用意できない場合は試してみると良いだろう。

何も書かないのもアレなので、
要点だけ記載しておく。
詳しくはこちら

/etc/wsl.conf
[boot]
systemd=true
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' | tee -a /home/dozo/.profile
source .profile 
brew install podman

以下のエラーが出るが、
もう一度実行すればインストールできる。

Error: Too many open files @ rb_sysopen - /home/linuxbrew/.linuxbrew/Cellar/systemd/252/lib/systemd/systemd-growfsd

Discussion