WSLのLinux側からPodmanを利用する方法: ポッドマンが倒せない(5)
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へのアクセスする方法で確立した手法がないので、
現状実現しようがなかった。
そんなある日、
別の目的で調べてた時に以下の記事を見つけた。
DockerをWSLにインストールして他のLinuxからアクセスする方法が書いてある。
2017年の記事でWSL1の頃でDocker Desktopもなかった頃の話だが、
一番重要なのは以下の図
('ω') DockerでできるならPodmanでもいけんじゃね?
ということでやってみた。
キーとなるプロダクトは
ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪
------------------- ↓ 本題はここから ↓-------------------
事前準備
Systemd対応WSLを用意。
今回はUbuntu 22.04を選択。
(Podman4はUbuntu20.10以上が必要)
wsl.confにsystemdを追加して再起動。
[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にPodmanとPodman Desktopをインストール
winget install -e --id RedHat.Podman
winget install -e --id RedHat.Podman-Desktop
(。・ω・。) かわえー
Ubuntuにpodmanをインストール
インストールマニュアルに従ってPodmanをインストール。
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/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に限らず他のディストリビューションでもパッケージで用意できない場合は試してみると良いだろう。
何も書かないのもアレなので、
要点だけ記載しておく。
詳しくはこちら
[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