はじめに
今回は、Mac OS 上の Docker に Redmine の環境を構築する方法をみていきます(Cent OSでも同様の手順でできたので、インストールされる方は参考にしてみてください)。
Redmine とは、Web でプロジェクト管理をすることができる、オープンソースソフトウェアです。開発現場ではよく使用されているソフトウェアの1つではないでしょうか。
Redmine は Ruby on Rails で作成されています。Linux 系のOS(Cent OSやUbuntu)、Mac OS、Windows でも動作させることができます。
Redmine を動かすには様々なソフトウェアのインストールや設定が必要で、すんなりと構築できたことがありません。
そこで、docker を使用すれば、自分の環境を汚すことなく(失敗したらイメージを決してやり直すだけなので)何度でも試行錯誤して構築することができると考えました。
世の中、同じことを考えている方が大勢いらっしゃるようで、Docker 用 の Redmineのイメージもありました。
Docker用のイメージがあるので、簡単に構築できるかと思ったのですが、2週間ほどハマりました。最終的に手順が確立したのでメモとして残しておきます。
環境
OS: Mac OS Mojave 10.14.6
Docker: docker desktop community 2.1.0.2 (37877)
目次
Docker Hub で提供されているイメージの一覧を取得する
はじめに、Docker Hub で Redmine が提供されているかを確認することとします。
一覧は、以下のコマンドで取得することができます。
docker search イメージ名
redmine が提供されているかを確認した時のスクショは以下です。

NAME 欄がイメージ名で [リポジトリ名/イメージ名]の書式になっています。
上記のスクショからもわかるように Redmine のイメージが存在することを確認できました。
docker-compose で Redmine を構築する
Redmine はそれ単体では動作することはありません。データの保管先として、MySQLやMariaDB、PostgreSQLなどが必要となります。
Redmine とデータベース用の2つのコンテナを準備して連携させる必要があります。コンテナ同士を連携するには、Docker アプリケーションを定義し、実行するの必要があり、このような場面で使用するのが docker-compose です。
docker-compose を使用するには、専用の設定ファイルを作成する必要があります。
設定ファイルの作成が完了したら、docker-compose を使用して Redmine を構築します。
設定ファイルを作成する前に、コンテナイメージを配置するディレクトリを作成しておきましょう。
筆者は以下にのように作成しました。
mkdir Users/<ユーザー名>/MyProjects/dockerRedmine
続いて、ターミナルで以下のコマンドを実行して、作成したディレクトリに移動します。
cd /Users/<ユーザー名>/MyProjects/dockerRedmine/
次に、vi 等のエディタで docker-compose.yml というファイルを作成して、以下の内容で保存をします。
version: '3.7' services: redmine: container_name: redmine image: redmine restart: always ports: - 3000:3000 volumes: - ./Redmine/plugins:/usr/src/redmine/plugins - ./Redmine/themes:/usr/src/redmine/public/themes environment: REDMINE_DB_MYSQL: redmine-db REDMINE_DB_PASSWORD: redmine redmine-db: image: mariadb container_name: redmine-db restart: always environment: MYSQL_ROOT_PASSWORD: redmine MYSQL_DATABASE: redmine volumes: - ./db:/var/lib/mysql command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
上記のファイルに説明します。公式のリファレンスはこちら。
最初の version は docker-compose で使用するバージョンです。2019/9/7 時点ではこのままで大丈夫です。docker-compose のバージョンは https://docs.docker.com/compose/compose-file/ で確認できます。
続いて services: とありますが、ここには使用するイメージを書きます。
Redminの設定
4行目からが Redmine の定義です。
container_name にはコンテナ名を、image には docker-hub で提供されているイメージ名を指定します。restart: にalways を指定しているのは、dockder-compose を実行したときに常に再起動するように指定しています。
続いて、 ports ですが、3000:3000 は左側が、アクセスするブラウザ側で使用するポート番号で、右側が接続先のコンテナのポート番号です。よってブラウザのポート3000とコンテナのポート3000を介して接続できるようになります。ちなみに 8080ポートに設定してみたのですが、うまくいきませんでした。筆者の環境だけでしょうか?最終的に3000に落ち着きました。
volumes というのは、永続化するためのディレクトリを指定しています。永続化というのは、コンテナが終了した後もコンテナ内で変更のあったファイルを残せるように、ホストOSのディレクトリをコンテナのディレクトリにマウントすることをいいます。コロンの左側がホスト側のディレクトリで、右側がコンテナ側のディレクトリです。これによっり、コンテナとファイルのやりとりができるようになります。今回は Redmine のテーマ用のディレクトリとプラグイン用のディレクトリを永続化しています。
environment には、Redmine で使用するデータベースの設定を書いています。REDMINE_DB_MYSQL には、Redmine コンテナで使用する、mariaDB のコンテナ名(19行目)を指定し、REDMINE_DB_PASSWORDには、mariaDB に構築する Redmine 用データベースのパスワードを指定します。
mariaDBの設定
17行目からが mariaDB の定義です。
image には docker-hub で提供されているイメージ名を、container_name にはコンテナ名を指定します。restart: にalways を指定しているのは、dockder-compose を実行したときに常に再起動するように指定しています。
environment には MYSQL_ROOT_PASSWORD で ルートパスワードと、MYSQL_DATABASE で作成するデータベース名を指定しています。
volumes では、永続化するディレクトリを指定しています。コンテナの /var/lib/mysql をマウントしています。このディレクトリをマウントしておけば、ホストOS でバックアップを取ることが可能にです。
最後は、データベースで使用する文字コードを指定しています。
docker-compose を実行する
それでは docker-compose を実行します。
docker-compose を実行するには、先ほど作成した docker-compose.yml ファイルがあるディレクトリで以下のコマンドを実行します。
docker-compose up -d
up というのが起動を意味し、-d はマルチタスク上で実行するためのオプションです。-dをつけないとプロンプトが帰ってきませんので注意してください。

Creating redmine-db が done、Createing redmine が done となったらブラウザで http://localhost:3000/ にアクセスしてみましょう。
以下のように、Redmine のページが表示されることでしょう。
Redmine は admin/admin でログインできます。ログインしたら、パスワードを変更しましょう。

Redmine が起動しない時の対処
まずは設定ファイルを確認して下さい。タイポがないか確認しましょう。
それでも起動しないときは、docker-compose と docker を再起動してみてください。
docker-compose を停止するには以下のコマンドを使用します
docker-compose down
docker-compose down で docker-compose を停止して、docker-compose-up で起動することで再起動ができます。
筆者はなかなか Redmine の起動を確認できなかったのですが、ポート番号を 3000 に変更したり、docker-compose の再起動などで起動することができました。
コメント