🐔

Podman の conmon の寿命に関する動作検証

2024/02/26に公開

公式のドキュメントにも記載がある通り、Podman の特徴の一つにデーモンレスが挙げられる。

厳密には、Podman 起動時には conmon と呼ばれるプログラムも立ち上がり、コンテナインスタンスの監視を行う[1]。一方で Podman のドキュメントや conmon のREADMEに conmon の寿命に関する記載が少なかったため、いくつか動作確認も兼ねて調査・検証を行った。

ドキュメントから確認できる conmon の寿命

conmon の README によると、

Upon being launched, conmon (usually) double-forks to daemonize and detach from the parent that launched it. It then launches the runtime as its child.

とあるので、コンテナ起動時に Podman -> conmon -> コンテナインスタンス という親子関係ができる[2]。少なくとも podman run 実行時に conmon が起動されるのは間違いなさそう。

一方でコンテナ終了時の動作については

Finally, upon the containers death, conmon will record its exit time and code to be read by the managing programs.

くらいの記載しかない。コンテナ終了時に conmon はどうなるの?という疑問が今回の調査動機になる。

寿命確認のための動作検証

以下の点に着目して確認を行った。

  • コンテナ起動時に conmon も起動されることの確認
  • コンテナ停止時に conmon はどうなるか
  • コンテナを podman stoppodman kill などで終了後、podman start で再起動したときに何が起きるか

コンテナ実行時

$ podman run -d alpine:latest sleep infinity
bbd78c2c3402aa33c1744539784050f0039acbf267a1fdcec57c617002a60a79
$ podman ps -a
CONTAINER ID  IMAGE                            COMMAND         CREATED        STATUS        PORTS       NAMES
bbd78c2c3402  docker.io/library/alpine:latest  sleep infinity  3 seconds ago  Up 4 seconds              interesting_kowalevski
$ ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
...
tanjo       3805  0.0  0.0   8068  1936 ?        Ss   13:06   0:00 /usr/bin/conmon --api-version 1 -c bbd78c2c3402
tanjo       3807  0.0  0.0   1704   640 ?        Ss   13:06   0:00 sleep infinity
...

コンテナ上のプロセス (sleep infinity) と監視用プロセス (conmon; pid は 3805) が実行されていることがわかる。

コンテナ停止時

$ podman kill bbd78
bbd78
$ podman ps -a
CONTAINER ID  IMAGE                            COMMAND         CREATED      STATUS                      PORTS       NAMES
bbd78c2c3402  docker.io/library/alpine:latest  sleep infinity  4 hours ago  Exited (137) 5 seconds ago              interesting_kowalevski
$ ps aux | grep conmon
tanjo       3956  0.0  0.0   8460  1664 pts/1    S+   16:57   0:00 grep --color conmon

コンテナを停止させると、対応する conmon も実行を終了する。

コンテナ再起動時

podman start でコンテナを再起動させるとどうなる?

$ podman start bbd78
bbd78
$ ps aux | grep conmon
tanjo       3990  0.0  0.0   8068  1936 ?        Ss   16:59   0:00 /usr/bin/conmon --api-version 1 ...
tanjo       4002  0.0  0.0   8460  1536 pts/1    R+   16:59   0:00 grep --color conmon

conmon が起動していることと、conmon の PID が最初に podman run した時に実行された 3805 とは異なっていることがわかる。
このことから、コンテナを起動するたびに、新しく conmon プロセスが実行されることがわかる。

まとめ

  • conmon は podman runpodman start など、コンテナ起動時に実行される
  • コンテナ終了時に conmon も終了する
  • コンテナインスタンスを再起動させると、新たに conmon プロセスが起動される
脚注
  1. https://docs.podman.io/en/stable/markdown/podman-run.1.html#conmon ↩︎

  2. 厳密な話をすると conmon が Podman の子プロセスなのは一瞬だけ。detach from the parent とあるので detatch される。 ↩︎

Discussion