Podman の conmon の寿命に関する動作検証
公式のドキュメントにも記載がある通り、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 stop
やpodman 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 run
やpodman start
など、コンテナ起動時に実行される - コンテナ終了時に conmon も終了する
- コンテナインスタンスを再起動させると、新たに conmon プロセスが起動される
-
https://docs.podman.io/en/stable/markdown/podman-run.1.html#conmon ↩︎
-
厳密な話をすると conmon が Podman の子プロセスなのは一瞬だけ。detach from the parent とあるので detatch される。 ↩︎
Discussion