🐳

Podman入門 2 - podman-compose の Pod は何してん?

に公開

前回 の続き

Podman の Pod って何

podman-compose は Pod なるサムシング的な何かで何かしてるサムシング的な何からしい。

ざっくばらんに言えば Pod は複数のコンテナを取りまとめて管理するもの。 Kubernetes の概念がベースにあるらしいが、 Podman の Pod と Kubernetes の Pod は別物であるらしいよ。詳しくは知らん。

Pod に所属しているコンテナはネットワークスタックやPIDを共有できるらしく、別コンテナなのに IPC通信 (プロセス間通信) が可能だったりするらしいです。

逆に言えば、 Pod に所属してるコンテナはリソースを共有しちゃうということでもあるわけで。これが便利なことは理解するけど、私としては困っちゃう。

私は Podman を使ってサービスを連結展開したいのではなく、組み込みの環境を仮想的に・簡易的にテストしたいのです。そもそも別々の機器として存在してるものを、共有されたら困るのです。

podman-compose は何するものぞ

前回作成した docker-compose.yaml。

https://github.com/nodamushi/zenn-program/blob/6614613a1d40a9a1b6769e917a2c471c605c5bda/src/podman/docker-compose/docker-compose.yaml

これを podman-compose up するときに何が起こるのでしょうか? podman-compose の help を眺めてたらやっぱり --verbose があったので、これで出力してみます。

podman-compose --verbose up --abort-on-container-exit

--label とか本質的には要らないものを省いた結果が以下です。実際、このスクリプトを実行するとほぼ同等の結果が得られます。

https://github.com/nodamushi/zenn-program/blob/main/src/podman/docker-compose/up.sh

  1. pod_docker-compose Pod を作成
    • インフラコンテナ(PIDとか共有するための処理するらしい)は無し
    • PIDやネットワークスタックの共有はしない
  2. network の作成
  3. コンテナを作成し、 pod_docker-compose Pod に所属させる
  4. 作ったコンテナを開始

逆に、podman-compose down に相当する処理はこちら。

https://github.com/nodamushi/zenn-program/blob/main/src/podman/docker-compose/down.sh

SSH Server を 2 つ立ち上げ、ホストから ssh 接続

上記の up.sh を見る限り、Pod は何も共有してないので SSH サーバーノードをもう一個追加しても Port 22 が衝突などは起こらなそうです。

実際、 node3 として SSH サーバーのコンテナを追加して実行しても、ちゃんと起動しますし、どちらにもそれぞれアクセスできました。

https://github.com/nodamushi/zenn-program/blob/main/src/podman/docker-compose2/docker-compose.yaml

上記の podman-compose の up と down と同等のスクリプトは以下です。

ついでなので、ポートフォワーディング(node2: 2222:22, node2: 2223:22)もしています。

podman-compose up で立ち上げた後に、 connect.sh を使ってlocalhost に接続できます。以下の様に接続できました。

$ ./connect.sh 2
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.153.1-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.
Last login: Fri Oct  4 18:29:59 2024 from 192.168.11.101
root@792cc64b2281:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.11.101  netmask 255.255.255.0  broadcast 192.168.11.255
        inet6 fe80::64a4:e7ff:fee3:d216  prefixlen 64  scopeid 0x20<link>
        ether 66:a4:e7:e3:d2:16  txqueuelen 0  (Ethernet)
        RX packets 58  bytes 8214 (8.2 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 28  bytes 6366 (6.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 117  bytes 22920 (22.9 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 117  bytes 22920 (22.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

root@792cc64b2281:~# exit
logout

まとめ

  • podman-compose は結局中で Podman のコマンドを叩いてるだけ
    • 自分でスクリプトとして再現することも可能
  • podman-compose の Pod は何も共有しない
    • コンテナ間でリソースが競合することは無さそう
    • そもそも Podって必要なの?
  • podman-compose でポートフォワーディングしてホストから ssh も可能

結論としては「大丈夫だった」ということが分かっただけですが、 podman のコマンドを使って自分でコントロールするスクリプトとか書いてだいぶ理解が深まった気がしますね。

https://amzn.to/4dxfNzb

Discussion