【環境】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コンテナを使ってみます。
- ベースイメージを取得する(podman pull)
- Pod を作成する(podman pod create)
- MySQLコンテナを作成する (podman run)
- Redmineコンテナを作成する (podman run)
- 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 でコンテナ内にログオンします。
[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も連動してくれて運用が楽になります。
以上