【環境】PodmanでRedmine+MySQLを起動まで構築する

本件をGoogle で検索すると、Docker-Compose で実現するケースばかりがヒットします。Docker-Compose は自動化・簡略化を目的とするツールなので、本来は必須ではありません。改めて基本的な構築手法・流れを身につけることを目的に記事化してみました。

目次

概要

作業環境・バージョン

  • CentOS v8.4.2105
  • Podman v3.0.2-dev (※1)
  • Redmine v4.2.2.stable
  • MySQL v5.7.35 (※2)

(※1) 本記事ではrootfull構成でコンテナを構築します。Podman はroot以外の一般ユーザでもコンテナ環境が使えますが、今回はrootによる構築(rootfull)を選択しました

(※2) MySQL v8.0 は成功手法が確立できていません。デフォルトの認証設定が変更した影響です。上手い方法が見つかれば更新します。

全体的な流れ

大まかな流れです。知ってさえいれば、それほど難しい作業ではありません。今回はDocker-Compose なしでRedmineを構築します。お勉強も兼ねてPodmanコンテナを使ってみます。

  1. ベースイメージを取得する(podman pull)
  2. Pod を作成する(podman pod create)
  3. MySQLコンテナを作成する (podman run)
  4. Redmineコンテナを作成する (podman run)
  5. Webブラウザでアクセスしてみる

CentOSへのPodman のインストールについては割愛します。下記のページを参考にしてみてください。

参考:Podman Installation Instructions – Linux Distributions (Podman.IO)

作業手順

ベースイメージを取得する (podman pull)

まずはベースとなるRedmine と MySQLのイメージの取得します。

podman pull redmine:4.2
podman pull mysql:5.7

私の環境だと、たまにDownload が止まったりもしました。Ctrl + C でキャンセルして、再度 pullし直すと成功したりするので、諦めずに何度か pull してみてください。

結果を確認する (podman images)

podman pull が成功すると下記のようにイメージが確認できます。

[root@redmine-vm]# podman images
REPOSITORY                             TAG     IMAGE ID      CREATED      SIZE
docker.io/library/redmine              4.2     5c25a3b03269  6 days ago   524 MB
docker.io/library/mysql                5.7     8cf625070931  2 weeks ago  454 MB
registry.access.redhat.com/ubi8/pause  latest  330db2d74fc3  6 weeks ago  3.49 MB

Pod を作成する (podman pod create)

起動停止をセットにしたり、localhost で通信を確立するため、Podを作成します。

podman pod create -p 3000:3000,3306:3306 --name redmine-pod

3000番はRedmine、3306番はMySQLのデフォルトで設定されてるLISTENポート番号です。

結果を確認する (podman pod ls)

rootfull でPodを作成すると、1つのコンテナがPodに含まれます。

[root@redmine-vm]# podman pod ls
POD ID        NAME         STATUS   CREATED         INFRA ID      # OF CONTAINERS
d40c090b5920  redmine-pod  Created  10 seconds ago  c10ce6d5bfed  1

MySQLコンテナを作成する (podman run)

コンテナはバックエンド側から作成します。まずはMySQLからです。

データストア用フォルダをホスト側に作成する

拡張性を確保するため、データベースはボリューム外部化の準備をしておきます。検証用の一時的などであれば特に必要ではありません。

mkdir -p /data/redmine/mysql

日本語対応の設定ファイル(cnf)を作成する

docker.ioから取得したイメージのデフォルトは、日本語(≒マルチバイト)が扱えない状態です。これに対応するため、専用のcnfファイルを準備しておきます。

参考 Docker上のRedmineで日本語を登録しようとするとInternal errorが出るとき

mkdir /data/redmine/conf/mysql/conf.d
cd /data/redmine/conf/mysql/conf.d
vi multibyte.cnf

独自の設定ファイルとなる「multibyte.cnf」には、下記を書いておきます

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

コンテナを作成する

4つの環境変数を指定してる点がポイントです。また、先ほど準備したデータストアやcnfの配置先をコンテナと共有するように設定しています。

