Contents
Overview
Podman を使用して Redmine を構築します。必要なコンテナイメージは、MySQL, Redmine, Nginx です。今回は全て Docker Hub の正式なコンテナイメージを使用します。ポイントは TLS 化です。Redmine コンテナの Web サーバーで使用される rails server は、TLS 化に積極的ではないようで、あまり情報が多くありません。rails server を TLS 化するために、https-portal を利用するケースが事例として多いですが、何となく仕組みが中途半端な気がするので、今回は Nginx をフロントに置き、リバースプロキシで Redmine を公開するようにします。また、通常のサービスと同様に systemd でコンテナを管理するために sudo で作業します(具体的には他のサービスと同じ扱いにするためというニュアンスです)。
Pod
最初に Pod を作成します。今回は 10000 ポート Nginx (外部に公開するコンテナ) に割り当てます。
myadmin@ubuntu:~$ sudo podman pod create -n redmine-pod -p 10000:10000 myadmin@ubuntu:~$ sudo podman pod ls POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS e38e7f09dafd redmine-pod Created 6 seconds ago 5226a23ff4ad 1
MySQL
MySQL コンテナを作成します。
Volume
今回、MySQL コンテナに対して以下の 2 つの Volume を割り当てます。
- redmine-mysql-db
- MySQL のデータベースを格納します。
- redmine-mysql-conf.d
- MySQL の設定ファイルを格納します。
redmine-mysql-conf.d は事前に設定ファイルを格納しておく必要があるため、事前に Volume の作成が必要ですが、redmine-mysql-db についてはコンテナの生成時に自動生成されるため、このタイミングでの作成は必須ではありません(コンテナの移行等ではデータの移行のために事前作成が必要となります)。
myadmin@ubuntu:~$ sudo podman volume create redmine-mysql-db myadmin@ubuntu:~$ sudo podman volume create redmine-mysql-conf.d myadmin@ubuntu:~$ sudo podman volume ls
文字コード
Redmine は使用するデータベースの文字コードの指定があるようなので、下記の通り設定します。これは MySQL コンテナの起動時に読み込まれます。
myadmin@ubuntu:~$ sudo tee /var/lib/containers/storage/volumes/redmine-mysql-conf.d/_data/multibyte.cnf <<"EOF"
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
EOF
コンテナの実行
MySQL コンテナを実行します。
myadmin@ubuntu:~$ sudo podman run -d --pod redmine-pod --name redmine-mysql \ --env='TZ=Asia/Tokyo' \ --env='MYSQL_ROOT_PASSWORD=password' \ --env='MYSQL_USER=redmine' \ --env='MYSQL_PASSWORD=password' \ --env='MYSQL_DATABASE=redmine' \ -v redmine-mysql-db:/var/lib/mysql \ -v redmine-mysql-conf.d:/etc/mysql/conf.d \ docker.io/library/mysql myadmin@ubuntu:~$ sudo podman ps
コンテナのシェルを起動します。
myadmin@ubuntu:~$ sudo podman exec -it redmine-mysql bash
MySQL にログインし、デフォルトの文字セットの確認、redmine ユーザーの確認、redmine データベースの情報を確認しています。
bash-4.4# mysql -u root -p mysql> show variables like '%char%'; +--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | utf8mb4 | | character_set_system | utf8mb3 | | character_sets_dir | /usr/share/mysql-8.0/charsets/ | +--------------------------+--------------------------------+ 8 rows in set (0.01 sec) mysql> select user,host,plugin from mysql.user; +------------------+-----------+-----------------------+ | user | host | plugin | +------------------+-----------+-----------------------+ | redmine | % | caching_sha2_password | | root | % | caching_sha2_password | | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | caching_sha2_password | +------------------+-----------+-----------------------+ 6 rows in set (0.00 sec) mysql> show create database redmine; +----------+-----------------------------------------------------------------------------------------------------------------------------------+ | Database | Create Database | +----------+-----------------------------------------------------------------------------------------------------------------------------------+ | redmine | CREATE DATABASE `redmine` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ | +----------+-----------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> exit bash-4.4# exit
Redmine
Redmine コンテナを作成します。
Volume
Remine のデータ(本稿では Redmine アップロードしたファイル)を永続化するために、コンテナからマウントする Volume を作成します。コンテナの生成時にも自動生成されるため、このタイミングでの作成は必須ではありません。
myadmin@ubuntu:~$ sudo podman volume create redmine-files myadmin@ubuntu:~$ sudo podman volume ls
コンテナの実行
Redmine コンテナを実行します。
myadmin@ubuntu:~$ sudo podman run -d --pod redmine-pod --name redmine \ --env='TZ=Asia/Tokyo' \ --env='REDMINE_DB_MYSQL=127.0.0.1' \ --env='REDMINE_DB_USERNAME=redmine' \ --env='REDMINE_DB_PASSWORD=password' \ -v redmine-files:/usr/src/redmine/files \ docker.io/library/redmine myadmin@ubuntu:~$ sudo podman ps
Nginx
Nginx コンテナを作成します。
Volume
Nginx の設定ファイルと TLS 証明書を Nginx に読み込ませるため、コンテナからマウントする Volume を作成します。コンテナの生成時にも自動生成されるため、このタイミングでの作成は必須ではありません。
myadmin@ubuntu:~$ sudo podman volume create redmine-nginx-conf.d myadmin@ubuntu:~$ sudo podman volume ls
設定ファイルと TLS 証明書の配置
TLS 証明書を配置( TLS 証明書の作成はこちらを参照)して、Nginx の設定ファイルを作成しています。本稿での Nginx はリバースプロキシとして使用します。http://127.0.0.1:3000 は Redmine コンテナのポート番号です。
myadmin@ubuntu:~$ sudo cp /home/myadmin/work/easy-rsa/pki/issued/si1230.com.crt /var/lib/containers/storage/volumes/redmine-nginx-conf.d/_data myadmin@ubuntu:~$ sudo cp /home/myadmin/work/easy-rsa/pki/private/si1230.com.key /var/lib/containers/storage/volumes/redmine-nginx-conf.d/_data myadmin@ubuntu:~$ sudo tee /var/lib/containers/storage/volumes/redmine-nginx-conf.d/_data/proxy.conf <<"EOF" server { listen 10000 ssl; server_name redmine.si1230.com; ssl_certificate /etc/nginx/conf.d/si1230.com.crt; ssl_certificate_key /etc/nginx/conf.d/si1230.com.key; location / { proxy_pass http://127.0.0.1:3000; } access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; } EOF
コンテナの実行
Nginx コンテナを実行します。
myadmin@ubuntu:~$ sudo podman run -d --pod redmine-pod --name redmine-nginx \ --env='TZ=Asia/Tokyo' \ -v redmine-nginx-conf.d:/etc/nginx/conf.d \ docker.io/library/nginx myadmin@ubuntu:~$ sudo podman ps
Redmine へのアクセス確認
以下で Redmine にアクセスできます。初回ログインは admin/admin です。TLS のため、FQDN でアクセスすべき(ブラウザで警告が出るため)ですが、IP アドレスでも問題はありません。
https://redmine.si1230.com:10000
systemd
Podman は、コンテナを管理するための systemd ユニットファイルを生成することができます。
systemd ユニットファイル
systemd ユニットファイルを生成します。コマンドオプションはいくつかありますが、通常は以下で十分でしょう。
myadmin@ubuntu:~$ cd /etc/systemd/system myadmin@ubuntu:~$ sudo podman generate systemd -f -n redmine-pod /etc/systemd/system/pod-redmine-pod.service /etc/systemd/system/container-redmine.service /etc/systemd/system/container-redmine-mysql.service /etc/systemd/system/container-redmine-nginx.service
- --files, -f
- --files または -f フラグを使用すると、標準出力ではなくファイルが生成されます。生成されたファイルの名前は、{container,pod}-{ID,name}.service となり、現在の作業ディレクトリに配置されます。
- --name, -n
- --name または -n フラグを使用すると、ユニットファイルの開始、停止、説明にコンテナの名前が使用されます。
上記のオプション以外に、--restart-policy を設定しているケースもよくありますが、それを指定しない場合のデフォルト値は on-failure です。on-failure はプロセスが異常終了した場合にプロセスを再起動するための設定であり、apt でインストールするサービスのデフォルト値でもあります。これは Podman の設定ではなく、Systemd の設定値になるため、Systemd のマニュアルを参照すると良いでしょう。
systemd ユニットファイルの有効化
systemd を再起動して、追加したユニットファイルを読み込みます。
myadmin@ubuntu:~$ sudo systemctl daemon-reload
systemd を使用した Podman の操作
systemd から redmine-pod を操作してみます。systemd コマンドは一般的な内容であるため説明は省略します。尚、初回は systemd では起動していない状態ですが、実際はこれまでの作業で起動している状態です。sudo podman ps コマンドでも並行して確認すると良いでしょう。
myadmin@ubuntu:~$ sudo systemctl status pod-redmine-pod.service myadmin@ubuntu:~$ sudo systemctl start pod-redmine-pod.service myadmin@ubuntu:~$ sudo systemctl stop pod-redmine-pod.service myadmin@ubuntu:~$ sudo systemctl restart pod-redmine-pod.service
systemd の自動起動設定
システム起動時に redmine-pod が起動するように systemd を設定します。
myadmin@ubuntu:~$ sudo systemctl enable pod-redmine-pod.service myadmin@ubuntu:~$ sudo systemctl is-enabled pod-redmine-pod.service enabled
参考資料
https://yuyublog.org/2021/08/09/post-2632/
目次に戻る