podmanの覚書03(Redmineコンテナをsystemdで管理)

podmanで遊び始めたので、
備忘録も兼ねて基本的なコマンドを書いておきます。

実行環境のOSはRed Hat Enterprise Linux 8.0です。

前回の投稿記事は以下から読めます。

[podmanの覚書01(インストール/イメージ取得/情報取得まで)](https://qiita.com/HOBO0222/items/37941306c33c67a75c0f)
[podmanの覚書02(イメージのタグ付け/保存/配布/削除まで)](https://qiita.com/HOBO0222/items/632dbf836fd1ff692e84)

ではサクッと書いていきます。

### Redmine公式イメージを取得
まずお目当てのイメージをローカルへプルするために`podman search`でレジストリ情報を検索します。

```bash:イメージの検索
# podman search redmine
INDEX       NAME                                     DESCRIPTION                                       STARS   OFFICIAL   AUTOMATED
docker.io   docker.io/library/redmine                Redmine is a flexible project management web...   756     [OK]
```
公式イメージはOFFICIAL列が[OK]になっています。ここではdocker.io/library/redmineを`podman pull`でローカルへプルします。ちなみにdocker.ioへの接続であれば、registry.redhat.ioのように事前のログインは不要です。

```bash:Redmine公式イメージを取得
# podman pull docker.io/library/redmine
Trying to pull docker.io/library/redmine...Getting image source signatures
~中略~
Storing signatures
3f1c9319f54c4939691eebe00db49d62580dd91b770b02ef1003bd7d2251e1e5
# podman images
REPOSITORY                         TAG      IMAGE ID       CREATED        SIZE
docker.io/library/redmine          latest   3f1c9319f54c   3 days ago     603 MB
```

###Redmineコンテナを起動する
設定情報を確認するため、取得したイメージに対して`podman inspect`を実行します。

```bash:イメージの基本情報を確認
#  podman inspect docker.io/library/redmine
~中略~
        "Config": {
            "ExposedPorts": {
                "3000/tcp": {}
~中略~
```
ここにポートフォワーディング先のポート番号や、環境変数、エントリーポイント、プロセスを実行する際のコマンドオプションなどが記載されているので、この情報をもとにしてコンテナを起動します。今回は以下の通りです。

```bash:Redmineコンテナを起動
# podman run -d --name redmine_server01 -p 3000:3000 docker.io/library/redmine
0065ee94abdf0e9c94e06b0348101beb8b4e64077c832deba08fd2c3346a5d69
# podman ps
CONTAINER ID  IMAGE                             COMMAND               CREATED         STATUS             PORTS                   NAMES
0065ee94abdf  docker.io/library/redmine:latest  /docker-entrypoin...  54 seconds ago  Up 53 seconds ago  0.0.0.0:3000->3000/tcp  redmine_server01
```

コンテナが起動しているのを確認したら、3000ポートを指定してWEBブラウザで接続してみます。

`http://<podmanサーバのIPアドレス>:3000/`

Redmineサーバのトップページが表示されていると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198785/53666ab1-22d9-6d84-5c91-49321bb3f1bc.png)

正常に表示されていることを確認したら一度コンテナを停止します。

```bash:コンテナを停止
# podman stop 0065ee94abdf
0065ee94abdf0e9c94e06b0348101beb8b4e64077c832deba08fd2c3346a5d69
# podman ps
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES
# podman ps -a
CONTAINER ID  IMAGE                               COMMAND               CREATED        STATUS                     PORTS                   NAMES
0065ee94abdf  docker.io/library/redmine:latest    /docker-entrypoin...  5 minutes ago  Exited (1) 20 seconds ago  0.0.0.0:3000->3000/tcp  redmine_server01
```

### Redmineコンテナの起動/停止をsystemdで管理する
ここまで来たら、あとはRedmineコンテナの起動/停止をサービス化します。

```bash:ユニットファイルを作成してサービス化
# vi /etc/systemd/system/redmine_container.service
# cat /etc/systemd/system/redmine_container.service
[Unit]
Description=Redmine Podman container
Wants=syslog.service
[Service]
Restart=always
ExecStart=/usr/bin/podman start -a redmine_server01
ExecStop=/usr/bin/podman stop -t 10 redmine_server01
[Install]
WantedBy=multi-user.target
# systemctl daemon-reload
# systemctl restart redmine_container.service
# systemctl status redmine_container.service
● redmine_container.service - Redmine Podman container
   Loaded: loaded (/etc/systemd/system/redmine_container.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-07-08 02:51:55 JST; 6s ago
 Main PID: 15510 (podman)
    Tasks: 10 (limit: 11528)
   Memory: 24.5M
   CGroup: /system.slice/redmine_container.service
           mq15510 /usr/bin/podman start -a redmine_server01
~中略~
# podman ps
CONTAINER ID  IMAGE                             COMMAND               CREATED         STATUS             PORTS                   NAMES
0065ee94abdf  docker.io/library/redmine:latest  /docker-entrypoin...  11 minutes ago  Up 53 seconds ago  0.0.0.0:3000->3000/tcp  redmine_server01
```
これで`systemctl`コマンドを打つだけで、podmanで作成・管理したコンテナを起動/停止することができるようになりました。

```bash:systemctlでRedmineコンテナを起動・停止
# systemctl stop redmine_container.service
# systemctl status redmine_container.service
● redmine_container.service - Redmine Podman container
   Loaded: loaded (/etc/systemd/system/redmine_container.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Mon 2019-07-08 02:54:05 JST; 1s ago
  Process: 15686 ExecStop=/usr/bin/podman stop -t 10 redmine_server01 (code=exited, status=0/SUCCESS)
  Process: 15510 ExecStart=/usr/bin/podman start -a redmine_server01 (code=killed, signal=TERM)
 Main PID: 15510 (code=killed, signal=TERM)
~中略~
# podman ps
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES
# systemctl start redmine_container.service
# systemctl status redmine_container.service
● redmine_container.service - Redmine Podman container
   Loaded: loaded (/etc/systemd/system/redmine_container.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-07-08 02:56:13 JST; 2s ago
  Process: 15686 ExecStop=/usr/bin/podman stop -t 10 redmine_server01 (code=exited, status=0/SUCCESS)
 Main PID: 15862 (podman)
    Tasks: 9 (limit: 11528)
   Memory: 24.6M
   CGroup: /system.slice/redmine_container.service
           mq15862 /usr/bin/podman start -a redmine_server01
~中略~
# podman ps
CONTAINER ID  IMAGE                             COMMAND               CREATED         STATUS            PORTS                   NAMES
0065ee94abdf  docker.io/library/redmine:latest  /docker-entrypoin...  15 minutes ago  Up 5 seconds ago  0.0.0.0:3000->3000/tcp  redmine_server01
```


前回の記事の保存手順と合わせると、プロジェクト管理を始めたRedmineコンテナをtarで圧縮して別サーバへ転送し、tarファイルをコンテナ起動して別環境で利用するということも可能になります。

最後に本記事の元ネタを貼っておきます。大変参考になりました。

https://podman.io/blogs/2018/09/13/systemd.html

とりあえず、一旦この記事の連載は終わりにします。次はマルチノードで起動するツールをコンテナで起動させてみるか、もしくはbuildahの記事を書きたいです。

ここまでお読み頂きありがとうございました。