RHEL8でPodmanをやってみる

以前の記事では、Centos7の上でPodman(Podマネージャ)のインストールと基本的な操作を紹介しました。

以下のリリースの組み合わせでは、Podmanのコンテナをルートレスモードで動作させるところまで確認できました。

$ cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)

$ podman -v
podman version 1.6.4

しかしながら、上記のリリースの組み合わせでは、podman networkをルートレスモードで利用できないことが判明しました。

コンテナ管理ツールにおけるデーモンレスとルートレスの恩恵を確認するための実験なのに、ルートレスモードはコンテナしか操作できないのであれば、まったく意味がありません。

そこで、無償利用枠が拡大されたRed Hat Developer ProgramのサブスクリプションとRed Hat Enterprise Linux(RHEL)を利用して、Podmanの動作を確認していきたいとおもいます。

RHEL8でPodmanをやってみる

この記事では、以下のRHELのリリースを利用します。Red Hat社によると、RHEL8以降はPodmanの利用が推奨されています。

$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.5 (Ootpa)

RHELは、通常のサーバとしてインストールしただけです。ユーザにログインして以下のコマンドでPodmanのバージョンを確認します。

$ podman -v
podman version 3.3.1

$ podman ps
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

Podmanは既にRHELにインストールされていて、ルートレスモードで実行できる状態であることが確認できました。Podmanは、ユーザ名前空間というLinuxの機能を利用してルートレスでコンテナ管理ができるようになっています。

RHEL8では、ユーザ名前空間に関連する各種設定が自動的に追加されるようであり、以下のように設定されていることが確認できました。

Podmanを利用するためのユーザ単位の追加設定は必要がなく、ホストに登録されたユーザであれば、すぐにPodmanを利用することができます。

$ cat /etc/sub?id
testuser:100000:65536
testuser:100000:65536

$ cat /proc/sys/user/max_user_namespaces
15188

この記事を書く契機となったpodman networkコマンドが、ルートレスモードで実行できるか確認してみます。

$ podman network ls
NETWORK ID    NAME        VERSION     PLUGINS
2f259bab93aa  podman      0.4.0       bridge,portmap,firewall,tuning

Podmanのデフォルトネットワークが表示されました。podmanのバージョン3.3.1では、ルートレスモードでpodman networkを管理できることが確認できました。

Podmanコンテナを起動してみる

では、RHEL 8.5にユーザでログインし、ルートレスモードでPodmanのコンテナ起動を試してみます。

コンテナイメージをpullする

docker.ioのレジストリからNginxをpullします。

$ podman pull docker.io/library/nginx:latest
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob 6b7e4a5c7c7a done
Copying blob bf36b6466679 done
Copying blob 9e3ea8720c6d done
Copying blob 15a97cf85bb8 done
Copying blob 9c2d6be5a61d done
Copying blob 8db4caa19df8 done
Copying config 448a08f1d2 done
Writing manifest to image destination
Storing signatures
448a08f1d2f94e8db6db9286fd77a3a4f3712786583720a12f1648abb8cace25

コンテナイメージの取得が完了したら、ローカル上に格納されたコンテナイメージを一覧表示します。

$ podman images
REPOSITORY               TAG         IMAGE ID      CREATED     SIZE
docker.io/library/nginx  latest      448a08f1d2f9  3 days ago  147 MB

podman pullコマンドで取得したNginxのコンテナイメージがローカル上に格納されていることが確認できました。

Nginxをコンテナ起動してみる

NginxをPodmanのコンテナで起動してみます。

$ podman run -d -p 8080:80 --name test_nginx nginx
cf9dba5b545a0388346645d51992e0866da11a10df9100b587357a4b431d8955

$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED         STATUS             PORTS                 NAMES
cf9dba5b545a  docker.io/library/nginx:latest  nginx -g daemon o...  28 seconds ago  Up 28 seconds ago  0.0.0.0:8080->80/tcp  test_nginx

Nginxがコンテナ起動されましたので、curlからアクセスしてみます。

