こんにちは。サイオステクノロジー OSS サポート担当 Y です。
今回は、前回に引き続き Podman の検証実施してみました。(※以下の内容は CentOS 7.6/Podman 1.3.2/Docker 18.09.7 にて検証しています。)
■はじめに
Docker では、コンテナを起動するために containerd / dockerd の様な daemon を起動する必要があります。
[root@docker-test ~]# docker version Client: Version: 18.09.7 API version: 1.39 Go version: go1.10.8 Git commit: 2d0083d Built: Thu Jun 27 17:56:06 2019 OS/Arch: linux/amd64 Experimental: false Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? [root@docker-test ~]# [root@docker-test ~]# systemctl start docker [root@docker-test ~]# [root@docker-test ~]# docker pull nginx:latest latest: Pulling from library/nginx fc7181108d40: Pull complete c4277fc40ec2: Pull complete 780053e98559: Pull complete Digest: sha256:bdbf36b7f1f77ffe7bd2a32e59235dff6ecf131e3b6b5b96061c652f30685f3a Status: Downloaded newer image for nginx:latest [root@docker-test ~]# [root@docker-test ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 719cd2e3ed04 2 weeks ago 109MB [root@docker-test ~]# [root@docker-test ~]# docker run -d --name nginx1 nginx:latest 3d2b3c9d8fa4abf3d45a4d311dedea4d4bbfa49f5e923631dd16cb7102475913 [root@docker-test ~]# [root@docker-test ~]# docker run -d --name nginx2 nginx:latest 0697750fedc648e176407ab2119d60a99ff58039be96755e3b2ae11ea96c9bf4 [root@docker-test ~]# [root@docker-test ~]# docker run -d --name nginx3 nginx:latest 3d2852713541bfc3fd280f38ec9c8d60576b99243b5faa3e473711376572368a [root@docker-test ~]# [root@docker-test ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3d2852713541 nginx:latest "nginx -g 'daemon of…" 4 seconds ago Up 2 seconds 80/tcp nginx3 0697750fedc6 nginx:latest "nginx -g 'daemon of…" 7 seconds ago Up 6 seconds 80/tcp nginx2 3d2b3c9d8fa4 nginx:latest "nginx -g 'daemon of…" 11 seconds ago Up 10 seconds 80/tcp nginx1 [root@docker-test ~]# [root@docker-test ~]# ps -ef | grep containerd root 7365 1 0 14:56 ? 00:00:00 /usr/bin/containerd root 7366 1 3 14:56 ? 00:00:05 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock root 7597 7365 0 14:59 ? 00:00:00 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/3d2b3c9d8fa4abf3d45a4d311dedea4d4bbfa49f5e923631dd16cb7102475913 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc root 7675 7365 0 14:59 ? 00:00:00 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/0697750fedc648e176407ab2119d60a99ff58039be96755e3b2ae11ea96c9bf4 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc root 7755 7365 0 14:59 ? 00:00:00 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/3d2852713541bfc3fd280f38ec9c8d60576b99243b5faa3e473711376572368a -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc root 7816 7301 0 14:59 pts/0 00:00:00 grep --color=auto containerd [root@docker-test ~]# [root@docker-test ~]# pstree -aU 7365 containerd ├─containerd-shim -namespace moby -workdir... │ ├─nginx │ │ └─nginx │ └─8*[{containerd-shim}] ├─containerd-shim -namespace moby -workdir... │ ├─nginx │ │ └─nginx │ └─8*[{containerd-shim}] ├─containerd-shim -namespace moby -workdir... │ ├─nginx │ │ └─nginx │ └─9*[{containerd-shim}] └─10*[{containerd}] [root@docker-test ~]#
実際に NGINX コンテナを 3つほど起動してみると、上記の様に containerd daemon 配下の containerd-shim の子プロセスとして、NGINX のプロセス (コンテナ) が動作していることが確認できます。
Podman は、Docker の様に daemon を起動しなくてもコンテナを起動することができるという特徴を持っているため、実際に検証してみました。
■動作検証
それではさっそく、検証してみます。今回の検証は前回利用した環境にて実施しています。インストール方法等についてはそちらをご参照ください。
まず、Podman のパッケージ (rpm パッケージ) で提供されているコマンド (バイナリファイル) にどの様なものがあるのかを確認してみます。
[root@podman-test ~]# rpm -ql podman | grep -v "/usr/share/" /etc/cni/net.d/87-podman-bridge.conflist /usr/bin/podman /usr/lib/tmpfiles.d/podman.conf /usr/libexec/podman/conmon [root@podman-test ~]# [root@podman-test ~]# file /etc/cni/net.d/87-podman-bridge.conflist /etc/cni/net.d/87-podman-bridge.conflist: ASCII text [root@podman-test ~]# [root@podman-test ~]# file /usr/bin/podman /usr/bin/podman: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=934cc4c36c798122b3a98afeea0aa02a574b8de2, stripped [root@podman-test ~]# [root@podman-test ~]# file /usr/lib/tmpfiles.d/podman.conf /usr/lib/tmpfiles.d/podman.conf: ASCII text [root@podman-test ~]# [root@podman-test ~]# file /usr/libexec/podman/conmon /usr/libexec/podman/conmon: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=246699475279caa7e70232ba8290268ec78b5bfb, stripped [root@podman-test ~]#
上記の様に、/usr/bin/podman と /usr/libexec/podman/conmon という 2つのバイナリがある様です。
コンテナ起動前に、上記 podman や conmon という名前の daemon の有無を確認してみます。
[root@podman-test ~]# ps -ef | grep podman | grep -v grep avahi 5181 1 0 Jun27 ? 00:00:00 avahi-daemon: running [podman-test.local] [root@podman-test ~]# [root@podman-test ~]# ps -ef | grep conmon | grep -v grep [root@podman-test ~]#
上記の通り、それらしき daemon は見当たりません。
この状態で、podman コマンドを利用し NGINX コンテナを 3つほど起動してみます。
[root@podman-test ~]# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@podman-test ~]# [root@podman-test ~]# podman run -d --name nginx1 docker.io/nginx:latest 7ef9631a617c17cfce96a3e5637beb675f2ca20f707a9ffa4ab4ed36efe4879f [root@podman-test ~]# [root@podman-test ~]# podman run -d --name nginx2 docker.io/nginx:latest e16c5a2ab72c0df300c0cf53bdd97d0b7adb7913d0041e2fe91a5f303a73a0bb [root@podman-test ~]# [root@podman-test ~]# podman run -d --name nginx3 docker.io/nginx:latest b3a64d7e8c3a79d2e2a5c17abff6ab6a001c8367be2fa3dee94168683357fb6b [root@podman-test ~]# [root@podman-test ~]# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b3a64d7e8c3a docker.io/library/nginx:latest nginx -g daemon o... 5 seconds ago Up 5 seconds ago nginx3 e16c5a2ab72c docker.io/library/nginx:latest nginx -g daemon o... 10 seconds ago Up 9 seconds ago nginx2 7ef9631a617c docker.io/library/nginx:latest nginx -g daemon o... 15 seconds ago Up 14 seconds ago nginx1 [root@podman-test ~]#
すると、上記の通り containerd / dockerd の様な daemon が無い状態でもコンテナを起動することができました。
■コンテナ起動後のプロセス確認
前述した通り、Podman では daemon 無しでコンテナを起動することができたのですが、試しにコンテナが起動した状態で再度 ps コマンドにてホスト側のプロセスを確認してみました。
[root@podman-test ~]# ps -ef | grep podman avahi 5181 1 0 Jun27 ? 00:00:00 avahi-daemon: running [podman-test.local] root 21573 1 0 15:40 ? 00:00:00 /usr/libexec/podman/conmon -s -c 7ef9631a617c17cfce96a3e5637beb675f2ca20f707a9ffa4ab4ed36efe4879f -u 7ef9631a617c17cfce96a3e5637beb675f2ca20f707a9ffa4ab4ed36efe4879f -r /usr/bin/runc -b /var/lib/containers/storage/overlay-containers/7ef9631a617c17cfce96a3e5637beb675f2ca20f707a9ffa4ab4ed36efe4879f/userdata -p /var/run/containers/storage/overlay-containers/7ef9631a617c17cfce96a3e5637beb675f2ca20f707a9ffa4ab4ed36efe4879f/userdata/pidfile -l /var/lib/containers/storage/overlay-containers/7ef9631a617c17cfce96a3e5637beb675f2ca20f707a9ffa4ab4ed36efe4879f/userdata/ctr.log --exit-dir /var/run/libpod/exits --exit-command /usr/bin/podman --exit-command-arg --root --exit-command-arg /var/lib/containers/storage --exit-command-arg --runroot --exit-command-arg /var/run/containers/storage --exit-command-arg --log-level --exit-command-arg error --exit-command-arg --cgroup-manager --exit-command-arg systemd --exit-command-arg --tmpdir --exit-command-arg /var/run/libpod --exit-command-arg --runtime --exit-command-arg runc --exit-command-arg --storage-driver --exit-command-arg overlay --exit-command-arg container --exit-command-arg cleanup --exit-command-arg 7ef9631a617c17cfce96a3e5637beb675f2ca20f707a9ffa4ab4ed36efe4879f --socket-dir-path /var/run/libpod/socket --log-level error root 21661 1 0 15:40 ? 00:00:00 /usr/libexec/podman/conmon -s -c e16c5a2ab72c0df300c0cf53bdd97d0b7adb7913d0041e2fe91a5f303a73a0bb -u e16c5a2ab72c0df300c0cf53bdd97d0b7adb7913d0041e2fe91a5f303a73a0bb -r /usr/bin/runc -b /var/lib/containers/storage/overlay-containers/e16c5a2ab72c0df300c0cf53bdd97d0b7adb7913d0041e2fe91a5f303a73a0bb/userdata -p /var/run/containers/storage/overlay-containers/e16c5a2ab72c0df300c0cf53bdd97d0b7adb7913d0041e2fe91a5f303a73a0bb/userdata/pidfile -l /var/lib/containers/storage/overlay-containers/e16c5a2ab72c0df300c0cf53bdd97d0b7adb7913d0041e2fe91a5f303a73a0bb/userdata/ctr.log --exit-dir /var/run/libpod/exits --exit-command /usr/bin/podman --exit-command-arg --root --exit-command-arg /var/lib/containers/storage --exit-command-arg --runroot --exit-command-arg /var/run/containers/storage --exit-command-arg --log-level --exit-command-arg error --exit-command-arg --cgroup-manager --exit-command-arg systemd --exit-command-arg --tmpdir --exit-command-arg /var/run/libpod --exit-command-arg --runtime --exit-command-arg runc --exit-command-arg --storage-driver --exit-command-arg overlay --exit-command-arg container --exit-command-arg cleanup --exit-command-arg e16c5a2ab72c0df300c0cf53bdd97d0b7adb7913d0041e2fe91a5f303a73a0bb --socket-dir-path /var/run/libpod/socket --log-level error root 21737 1 0 15:40 ? 00:00:00 /usr/libexec/podman/conmon -s -c b3a64d7e8c3a79d2e2a5c17abff6ab6a001c8367be2fa3dee94168683357fb6b -u b3a64d7e8c3a79d2e2a5c17abff6ab6a001c8367be2fa3dee94168683357fb6b -r /usr/bin/runc -b /var/lib/containers/storage/overlay-containers/b3a64d7e8c3a79d2e2a5c17abff6ab6a001c8367be2fa3dee94168683357fb6b/userdata -p /var/run/containers/storage/overlay-containers/b3a64d7e8c3a79d2e2a5c17abff6ab6a001c8367be2fa3dee94168683357fb6b/userdata/pidfile -l /var/lib/containers/storage/overlay-containers/b3a64d7e8c3a79d2e2a5c17abff6ab6a001c8367be2fa3dee94168683357fb6b/userdata/ctr.log --exit-dir /var/run/libpod/exits --exit-command /usr/bin/podman --exit-command-arg --root --exit-command-arg /var/lib/containers/storage --exit-command-arg --runroot --exit-command-arg /var/run/containers/storage --exit-command-arg --log-level --exit-command-arg error --exit-command-arg --cgroup-manager --exit-command-arg systemd --exit-command-arg --tmpdir --exit-command-arg /var/run/libpod --exit-command-arg --runtime --exit-command-arg runc --exit-command-arg --storage-driver --exit-command-arg overlay --exit-command-arg container --exit-command-arg cleanup --exit-command-arg b3a64d7e8c3a79d2e2a5c17abff6ab6a001c8367be2fa3dee94168683357fb6b --socket-dir-path /var/run/libpod/socket --log-level error root 21787 20417 0 15:41 pts/0 00:00:00 grep --color=auto podman [root@podman-test ~]#
すると、先ほど rpm パッケージに含まれていた /usr/libexec/podman/conmon というコマンドが実行されていることが確認できました。
また、以下の様にこの /usr/libexec/podman/conmon の子プロセスとして NGINX プロセス (NGINX コンテナ) が起動していることが確認できました。
[root@podman-test ~]# pstree -aU 21573 conmon -s -c 7ef9631a617c17cfce96a3e5637beb675f2ca20f707a9ffa4ab4ed36efe4879f -u 7ef9631a617c17cfce96a3e5637beb675f2ca20f707a9ffa4ab4ed36efe4879f -r /usr/bin/runc -b/var/lib/containers/stora ├─nginx │ └─nginx └─{conmon} [root@podman-test ~]# [root@podman-test ~]# pstree -aU 21661 conmon -s -c e16c5a2ab72c0df300c0cf53bdd97d0b7adb7913d0041e2fe91a5f303a73a0bb -u e16c5a2ab72c0df300c0cf53bdd97d0b7adb7913d0041e2fe91a5f303a73a0bb -r /usr/bin/runc -b/var/lib/containers/stora ├─nginx │ └─nginx └─{conmon} [root@podman-test ~]# [root@podman-test ~]# pstree -aU 21737 conmon -s -c b3a64d7e8c3a79d2e2a5c17abff6ab6a001c8367be2fa3dee94168683357fb6b -u b3a64d7e8c3a79d2e2a5c17abff6ab6a001c8367be2fa3dee94168683357fb6b -r /usr/bin/runc -b/var/lib/containers/stora ├─nginx │ └─nginx └─{conmon} [root@podman-test ~]#
試しに /usr/libexec/podman/conmon に –help オプションを付けて実行してみたところ、以下の様なヘルプが出力されました。
[root@podman-test ~]# /usr/libexec/podman/conmon --help Usage: conmon [OPTION?] - conmon utility Help Options: -h, --help Show help options Application Options: -t, --terminal Terminal -i, --stdin Stdin --leave-stdin-open Leave stdin open when attached client disconnects -c, --cid Container ID -u, --cuuid Container UUID -r, --runtime Runtime path --restore Restore a container from a checkpoint --restore-arg Additional arg to pass to the restore command. Can be specified multiple times --no-new-keyring Do not create a new session keyring for the container --no-pivot Do not use pivot_root --replace-listen-pid Replace listen pid if set for oci-runtime pid -b, --bundle Bundle path --pidfile PID file (DEPRECATED) -p, --container-pidfile Container PID file -P, --conmon-pidfile Conmon daemon PID file -s, --systemd-cgroup Enable systemd cgroup manager -e, --exec Exec a command in a running container --exec-process-spec Path to the process spec for exec --exit-dir Path to the directory where exit files are written --exit-command Path to the program to execute when the container terminates its execution --exit-command-arg Additional arg to pass to the exit command. Can be specified multiple times -l, --log-path Log file path -T, --timeout Timeout in seconds --log-size-max Maximum size of log file --socket-dir-path Location of container attach sockets --version Print the version and exit --syslog Log to syslog (use with cgroupfs cgroup manager) --log-level Print debug logs based on log level [root@podman-test ~]#
この conmon について軽く調べてみたところ、GitHub (containers/libpod) の README OCI Projects Plans に “Conmon: Conmon is a tool for monitoring OCI runtimes.” という記載がありました。
詳細までは調査できていませんが、コンテナランタイムの監視 (?) を行うツールの様です。
■まとめ
今回の検証では、Docker の様に daemon (containerd/dockerd) が起動していなくても、Podman にてコンテナを起動することが可能であることを確認できました。
daemon 無しでコンテナを起動できる具体的な仕組みや、Podman に関連している conmon の詳細までは調べることができませんでしたが、他にも Podman に関連するツールが複数あるようなので、Podman の仕組みやその他のツール (Buildah や Skopeo 等) についても、機会があれば調査/検証を実施してみようと思います。