PodmanのTomcatコンテナでサンプルアプリを動かす

# 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
```