podman run --name=db-redmine -d --pod redmine-pod --env='MYSQL_DATABASE=redmine' --env='MYSQL_ROOT_PASSWORD=rootSecret' --env='MYSQL_USER=user' --env='MYSQL_PASSWORD=secret' -v /data/test/mysql:/var/lib/mysql -v /data/redmine/conf/mysql/conf.d:/etc/mysql/conf.d docker.io/library/mysql:5.7

結果を確認する① (podman ps & podman logs)

現在起動中のコンテナを確認できます。podman run で生成したMySQLコンテナとPod生成時に作られた「infraコンテナ」が起動しています。

infraコンテナは、rootfull構成の場合に必ず生成される制御用のコンテナです。手動で起動停止するものではなく、アプリコンテナ(下記の場合はMySQL)の起動時に連動して起動して、コンテナ間の通信など様々なPod内の制御機能を担います

[root@redmine-vm]# podman ps
CONTAINER ID  IMAGE                                         COMMAND  CREATED         STATUS            PORTS                                           NAMES
c10ce6d5bfed  registry.access.redhat.com/ubi8/pause:latest           21 minutes ago  Up 2 minutes ago  0.0.0.0:3000->3000/tcp, 0.0.0.0:3306->3306/tcp  d40c090b5920-infra
204d1d2ec9ae  docker.io/library/mysql:5.7                   mysqld   5 seconds ago   Up 5 seconds ago  0.0.0.0:3000->3000/tcp, 0.0.0.0:3306->3306/tcp  db-redmine

ログも確認してみます。きちんとDB起動していることが分かります。この状態をキープしつつ、次にRedmineコンテナを起動していきます。

[root@redmine-vm]# podman logs db-redmine
~~~~~~~~~~~~~~~~~~~~~~長いため、省略します~~~~~~~~~~~~~~~~~~~~~~~~~
2021-08-09T05:00:39.564881Z 0 [Warning] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2021-08-09T05:00:39.592327Z 0 [Note] Event Scheduler: Loaded 0 events
2021-08-09T05:00:39.592718Z 0 [Note] mysqld: ready for connections.
Version: '5.7.35'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
2021-08-09 05:00:39+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
[root@redmine-vm]# 

結果を確認する② (podman exec & mysql)

先ほどの日本語設定がDBに反映できているか確認する為、podman exec でコンテナ内にログオンします。

参考:MySQL 文字コード確認 (Qiita)

[root@redmine-vm conf.d]# podman exec -it db-redmine bash
root@redmine-pod:/# 

mysqlコマンドでMySQLインスタンスにログオンします

root@redmine-pod:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.35 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

文字コード設定を見ます。こちらがインスタンス全体です。

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8mb4                    |    ← 設定された(既定はlatin1)
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8mb4                    |    ← 設定された(既定はlatin1)
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

mysql> 

もう1つ、データベース自体も確認します。podman run時に指定してる「redmine」データベースを見ます。こちらも utf8mb4 になってます。問題なさそうです。

mysql> show create database redmine;
+----------+---------------------------------------------------------------------+
| Database | Create Database                                                     |
+----------+---------------------------------------------------------------------+
| redmine  | CREATE DATABASE `redmine` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |  ←設定された
+----------+---------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> 

Redmineコンテナを作成する (podman run)

フロントコンテンツであるRedmineコンテナを作成します。

環境変数の指定は3つです。Podによるコンテナ間通信で「127.0.0.1」を指定します。Docker-Compose では、”REDMINE_DB_MYSQL”にコンテナ名を指定しているケースが多いのですが、ここでも分かる通り、厳密には接続先リモートIP or ホスト名を指する環境変数となります。

podman run --name=test-redmine -d --pod redmine-pod --env='REDMINE_DB_MYSQL=127.0.0.1' --env='REDMINE_DB_USERNAME=user' --env='REDMINE_DB_PASSWORD=secret' docker.io/library/redmine:4.2

結果を確認する (podman ps & podman logs)

