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 -v | Podmanのバージョン表示 |
podman ps | Podmanのコンテナを一覧表示する |
podman ps -a | 停止中のPodmanのコンテナを含むすべてのコンテナを一覧表示する |
podman pull | レジストリからコンテナイメージをローカル上に取得する |
podman images | ローカル上に格納されているコンテナイメージを一覧表示する |
podman run | コンテナイメージをコンテナ起動する |
podman stop | コンテナを停止する |
podman rm | 停止中のコンテナを削除する |
podman rmi | コンテナイメージをローカル上から削除する |
参考になれば幸いです。
システムのお悩みについてご相談ください
SOHOのシステム運用管理に関するお悩みごとについて、なんでもお気兼ねなくご相談ください。
現役システムエンジニアのスタッフが、ボランティアでご相談にご対応させていただきます。