Podman入門 ~ WSL2 + Ubuntu 22.04 でコンテナ間通信
背景
Docker で --uid
, --gid
を指定してコンテナを起動すると、UID, GID の変化によってうまく起動しなくなるアプリケーションがあります。例えば SSH などがそれでしょう。
しかし、 指定しないと root 権限のファイルがマウントしたディレクトリに作られてしまってしんどいですよね。
root で SSH をしつつマウントしたファイルはユーザー権限になってほすぃ。
そんなうまい方法はない物か?というわけでルートレスの Podman を使ってみましょう。
この記事ではコンテナのアドレス固定とコンテナ間で ping
と ssh
をしてみるところまでやってみます。
環境
- WSL2
- Ubuntu 22.04
前準備1: systemd対応
必要なのかどうかわかりませんが……したほうが良いと思います?
/etc/wsl.conf
に systemd=true
を書いてから、 WSL を再起動します。
初期状態なら恐らく以下の様に存在していないと思われます。すでに書いてある場合は行う必要はありません。
$ cat /etc/wsl.conf
cat: /etc/wsl.conf: No such file or directory
無い場合は以下をコピペして書き込みましょう。
cat <<EOF | sudo tee /etc/wsl.conf
[boot]
systemd=true
EOF
WSL を再起動するためにシャットダウンするには、 PowerShell で wsl --shutdown
とすれば WSL は落ちます。
前準備2: / を shared にする
Podman を動かすには /
が shared になってないとだめなそうです。
$ findmnt -o PROPAGATION /
PROPAGATION
private
findmnt -o PROPAGATION /
の結果が上記のようになってるとだめらしいです
以下をコピペして実行しましょう。
cat <<EOF | sudo tee /etc/systemd/system/rshared.service
[Unit]
Description=Mount rshared for rootless containers
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/mount --make-rshared /
TimeoutSec=30s
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable rshared && sudo systemctl start rshared
もう一度 findmnt -o PROPAGATION /
を実行して shared になっていれば OK です。
Ubuntu 22.04 にインスコール
ようやっとインスコです。
22.04 で普通にインスコ(sudo apt install podman
)すると Podman 3.4 が入ります。こいつは SSH というか、コンテナ間通信が出来ません(たぶん)。
kubic libcontainers の unstable から入れるのが良いようです。この場合では、podman
だけでなく、 podman-plugins
が必要です。
echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/unstable/xUbuntu_22.04/ /' | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:unstable.list
curl -fsSL https://download.opensuse.org/repositories/devel:kubic:libcontainers:unstable/xUbuntu_22.04/Release.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/devel_kubic_libcontainers_unstable.gpg > /dev/null
sudo apt update
sudo apt install podman podman-plugins
pipx install podman-compose
動作確認
Podman が動くか確認。 Docker で見るいつものあれ。
$ podman run --rm hello-world
Hello from Docker!(以下略)
Podman のネットワークがちゃんと動くかも以下で確認しておきましょう。警告とか出なければOKです。
$ podman network create hoge
hoge
$ podman network ls
NETWORK ID NAME DRIVER
ecb666d77872 hoge bridge
$ podman network rm hoge
hoge
コンテナの作成
Podman の文脈でコンテナを作成するときは Buildah (びるだっち)を使うことが一般的……なのかな?どう読んでもびるだっちです。ビルダーなんて読めない。なお、nginxはんぎっくすです。
私はびるだっちがまだよーわからんので、とりあえず ContainerFile
でやりました。
ping が出来る Ubuntu コンテナ
SSH Client イメージ、SSH Server イメージ には ping
が入っています。
というのも、FROM alpine
とかでやる場合は ping
が普通にできるのですが、どうにも Podman + Ubuntuイメージでやる場合は、ちょっと工夫しないと権限が無くて ping
が出来ないから、記録として残してあります。 ちなみに、 busybox でもできませんでした。
FROM ubuntu:22.04
RUN apt update
RUN apt install -y iputils-ping
RUN setcap cap_net_raw+p /usr/bin/ping
setcap cap_net_raw+p /usr/bin/ping
をしておいてやることで ping が実行できるようになります。
Podman で Docker Compose を動かす
docker-compose.yaml で先ほど作った SSH Client と SSH Server のイメージを起動します。
もう見た目は完全に普通の docker-compose.yaml ですね。Client(node1) から Server(node2) へ ping を飛ばして、 ssh でログインして ls ~/.ssh
を実行してるだけです。
これを Podman で起動する場合も docker compose
を podman-compose
にするだけです。
podman-compose build
podman-compose up --abort-on-container-exit
podman-compose down
podman-compose up
の結果は以下の様になりました。
[node1] | time="2024-10-04T01:37:00+09:00" level=error msg="failed to move the rootless netns slirp4netns process to the systemd user.slice: dial unix /run/user/1000/bus: connect: no such file or directory"
[node1] | PING node2.dns.podman (192.168.10.101) 56(84) bytes of data.
[node1] | 64 bytes from docker-compose_node2_1.dns.podman (192.168.10.101): icmp_seq=1 ttl=64 time=0.036 ms
[node1] |
[node1] | --- node2.dns.podman ping statistics ---
[node1] | 1 packets transmitted, 1 received, 0% packet loss, time 0ms
[node1] | rtt min/avg/max/mdev = 0.036/0.036/0.036/0.000 ms
[node1] | authorized_keys
node2.dns.podman (192.168.10.101)
と表示されているので、ちゃんとアドレスの固定も出来て、ping
が出来ていますね。
ssh
もちゃんとログイン出来て、 ~/.ssh
に authorized_keys
があるのが確認できます。ちゃんと SSH のサーバーもクライアントも動くことが確認できました。
まとめ
- WSL2 + Ubuntu22.04 で Podman を入れたよ
- 上記環境でコンテナ間通信が出来るよ
今すぐにUbuntu 24.04 に移行するのが面倒くちゃいけど、 Ubuntu22.04 でうまく Podman が動かないという方の手助けになれば幸いです。
Podmanイン・アクション Kindle版 が 2024/10/4 現在 1,881 円と格安なので買っとくといいと思います。
Discussion