podmanを使ってredmineで使用するコンテナをpodでまとめて起動・停止させてみる

# 背景
redmineを立ち上げる時に他のサーバーのコンテナがたくさんあって判別が大変だったのでpodmanの機能であるpodを用いてコンテナをまとめてみたのがきっかけとなります。

# 環境
### OS
OS：CentOS Stream8

### podman
podman：podman version 4.8.3

### コンテナ
redmine：5.1.1（記事執筆時 最新）
mysql：5.7


# 構築
以下の順で構築しました。
1. redmine用のpodを作成：__redmine-pod__
1. mysqlのコンテナを __redmine-pod__ 内に作成
1. redmineのコンテナを __redmine-pod__ 内に作成

※ コマンド投入はすべてroot権限で投入しています。

### redmine用のpodを作成
まずは redmine 用の pod を作成します。
pod 作成時に pod へアクセスする際のポートを必要であれば指定します。
```
[root@centos8 ~]# podman pod create --name redmine-pod -p 8081:3000
```
redmine のデフォルトはポート3000番ですが、今回は例としてpod外からポート8081番を指定することで3000番にアクセスするように移行させます。

* podman pod create：pod作成
* --name redmine-pod：pod名を redmine-pod に指定
* -p 8081:3000：pod内の3000番ポートを8081ポートに移行

以下のように「podman pod ls」を投入することで作成したpodを参照できます。
```
[root@centos8 ~]# podman pod ls
POD ID        NAME         STATUS      CREATED         INFRA ID      # OF CONTAINERS
xxxxxxxxxxxx  redmine-pod  Created     15 minutes ago  yyyyyyyyyyyy  1
```


### mysqlのコンテナを __redmine-pod__ 内に作成
redmine 内のデータを保存するために、mysql を先に作成した redmine-pod 内へ立てます。
コマンドは以下を投入します。
```
podman run -d --name redmine-db \
	--pod redmine-pod \
	-e MYSQL_ROOT_PASSWORD=redminepass \
	-e MYSQL_DATABASE=redmine \
	mysql:5.7
 ```
 * podman run -d：コンテナ起動
 * --name redmine-db：コンテナの名前指定（redmine-db）
 * --pod redmine-pod：コンテナの起動先のpod指定
 * -e：環境変数指定
 * mysql:5.7：mysqlのバージョン指定

pod を確認すると「# OF CONTAINERS」が２つになっています。
 ```
 [root@centos8 ~]# podman pod ls
POD ID        NAME         STATUS      CREATED         INFRA ID      # OF CONTAINERS
xxxxxxxxxxxx  redmine-pod  Running     18 minutes ago  yyyyyyyyyyyy  2
```
「podman container ls」を投入するとコンテナが参照できます。
mysql:5.7 の redmine-db が作成されているのがわかります。
（yyyyyyyyyyyy-infra は pod を作成した際のコンテナ）
```
[root@centos8 ~]# podman container ls
CONTAINER ID  IMAGE                                    COMMAND     CREATED         STATUS        PORTS                   NAMES
xxxxxxxxxxxx  localhost/podman-pause:4.8.3-zzzzzzzzzz              19 minutes ago  Up 9 seconds  0.0.0.0:8081->3000/tcp  yyyyyyyyyyyy-infra
xxxxxxxxxxxx  docker.io/library/mysql:5.7              mysqld      9 seconds ago   Up 8 seconds  0.0.0.0:8081->3000/tcp  redmine-db
```

### redmineのコンテナを __redmine-pod__ 内に作成
では、いよいよ redmine 本体を先に作成した redmine-pod 内へ立てます。
コマンドは以下を投入します。
```
podman run -d \
	--name redmine \
	--pod redmine-pod \
	-e REDMINE_DB_MYSQL=redmine-db \
	-e REDMINE_DB_PASSWORD=redminepass \
	-e REDMINE_PLUGINS_MIGRATE=true \
	redmine
```
※ 同じ設定箇所については説明省略

「-e REDMINE_DB_MYSQL=redmine-db」
上記環境変数に先ほど立てたmysqlの「redmine-db」を指定することで redmine が mysql を見に行きます。
（pod 内では IP が pod に振られることからコンテナはすべて pod の IP となるようです。そのため pod 内の通信はコンテナ名を指定することで対象を判断します。）


podを確認すると「# OF CONTAINERS」が３つになっています。
```
[root@centos8 ~]# podman pod ls
POD ID        NAME         STATUS      CREATED         INFRA ID      # OF CONTAINERS
xxxxxxxxxxxx  redmine-pod  Running     30 minutes ago  yyyyyyyyyyyy  3
```

コンテナを確認すると最新の redmine のコンテナが作成されています。
（この時は redmine：5.1.1）
```
[root@centos8 ~]# podman container ls
CONTAINER ID  IMAGE                                    COMMAND               CREATED         STATUS         PORTS                   NAMES
xxxxxxxxxxxx  localhost/podman-pause:4.8.3-zzzzzzzzzz                        39 minutes ago  Up 20 minutes  0.0.0.0:8081->3000/tcp  yyyyyyyyyyyy-infra
xxxxxxxxxxxx  docker.io/library/mysql:5.7              mysqld                20 minutes ago  Up 20 minutes  0.0.0.0:8081->3000/tcp  redmine-db
xxxxxxxxxxxx  docker.io/library/redmine:latest         rails server -b 0...  8 minutes ago   Up 8 minutes   0.0.0.0:8081->3000/tcp  redmine
```
## redmineの起動確認
ここまで出来たら以下のようにコンテナを立てたホストのIPアドレスにポート8081番を指定してアクセスしてみてください。
 　http://＜ホストのIPアドレス＞:8081/

