というのを作りました。実は2か月前には完成していたのですが英語のREADMEを書くのがめんどくさくてそのまま放置していました。

リポジトリは下記です。この記事では使い方は最小限だけ書いて、なんで作ったかとか特徴とかを書きます。
docker-redmine-orchestration

少し前の記事で書いたのですが Docker compose 1.9.0では動作しないかもしれません。 1.8.1で動作することは確認しています。こちらはいずれ確認する予定です。 Docker compose 1.9.0でも動作することを確認しました。

構成


インストール


上記の日本語ページに書いていますが、下記の2手順で3分くらいでRedmineを構築できます。

  1. Redmine/redmineディレクトリ内にある*_download.shを実行してRedmineのソースコードをダウンロード
  2. redmineディレクトリ内でdocker-compose upを実行

以上です。自分で作っといていうのもアレですけど、マジ簡単。実際はRedmineのコードのダウンロードや設定等を含めると10分くらいかかると思います。DockerおよびDocker composeのインストールを含めるともうちょっとかかると思いますが。

カスタマイズとか設定


細かくはリポジトリのドキュメントに書いていますが、それぞれ(nginx、MariaDB、Redmine)の設定はDocker関係なく設定できます。その他のポート等の設定はdocker-compose.ymlで行う必要があるので多少のDockerの知識が必要になります。と言ってもyamlなので見たら大体わかると思います。

作った背景


公式のRedmineのDockerイメージは存在するのですが、下記の点が少しイマイチだな~と思ったので作りました。

  • webrickもしくはpassengerでしか動作しない
  • フロントWebサーバー(nginxやApache)がない
  • 各アプリケーションが異なるコンテナに分離されていない(これはDocker Hubに登録する関係で仕方ないとは思う)
  • DBがMySQL

これらに加えて、Dockerをあまり理解していない状態の時に作ることになったので、よくわからなくないまま使いたくないというのがありました。じゃあ自作してしまえということですね。
ちなみに、上記の辺りを気にせず動かすなら公式のイメージを使った方が早いと思います。

特徴


Dockerで動かすRedmineは他にもあると思うのですが「他のDocker compose製のRedmineとはここが違う(と思う)」という特徴を書いてみます。まあ、ほかのやつあんまり見てないのでハッキリ違うとは言い切れないのですが。

nginx + MariaDB + unicornで動作する

おそらく、これが現時点のRedmineを動かすうえでのベストの構成だと思います。しかも、コンテナをそれぞれキッチリ分離しています。

プラグインを自由にインストールできる

Dockerは性質上、イメージを変更する場合は再度ビルドが必要です。そのため、まっとうにプラグインをインストールするには都度Dockerfileにその旨を記述してビルドが通るかどうか繰り返す必要があります。
しかし、それではプラグインのインストールとアンインストールの都度、Dockerfileを変更してビルドしなおすという非常にめんどくさい作業が発生します。

それを回避するためにプラグインはdocker-compose up実行都度(要するにRedmineの起動都度)インストールするようにしています。こうすることで、通常のプラグインのインストールと同様にPluginsディレクトリにプラグインを配置し、docker-compose upするだけでインストール・アンインストールができます。

ただし、それと引き換えにdocker-compose up実行都度、プラグインが使用しているRuby gemsのインストールが始まってしまうのは欠点ですが、そう頻繁にRedmineを停止するものでもないと思うのでそんなにコストがかかるものではないと判断しました。
また、別に都度プラグインのインストールが実行されたからと言って、実際のデータには何の影響もありません。

各アプリケーションの設定を容易に変更できる

アプリケーションの設定ファイル、例えばnginx.confなどはホストOS側からマウントするようにしています。従って、設定ファイルを変更したからといって、都度Dockerをビルドする必要はありません。

バックアップ

バックアップのスクリプトを準備しているので実行するだけで、MariaDBとRedmineのFileがバックアップできます。日付ごとにディレクトリ作成して時間別でtar形式で保存されます。

デフォルトでgit連携できる

デフォルトでgitのリポジトリと連携できるようにしてます。

欠点


欠点というかどうかはアレなんですが公式のnginxのDocker imageを使用しています。こいつはブラウザがChromeの場合、http2で通信できません。なんかopen-sslのバージョンの問題っぽいです。なので、Chromeの場合はhttp2で通信できません。いちおう、 対応する予定っぽいです。(マージはされてますが、リリースはまだみたいです。)

このサイトで使用している自作のdocker-nginxだとChromeでもhttp2で通信できているので、そっちに置き換えるかどうかちょっと迷ってます。

また、Alpine Linuxのパッケージのアップデートが早すぎて、割と頻繁にdocker-composeのビルドが通らなくなったりします。一度ビルドしてイメージができてしまえば、再度ビルドする必要性が生じない限り(各種ミドルウェアのアップデートなどが発生しない限り)は問題ないのですが…一応、1か月に1回くらいは手動で確認するようにしてますが、定期的にCIで確認する必要があるなあ…と思ってます。しかし、ビルドに使用しているCircleCIは定期ビルドができないんだよなぁ…

あとは、Redmineのイメージが約780MBとデカいので何とかしたいのですが、これ以上削れないです。う~ん、困ったね。

追記 2017-03-04

VPSから日本時間の00:00に毎日APIを叩いてビルドするようにしました!

CircleCI 左のバッジがPASSEDなら今日(≠ 記事書いた日でなくてそのままの意味の今日時点)のビルドは通ってます。

まとめ


Docker解らないと始めるのはちょっと気が重いかもしれないですが、Redmineを一から構築するのに比べたらDockerを使うというのはいうほど難しくないです。なので使ってみてくださいという宣伝記事です。何かあればGitHubのIssueに起票して頂くか、何らかの形で問い合わせいただけたらと思います。