🐳

Podman入門 ~ WSL2 + Ubuntu 22.04 でコンテナ間通信

2024/10/04に公開

背景

Docker で --uid, --gid を指定してコンテナを起動すると、UID, GID の変化によってうまく起動しなくなるアプリケーションがあります。例えば SSH などがそれでしょう。

しかし、 指定しないと root 権限のファイルがマウントしたディレクトリに作られてしまってしんどいですよね。

root で SSH をしつつマウントしたファイルはユーザー権限になってほすぃ。

そんなうまい方法はない物か?というわけでルートレスの Podman を使ってみましょう。

この記事ではコンテナのアドレス固定とコンテナ間で pingssh をしてみるところまでやってみます。

環境

  • WSL2
  • Ubuntu 22.04

前準備1: systemd対応

必要なのかどうかわかりませんが……したほうが良いと思います?

/etc/wsl.confsystemd=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 になってないとだめなそうです。

https://zenn.dev/tom_tan/articles/405ae402b43f37

$ 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 composepodman-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 もちゃんとログイン出来て、 ~/.sshauthorized_keys があるのが確認できます。ちゃんと SSH のサーバーもクライアントも動くことが確認できました。

まとめ

  • WSL2 + Ubuntu22.04 で Podman を入れたよ
  • 上記環境でコンテナ間通信が出来るよ

今すぐにUbuntu 24.04 に移行するのが面倒くちゃいけど、 Ubuntu22.04 でうまく Podman が動かないという方の手助けになれば幸いです。

Podmanイン・アクション Kindle版 が 2024/10/4 現在 1,881 円と格安なので買っとくといいと思います。

https://amzn.to/4dxfNzb

Discussion