以下のように画面が出てきたら成功となります。
※ 作成直後だと画面表示まで時間がかかり、「このサイトにアクセスできません」と出てくることがありますが、しばらく（5分ほど？？）すると表示されます。

デフォルトの設定は以下。
* ユーザ：パスワード
* admin：admin
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722866/ad3b6171-5b09-6767-28f9-1f41aab876f5.png)

## redmineの停止・起動
### redmine停止
redmine-pod を停止させる際は以下のコマンドを投入します。
```
[root@centos8 ~]# podman pod stop redmine-pod
```
redmine-pod の「STATUS」が「Exited」となっています。
```
[root@centos8 ~]# podman pod ls
POD ID        NAME         STATUS      CREATED         INFRA ID      # OF CONTAINERS
xxxxxxxxxxxx  redmine-pod  Exited      15 minutes ago  yyyyyyyyyyyy  3
```
redmine-pod 内のコンテナもすべて停止しています。
```
[root@centos8 ~]# podman container ls
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
```
### redmine起動
redmine-pod を起動させる際は以下のコマンドを投入します。
```
[root@centos8 ~]# podman pod start redmine-pod
```
redmine-pod の「STATUS」が「Running」となっています。
```
[root@centos8 ~]# podman pod ls
POD ID        NAME         STATUS      CREATED         INFRA ID      # OF CONTAINERS
xxxxxxxxxxxx  redmine-pod  Running     20 minutes ago  yyyyyyyyyyyy  3
```
redmine-pod 内のコンテナもすべて起動しています。
```
[root@centos8 ~]# podman container ls
CONTAINER ID  IMAGE                                    COMMAND               CREATED         STATUS             PORTS                   NAMES
xxxxxxxxxxxx  localhost/podman-pause:4.8.3-zzzzzzzzzz                        21 minutes ago  Up About a minute  0.0.0.0:8081->3000/tcp  yyyyyyyyyyyy-infra
xxxxxxxxxxxx  docker.io/library/mysql:5.7              mysqld                21 minutes ago  Up About a minute  0.0.0.0:8081->3000/tcp  redmine-db
xxxxxxxxxxxx  docker.io/library/redmine:latest         rails server -b 0...  21 minutes ago  Up About a minute  0.0.0.0:8081->3000/tcp  redmine
```




# おまけ
### 作成した pod をyamlファイルに保存し、起動する方法
作成した pod と内部のコンテナは以下のコマンドで Kubernetes 用の yaml ファイルに保存することができます。
```
[root@centos8 ~]# podman generate kube redmine-pod > redmine-pod.yaml
```
以下、内容。

```
redmine-pod.yaml

# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-4.8.3
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "****-**-*****:**:***"
  labels:
    app: redmine-pod
  name: redmine-pod
spec:
  containers:
  - args:
    - mysqld
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: redminepass
    - name: MYSQL_DATABASE
      value: redmine
    image: docker.io/library/mysql:5.7
    name: redmine-db
    ports:
    - containerPort: 3000
      hostPort: 8081
    volumeMounts:
    - mountPath: /var/lib/mysql
      name: ＜マウント先のvolumes名1＞
  - args:
    - rails
    - server
    - -b
    - 0.0.0.0
    env:
    - name: REDMINE_DB_PASSWORD
      value: redminepass
    - name: REDMINE_PLUGINS_MIGRATE
      value: "true"
    - name: REDMINE_DB_MYSQL
      value: redmine-db
    image: docker.io/library/redmine:latest
    name: redmine
    volumeMounts:
    - mountPath: /usr/src/redmine/files
      name: ＜マウント先のvolumes名2＞
  volumes:
  - name: ＜マウント先のvolumes名1＞
    persistentVolumeClaim:
      claimName: ＜マウント先のvolumes名1で指定したデータの格納先ディレクトリ名＞
  - name: ＜マウント先のvolumes名2＞
    persistentVolumeClaim:
      claimName: ＜マウント先のvolumes名2で指定したデータの格納先ディレクトリ名＞
```
マウント先のvolumesの格納先は以下となります。
（人によって異なる可能性あり）
```
[root@centos8 volumes]# pwd
/var/lib/containers/storage/volumes
```
また、作成した yaml ファイルに対して以下のコマンドで指定し、投入することで pod を create やコンテナを run しなくても本環境を作成することができます。
```
[root@centos8 redmine]# podman kube play redmine-pod.yaml
```


### pod 内の設定を見る方法
以下のコマンドを投入することで pod の設定を確認できます。
※ コンテナも同様。
```
[root@centos8 ~]# podman inspect ＜pod名 OR コンテナ名＞
```

### pod 内のログを見る方法
pod の場合
```
[root@centos8 ~]# podman pod logs ＜pod名＞
```
コンテナの場合
```
[root@centos8 ~]# podman container logs ＜コンテナ名＞
```

# 参考
以下を参考にしました。
* https://qiita.com/piityan1126/items/5522a7d0514cb64728a5
* https://dev.classmethod.jp/articles/try-podman-pod/
* https://reafnex.net/it/it-container/how-to-user-pod/