Podman を使ってコンテナを起動してみた (その2)

こんにちは。サイオステクノロジー 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 等) についても、機会があれば調査/検証を実施してみようと思います。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です