PodmanでPodを管理したい

## はじめに

この記事はDocker経験者がPodmanを使ってみる記事です。主な内容としては実践したときのメモを中心に書きます。（忘れやすいことなど）誤りなどがあれば書き直していく予定です。

なお、Podmanの始め方については以下の記事を参考にしてください。

[Podmanを始めたい](https://qiita.com/ymd65536/items/b224f3b59b16984c469b)

## Podってなんですか？

Podとは簡単に説明するとコンテナのグループです。コンテナが集まっている単位とも言えるでしょう。Kubernetesを使ったことがある人であれば、Kubernetes Podを思い浮かべていただけたらとピンとくるかと思います。Red Hat公式では以下のように説明されています。

> Pod はそれぞれ、1 つのインフラコンテナと任意の数の通常のコンテナで構成されます。インフラコンテナは、Pod の実行を継続し、コンテナをホストから分離するユーザー名前空間を維持します。他のコンテナにはそれぞれ、プロセスを追跡し、停止したコンテナ (一部のリソースがまだ使用中であるために環境から取り除くことができない、機能していないコンテナ) を監視するためのモニターがあります。

[引用元：what is podman](https://www.redhat.com/ja/topics/containers/what-is-podman)

とはいえ、Docker経験者だとPodを扱ったことがないのでピンとこないですよね？ということで実際に触ってみましょう。

## セットアップ

まずはVMを作成します。（通信回線によっては時間がかかるのでしばらく待ちましょう。）

```bash
podman machine init
```

VMが作成できましたら起動します。以下のコマンドを実行します。

```bash
podman machine start
```

これで準備完了です。

## 空のPodを作成する

今回はRed Hatさんのサイトを参考にPodmanでPodを作成してみます。

[参考：第10章 Pod の使用](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/building_running_and_managing_containers/assembly_working-with-pods_building-running-and-managing-containers#proc_creating-pods_assembly_working-with-pods)

Podという単位でコンテナを管理したいのでPodを作成します。

```bash
podman pod create --name mypod
```

実行結果

```text
c6fe279bb8a44ad608f3ae19a4739e3ea0403d6df5528859ad79b5d64f20551c
```

`podman ps`のときと同じようにPodにもステータスを確認するコマンドがあります。以下のコマンドを実行します。

```bash
podman pod ps
```

実行結果

```text
POD ID        NAME        STATUS      CREATED         INFRA ID      # OF CONTAINERS
c6fe279bb8a4  mypod       Created     31 seconds ago  09ea3039b4b6  1
```

`podman pod create`を実行したときのハッシュ値と`POD ID`が部分的に一致しているのがわかります。正常にCreateできています。

`INFRA ID`や`# OF`など見慣れないものがありますが、ここではいったんそういうものだと理解して次にいきましょう。

なお、この段階でPodの中にはすでにコンテナがひとつ起動しています。

## Pod内でコンテナを起動する

公式サイトの手順通り、`myubi`というコンテナをPod内で実行します。

```bash
podman run -dt --name myubi --pod mypod registry.access.redhat.com/ubi9/ubi /bin/bash
```

Podの中身を確認します。

```bash
podman ps -a --pod
```

実行結果

```text
CONTAINER ID  IMAGE                                       COMMAND     CREATED         STATUS        PORTS       NAMES               POD ID        PODNAME
2a005f3e784a  localhost/podman-pause:5.1.1-1717459200                 24 seconds ago  Up 3 seconds              c78744cc6190-infra  c78744cc6190  mypod
2c1884686564  registry.access.redhat.com/ubi9/ubi:latest  /bin/bash   2 seconds ago   Up 3 seconds              myubi               c78744cc6190  mypod
```

`POD ID`となっている`c78744cc6190`を見ると2つのコンテナが同じPodに所属していることがわかります。

## Podの状態を確認する

コンテナを複数起動したら、コンテナの状態を知りたくなりますよね？
ということでCPUの状態などを調査できるコマンドを実行します。

```bash
podman pod top mypod
```

もしくは以下のコマンドで確認できます。

```bash
podman pod stats -a --no-stream
```

## Podの情報を表示する

Dockerを使ったことがある人ならDockerのコンテナの詳細情報を取得したことがあると思います。
Podにも詳細情報を取得するコマンドがあります。以下のコマンドを実行します。

```bash
podman pod inspect mypod
```

実行結果

```json
[
     {
          "Id": "c78744cc619057076aade40948908ffe112a2585fc026b951951707a4ea25121",
          "Name": "mypod",
          "Created": "2024-06-17T20:10:37.330296261+09:00",
          "CreateCommand": [
               "podman",
               "pod",
               "create",
               "--name",
               "mypod"
          ],
          "ExitPolicy": "continue",
          "State": "Running",
          "Hostname": "",
          "CreateCgroup": true,
          "CgroupParent": "user.slice",
          "CgroupPath": "user.slice/user-480217440.slice/user@480217440.service/user.slice/user-libpod_pod_c78744cc619057076aade40948908ffe112a2585fc026b951951707a4ea25121.slice",
          "CreateInfra": true,
          "InfraContainerID": "2a005f3e784abf2cb711439fb2f920869d8b10dbe688ebc75c684362d466b276",
          "InfraConfig": {
               "PortBindings": {},
               "HostNetwork": false,
               "StaticIP": "",
               "StaticMAC": "",
               "NoManageResolvConf": false,
               "DNSServer": null,
               "DNSSearch": null,
               "DNSOption": null,
               "NoManageHosts": false,
               "HostAdd": null,
               "Networks": [
                    "podman"
               ],
               "NetworkOptions": null,
               "pid_ns": "private",
               "userns": "host",
               "uts_ns": "private"
          },
          "SharedNamespaces": [
               "ipc",
               "net",
               "uts"
          ],
          "NumContainers": 2,
          "Containers": [
               {
                    "Id": "2a005f3e784abf2cb711439fb2f920869d8b10dbe688ebc75c684362d466b276",
                    "Name": "c78744cc6190-infra",
                    "State": "running"
               },
               {
                    "Id": "2c188468656437ed302fe8bb8b0ac16efcfd248a02cab9aeb3a1d770a4142e43",
                    "Name": "myubi",
                    "State": "running"
               }
          ],
          "LockNumber": 0
     }
]
```

`CreateCommand`という項目を見ると起動時のコマンドが閲覧できます。また、`State`を参照すると`Running`となっているため、Podが実行されているとわかります。

## 片付け

おわりにPodを停止して削除します。まずはPodを停止するために以下のコマンドを実行します。

```bash
podman pod stop mypod
```

実行結果

```
c78744cc619057076aade40948908ffe112a2585fc026b951951707a4ea25121
```

上記の値は`podman pod inspect mypod`の`Id`と一致します。

```text
[
    {
       "Id":"c78744cc619057076aade40948908ffe112a2585fc026b951951707a4ea25121"
    }
]
```

次にPodを削除します。

```bash
podman pod rm mypod
```

実行結果

```
c78744cc619057076aade40948908ffe112a2585fc026b951951707a4ea25121
```

rmした際にもstopと同じ時の値が表示されます。

最後に`POD ID`と`CONTAINER ID`を確認しておわります。

`POD ID`を確認します。

```bash
podman pod ps
```

`CONTAINER ID`を確認します。

```bash
podman ps -a --pod
```

## まとめ

Podmanを使うことでPodを管理できました。まだ慣れていないところもあるため、今回は公式とほぼ同じ手順で実行しました。うまく使いこなせるようになるとKubernetes、とくにPodの使い方を学習できるのでKubernetesをやるまえの準備になると個人的には思いました。

公式チュートリアルの[第11章](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/building_running_and_managing_containers/assembly_communicating-among-containers_building-running-and-managing-containers)にはコンテナ間通信についても書いてあってとても勉強になります。

またの機会に取り組みたいです。

## おわり