$ curl http://localhost:8080

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Nginxのデフォルトのhtmlが表示され、正常に動作していることが確認できました。

ちなみに、コンテナの実行状態(podman psコマンドで表示される内容)は、他のユーザやrootから確認することはできません。これは、ルートレスモードによるコンテナ管理がセキュアであることを意味していると言えるでしょう。

コンテナの停止とイメージの削除

Nginxのコンテナ(test_nginx)を停止します。コンテナの停止は、podman stopコマンドを使用します。

$ podman stop test_nginx
test_nginx

次に、停止中のコンテナを表示し、コンテナを削除します。コンテナの削除は、podman rmコマンドを使用します。

$ podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS                     PORTS                 NAMES
cf9dba5b545a  docker.io/library/nginx:latest  nginx -g daemon o...  9 minutes ago  Exited (0) 39 seconds ago  0.0.0.0:8080->80/tcp  test_nginx

$ podman rm test_nginx
cf9dba5b545a0388346645d51992e0866da11a10df9100b587357a4b431d8955

$ podman ps -a
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

最後にコンテナイメージを削除します。コンテナイメージの削除は、podman rmiコマンドを使用します。

$ podman images
REPOSITORY               TAG         IMAGE ID      CREATED     SIZE
docker.io/library/nginx  latest      448a08f1d2f9  3 days ago  147 MB

$ podman rmi 448a08f1d2f9
Untagged: docker.io/library/nginx:latest
Deleted: 448a08f1d2f94e8db6db9286fd77a3a4f3712786583720a12f1648abb8cace25

$ podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

まとめ

いかがでしたでしょうか。

CentOS 7にインストールしたPodman(podman version 1.6.4)では、ルートレスモードでpodman networkコマンドが利用できなかったため、RHEL 8.5を利用してPodmanの動作を確認してみました。

その結果、RHEL 8.5にインストールされていたPodman(Podman version 3.3.1)では、ルートレスモードでもpodman networkコマンドが利用できることが確認できました。

RHEL 8以降のコンテナ管理ツールは、DockerではなくPodmanの利用が推奨されています。CentOS 7のPodmanは、ユーザ名前空間の設定が必要だったり、ルートレスモードで実行できる管理操作に制限がありました。

RHEL、AlmaLinuxやRocky Linuxなどのバージョン8以降を利用する場合は、Podmanの利用が標準となっていくかもしれません。

Podmanの基本コマンドは、Dockerとほぼ同じであるため、Docker利用者にとってPodmanの学習コストは低いと言えます。

ただし、Dockerもバージョン19.03からルートレスモードに標準対応しているため、PodmanとDockerの大きな差はデーモンレスかどうかだけなので、ただちにPodmanがDockerにとって代わるということではなく、利用するプラットフォームやOSによって、どちらのコンテナ管理ツールでも扱えることが重要です。

今回の解説で登場したPodmanコマンドは、以下の表のとおりです。

Podmanコマンド概要
podman -vPodmanのバージョン表示
podman psPodmanのコンテナを一覧表示する
podman ps -a停止中のPodmanのコンテナを含むすべてのコンテナを一覧表示する
podman pullレジストリからコンテナイメージをローカル上に取得する
podman imagesローカル上に格納されているコンテナイメージを一覧表示する
podman runコンテナイメージをコンテナ起動する
podman stopコンテナを停止する
podman rm停止中のコンテナを削除する
podman rmiコンテナイメージをローカル上から削除する
Podmanコマンドの概要

参考になれば幸いです。

システムのお悩みについてご相談ください

本サイトの掲載内容に関するお問い合わせは、こちらから承ります。
SOHOのシステム運用管理に関するお悩みごとについて、なんでもお気兼ねなくご相談ください。
現役システムエンジニアのスタッフが、ボランティアでご相談にご対応させていただきます。
Podman

前の記事

Podmanをやってみよう
Podman

次の記事

Podman Volumeとか使ってみる