[root@redmine-vm]# podman ps
CONTAINER ID  IMAGE                                         COMMAND               CREATED         STATUS             PORTS                                           NAMES
c10ce6d5bfed  registry.access.redhat.com/ubi8/pause:latest                        35 minutes ago  Up 16 minutes ago  0.0.0.0:3000->3000/tcp, 0.0.0.0:3306->3306/tcp  d40c090b5920-infra
204d1d2ec9ae  docker.io/library/mysql:5.7                   mysqld                14 minutes ago  Up 14 minutes ago  0.0.0.0:3000->3000/tcp, 0.0.0.0:3306->3306/tcp  db-redmine
faf82e9b307a  docker.io/library/redmine:4.2                 rails server -b 0...  7 seconds ago   Up 6 seconds ago   0.0.0.0:3000->3000/tcp, 0.0.0.0:3306->3306/tcp  test-redmine 

ログも確認してみます。初回のマイグレーション(データモデルの展開処理)が走っていることが分かります。

[root@redmine-vm]# podman logs test-redmine
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x64-mingw32, x86-mswin32. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x64-mingw32 x86-mswin32`.
The dependency ffi (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x64-mingw32, x86-mswin32. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x64-mingw32 x86-mswin32`.
The Gemfile's dependencies are satisfied
I, [2021-08-09T05:14:45.206921 #25]  INFO -- : Migrating to Setup (1)
== 1 Setup: migrating =========================================================
-- create_table("attachments", {:options=>"ENGINE=InnoDB", :force=>true, :id=>:integer})
   -> 0.0135s

~~~~~~~~~~~~~~~~~長いため、割愛します。データモデルの展開処理が流れています~~~~~~~~~~~~

I, [2021-08-09T05:14:54.039985 #25]  INFO -- : Migrating to AddTotpToUser (20200826153402)
== 20200826153402 AddTotpToUser: migrating ====================================
-- add_column(:users, :twofa_totp_key, :string)
   -> 0.0524s
-- add_column(:users, :twofa_totp_last_used_at, :integer)
   -> 0.0539s
== 20200826153402 AddTotpToUser: migrated (0.1065s) ===========================

[2021-08-09 05:15:00] INFO  WEBrick 1.6.1
[2021-08-09 05:15:00] INFO  ruby 2.7.4 (2021-07-07) [x86_64-linux]
[2021-08-09 05:15:00] INFO  WEBrick::HTTPServer#start: pid=1 port=3000
[root@redmine-vm]# 

3000番ポートでRedmineがサービスを開始したことが分かります。

Webブラウザでアクセスしてみる

「http://localhost:3000」にアクセスしてみます。Redmineの初期画面が起動しました。

ここから先はRedmineの世界です。下記から、チュートリアルを開始できます。

参考:Redmineを使い始めるための初期設定 – ログイン( Redmine.JP)

おまけ

自動起動・自動停止を設定する (podman generate systemd)

昨今はVirtualBox やクラウド環境が普及しており、頻繁に起動停止をすることも多いと思います。最後に自動起動・自動停止の仕組みに載せてみます。

systemd のUNITファイルを生成する

podman では、systemd 用のUNITを生成する機能が実装されてます。

[root@redmine-vm]# cd /etc/systemd/system
[root@redmine-vm system]# podman generate systemd --restart-policy no -n -f redmine-pod
/etc/systemd/system/container-db-redmine.service
/etc/systemd/system/container-test-redmine.service
/etc/systemd/system/pod-redmine-pod.service

systemd 設定を再読込する

systemctl daemon-reload

手動によるsystemd操作を確認する

systemctl status pod-redmine-pod.service   # 状態を確認する
systemctl start pod-redmine-pod.service    # 起動する
systemctl stop pod-redmine-pod.service     # 停止する

自動設定を有効化する

[root@redmine-vm]# systemctl enable pod-redmine-pod.service
Created symlink /etc/systemd/system/multi-user.target.wants/pod-redmine-pod.service → /etc/systemd/system/pod-redmine-pod.service.
Created symlink /etc/systemd/system/default.target.wants/pod-redmine-pod.service → /etc/systemd/system/pod-redmine-pod.service.

これでOS起動停止にPodも連動してくれて運用が楽になります。

以上