Podmanとは
PodmanはRedHatが開発したコンテナエンジンであり、RedHat8以降ではDockerに代わりPodmanが標準のコンテナエンジンとなっています。
今後、RedHatでコンテナを動かす場合は、Podmanを使用する必要があると考えます。
とはいえDockerとまったく異なるコンテナエンジンかというとそんなことはなく、コマンドの引数などはある程度Dockerと互換性があるようです。
構築環境
Podmanの構築・運用はroot権限不要のようなので今回はインストール以外の操作は一般ユーザを使用します。
また、SELinuxは有効化しています。
■構築環境
Microsoft Azure - Redhat 8.2(4.18.0-193.14.3.el8_2.x86_64)
Podmanのインストール
dnfのリポジトリはこんな感じです。
RHEL8のコンテンツは、BaseOSとAppStreamの2つのメインリポジトリにより配布されるようです。
(Azureのデフォルトのmicrosoft-azure-rhel8-eusは無効化しました。)
$ sudo dnf repolist --all
repo id repo name status
microsoft-azure-rhel8-eus Microsoft Azure RPMs for RHEL8 Extended Update Support disabled
rhel-8-for-x86_64-appstream-eus-rhui-debug-rpms Red Hat Enterprise Linux 8 for x86_64 - AppStream - Extended Update Support from RHUI (Debug RPMs) disabled
rhel-8-for-x86_64-appstream-eus-rhui-rpms Red Hat Enterprise Linux 8 for x86_64 - AppStream - Extended Update Support from RHUI (RPMs) enabled
rhel-8-for-x86_64-appstream-eus-rhui-source-rpms Red Hat Enterprise Linux 8 for x86_64 - AppStream - Extended Update Support from RHUI (Source RPMs) disabled
rhel-8-for-x86_64-baseos-eus-rhui-debug-rpms Red Hat Enterprise Linux 8 for x86_64 - BaseOS - Extended Update Support from RHUI (Debug RPMs) disabled
rhel-8-for-x86_64-baseos-eus-rhui-rpms Red Hat Enterprise Linux 8 for x86_64 - BaseOS - Extended Update Support from RHUI (RPMs) enabled
rhel-8-for-x86_64-baseos-eus-rhui-source-rpms Red Hat Enterprise Linux 8 for x86_64 - BaseOS - Extended Update Support from RHUI (Source RPMs) disabled
$
Podmanのインストール実行。
$ sudo dnf install podman
$ sudo dnf list installed podman
Installed Packages
podman.x86_64 1.6.4-12.module+el8.2.0+6669+dde598ec @rhel-8-for-x86_64-appstream-eus-rhui-rpms
$
Tomcatイメージの取得
続いてTomcatイメージを取得します。
リポジトリは/etc/containers/registries.confで指定されています。
$ cat /etc/containers/registries.conf
~中略~
# To ensure compatibility with docker we've included docker.io in the default search list. However Red Hat
# does not curate, patch or maintain container images from the docker.io registry.
[registries.search]
registries = ['registry.access.redhat.com', 'registry.redhat.io', 'docker.io']
~中略~
$
それではtomcatイメージを検索します。
$ podman search tomcat
docker.io docker.io/library/tomcat Apache Tomcat is an open source implementati... 2927 [OK]
~中略~
$
沢山表示されますが、今回はdocker.io/library/tomcatのイメージを取得したいと思います。
$ podman pull docker.io/library/tomcat
取得したイメージを確認します。
$ podman image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/tomcat latest 345867df0879 2 days ago 661 MB
$
Tomcatコンテナの起動
podman runでTomcatコンテナを起動します。
-dでデタッチモード(バックグラウンド実行)を指定、-p 8081:8080でホストの8081ポートをコンテナの8080ポートに紐づけます。
$ podman run -d -p 8081:8080 docker.io/library/tomcat:latest
起動したコンテナを確認します。
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a14c4a1d1b6 docker.io/library/tomcat:latest catalina.sh run 38 seconds ago Up 37 seconds ago 0.0.0.0:8081->8080/tcp hardcore_merkle
$
CONTAINER IDは以降の操作で使用するため控えておきます。
ちなみにこの状態でnetstat -anを確認すると、以下のようになります。
$ netstat -an | grep 808
tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN
$
ホスト側では8081ポートでLISTENしているのが確認できます。
サンプルアプリのデプロイ
warはコンテナのwebapp以下にデプロイすればOKです。
サンプルアプリはtomcatの公式から取得したいと思います。
まず、コンテナにbashで入ります。
対象コンテナは先ほど確認したCONTAINER IDで指定します。
$ podman exec -it 7a14c4a1d1b6 /bin/bash
root@7a14c4a1d1b6:/usr/local/tomcat#
Tomcatインストールディレクトリ以下を確認します。
root@7a14c4a1d1b6:/usr/local/tomcat# ls -l
total 128
-rw-r--r--. 1 root root 18982 Dec 3 11:48 BUILDING.txt
-rw-r--r--. 1 root root 5409 Dec 3 11:48 CONTRIBUTING.md
-rw-r--r--. 1 root root 57092 Dec 3 11:48 LICENSE
-rw-r--r--. 1 root root 2333 Dec 3 11:48 NOTICE
-rw-r--r--. 1 root root 3257 Dec 3 11:48 README.md
-rw-r--r--. 1 root root 6898 Dec 3 11:48 RELEASE-NOTES
-rw-r--r--. 1 root root 16507 Dec 3 11:48 RUNNING.txt
drwxr-xr-x. 2 root root 4096 Jan 21 05:19 bin
drwxr-xr-x. 3 root root 22 Jan 24 04:38 conf
drwxr-xr-x. 2 root root 4096 Jan 21 05:18 lib
drwxrwxrwx. 2 root root 177 Jan 24 04:38 logs
drwxr-xr-x. 2 root root 134 Jan 21 05:18 native-jni-lib
drwxrwxrwx. 2 root root 30 Jan 21 05:18 temp
drwxr-xr-x. 2 root root 6 Jan 21 05:18 webapps
drwxr-xr-x. 7 root root 81 Dec 3 11:45 webapps.dist
drwxrwxrwx. 2 root root 6 Dec 3 11:43 work
root@7a14c4a1d1b6:/usr/local/tomcat#
webapp以下にcdします。
root@7a14c4a1d1b6:/usr/local/tomcat# cd webapps
root@7a14c4a1d1b6:/usr/local/tomcat/webapps# ls -l
total 0
root@7a14c4a1d1b6:/usr/local/tomcat/webapps#
wgetでサンプルアプリを取得します。
root@7a14c4a1d1b6:/usr/local/tomcat/webapps# wget http://tomcat.apache.org/tomcat-8.5-doc/appdev/sample/sample.war
サンプルアプリの取得&展開の確認をします。
root@7a14c4a1d1b6:/usr/local/tomcat/webapps# ls -l
total 8
drwxr-x---. 5 root root 86 Jan 24 04:47 sample
-rw-r--r--. 1 root root 4606 May 1 2018 sample.war
root@7a14c4a1d1b6:/usr/local/tomcat/webapps#
warが展開されたので、アクセス可能な状態となりました。
一旦コンテナから抜けます。
root@7a14c4a1d1b6:/usr/local/tomcat/webapps# exit
サンプルプログラムのアクセス
サーバ上からcurlでアクセスし、サンプルプログラムを動作させます。
$ curl -XGET http://localhost:8081/sample/
<html>
<head>
<title>Sample "Hello, World" Application</title>
</head>
<body bgcolor=white>
<table border="0">
<tr>
<td>
<img src="images/tomcat.gif">
</td>
<td>
<h1>Sample "Hello, World" Application</h1>
<p>This is the home page for a sample application used to illustrate the
source directory organization of a web application utilizing the principles
outlined in the Application Developer's Guide.
</td>
</tr>
</table>
<p>To prove that they work, you can execute either of the following links:
<ul>
<li>To a <a href="hello.jsp">JSP page</a>.
<li>To a <a href="hello">servlet</a>.
</ul>
</body>
</html>
$
無事、サンプルプログラムのJSPを取得できました。
コンテナの終了
コンテナの停止はCONTAINER IDを指定してpodman stop。
$ podman stop 7a14c4a1d1b6