Vagrant+Docker使ってRedmineを立ててみた

# はじめに
ローカルにRedmine立てたいっていうのと，ちらほら耳にしてたVagrantやDockerを触ってみたいというので試してみました．
想像以上にVagrantすげーDockerすげーってなったので記事にしてみる．
（理解が浅いから間違いとかあったらツッコミが欲しい）

## 想定読者
* 手っ取り早くローカルにRedmineを立てたい人
* VagrantとDockerの名前くらいは知ってる人/ちょっと触ってみたい人

## できること
* めっちゃお手軽に＆環境に依存せずにローカルにRedmineを立てる
* VagrantとDockerすげーって感想を抱く

## やること
1. VagrantとVirtualBoxインストールして
2. 既存のVagrantfileをダウンロードして
    * Vagrantfile: VMの構成を記述したテキストファイル 
3. Redmineを立てるためにVagrantfileをちょっと編集して
    * ここでDocker使う
4. VMを起動する
    * `$ vagrant up`と叩けばVagrantfileに記述した構成のVMを作ってくれる 

コレだけです．

1回Vagrantfile書いちゃえばそれを使いまわせるので，
僕が編集したものを配布すれば`3.`の手順は必要ないのですがせっかくなので．

(追記)
[できること](#できること)で「**お手軽に**＆環境に依存せずに」 と謳っているのでVagrantfileを公開してもっとお手軽感をだせるようにしてみました.

ちなみに普通にローカル環境にRedmine立てるなら，

1. Rubyをインストールして
2. MySQLをインストールして
3. Redmineのソースをダウンロードして
4. DBとDBのユーザー作って
5. DBの接続情報をちょっと編集して
6. Rubyの依存ライブラリをインストールして
7. Session store secret を生成して
8. DBスキーマオブジェクトを生成して
9. DBにデフォルトデータをセットして
10. ファイルシステムの権限変えて
11. Redmineを起動

という手順が必要です．
[Redmineの公式ドキュメント](http://www.redmine.org/projects/redmine/wiki/RedmineInstall)みながら書いたけど間違えてたらごめんなさい．
（実はVagrant+Dockerを試す前にこの手順にしたがってRedmine立てたから問題ないとは思う）

## 各種ソフトウェアの概要
[この記事](https://qiita.com/hidekuro/items/fc12344d36d996198e96#2-%E5%90%84%E7%A8%AE%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E6%A6%82%E8%A6%81)を読めばだいたい雰囲気わかるかなと思います．

VagrantやDockerに詳しくない方が読んでくれているとは思いますが，
説明されてる記事はたくさんあるのでここでは省きます。

#1. VagrantとVirtualBoxインストールして
自身の環境にあわせて[Vagrant](https://www.vagrantup.com/)と[VirtualBox](https://www.virtualbox.org/)をそれぞれインストールします．

#2. 既存のVagrantfileをダウンロードして
## Vagrantfileをダウンロード
今回はCoreOS用のVagrantfileをダウンロードします．

```bash:hostOS
$ cd
$ mkdir vm
$ cd vm
$ git clone https://github.com/coreos/coreos-vagrant.git
```
終わるまで待ちます．

(追記)
もしくは僕が編集したVagrantfileをダウンロードします.
ダウンロードができたら[3. Vagrantfileをちょっと編集して](# 3. Vagrantfileをちょっと編集して)はスキップして[4. VMを起動](# 4.VMを起動)へ.

```bash:hostOS
$ cd
$ mkdir vm/vagrant-redmine
$ cd vm/vagrant-redmine
$ curl -O https://gitlab.com/otuhs_d/VagrantDockerRedmine/raw/master/Vagrantfile
```

#3. Vagrantfileをちょっと編集して
## Vagrantfileを編集
まずはVagrantfileを開きます．
エディタは各自好きなものを使ってください．

```bash:coreOS
$ cd coreos-vagrant
$ vim Vagrantfile
```

Vagrantのポートフォワーディングの設定をします．
今回はCoreOSの10080番ポートをホストPCの12345番ポートにマッピングします．

Vagrantfileの65行目あたりに
`config.vm.network :forwarded_port, guest: 10083, host: 12345`を追加

前後の行もいれるとこんな感じになってるかと思います．

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  # always use Vagrants insecure key
  config.ssh.insert_key = false
  # forward ssh agent to easily ssh into the different machines
  config.ssh.forward_agent = true

  config.vm.network :forwarded_port, guest: 10083, host: 12345

  config.vm.box = "coreos-alpha"
  config.vm.box_url = "https://alpha.release.core-os.net/amd64-usr/current/coreos_production_vagrant_virtualbox.json"
```

次に，VagrantのDocker Provisionerを使って

* Dockerのインストール
* コンテナの実行(PostgreSQLとRedmine)

をVMの起動時に自動でおこなうよう設定します．

> **Provisioning**
Provisioners in Vagrant allow you to automatically install software, alter configurations, and more on the machine as part of the vagrant up process.

> **Docker Provisioner**
The Vagrant Docker provisioner can automatically install Docker, pull Docker containers, and configure certain containers to run on boot.

詳しくは[Provisioning](https://www.vagrantup.com/docs/provisioning/)と[Docker Provisiner](https://www.vagrantup.com/docs/provisioning/docker.html)の公式ドキュメントを参照ください．

Vagrantfileの83行目あたりに以下のブロックを追加

```ruby
config.vm.provision "docker", run: "always" do |d|
  d.run "sameersbn/postgresql", args: "--name=postgresql-redmine -d \
                                       --env='DB_NAME=redmine_production' \
                                       --env='DB_USER=redmine' --env='DB_PASS=password' \
                                       --volume=/srv/docker/redmine/postgresql:/var/lib/postgresql"
  d.run "sameersbn/redmine",    args: "--name=redmine -d \
                                       --link=postgresql-redmine:postgresql --publish=10083:80 \
                                       --env='REDMINE_PORT=10083' \
                                       --volume=/srv/docker/redmine/redmine:/home/redmine/data"
end
```

前後の行もいれるとこんな感じになってるかと思います．

```ruby:Vagrantfile
    # enable ignition (this is always done on virtualbox as this is how the ssh key is added to the system)
    config.ignition.enabled = true
  end

  config.vm.provision "docker", run: "always" do |d|
    d.run "sameersbn/postgresql", args: "--name=postgresql-redmine -d \
                                         --env='DB_NAME=redmine_production' \
                                         --env='DB_USER=redmine' --env='DB_PASS=password' \
                                         --volume=/srv/docker/redmine/postgresql:/var/lib/postgresql"
    d.run "sameersbn/redmine",    args: "--name=redmine -d \
                                         --link=postgresql-redmine:postgresql --publish=10083:80 \
                                         --env='REDMINE_PORT=10083' \
                                         --volume=/srv/docker/redmine/redmine:/home/redmine/data"
  end

  # plugin conflict
  if Vagrant.has_plugin?("vagrant-vbguest") then
```

#4. VMを起動
さて，あとはVMを起動するだけです．

```bash:hostOS
$ vagrant up
```
立ち上がったら，ブラウザを開いて`http://localhost:12345`にアクセス＆Redmineのページが表示されたら完了です．

---

興味を持つのが遅い感が否めませんがこれからもっと深く学んで行きたい所存．

おわり．