Docker上でRails環境をバージョン指定して構築

#初めに
Docker上でRails環境を構築してみます。

以下の記事を参考にし過ぎています。m(_ _)m
https://qiita.com/takaeda/items/956e2cda03d289fe4630
railsのバージョン指定とgem install bundleが失敗してしまう部分(*)が修正点が差分になります。
*gem install bundlerだと途中で、ねえねえbundleに読み替えてもいい？と入力が求められて,
buildが失敗してします。

+で以下を参照
centosの公式リポジトリ
https://hub.docker.com/_/centos/

Dockerfile リファレンス
http://docs.docker.jp/v1.12/engine/reference/builder.html


#ゴール
Docker上で以下の環境を作ることをゴールにします。
- CentOS 7
- ruby 2.4.2
- rails 5.1.4

CentOSは実際にはなくても良いが普段yumに慣れているため構築する。
普段CentOS系を使っていればDockerfileの内容を理解し易いと思う。

#Docker環境
```bash
Docker version 17.06.1-ce, build 874a737
```
※DockerはDocker for Macを利用しています。

#結論
結論を先に書いてしまうと、以下のDockerfileを作ってbuildするだけ。（まじでDocker便利すぎ）

# Dockerfileの作成
以下のようにDockerfileを作る

```bash
vi Dockerfile
```


```bash
FROM centos:7

# rubyとrailsのバージョンを指定
ENV ruby_ver="2.4.2"
ENV rails_ver="5.1.4"

# 必要なパッケージをインストール
RUN yum -y update
RUN yum -y install epel-release
RUN yum -y install git make autoconf curl wget
RUN yum -y install gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel sqlite-devel bzip2
RUN yum clean all

# rubyとbundleをダウンロード
RUN git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
RUN git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build

# コマンドでrbenvが使えるように設定
RUN echo 'export RBENV_ROOT="/usr/local/rbenv"' >> /etc/profile.d/rbenv.sh
RUN echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> /etc/profile.d/rbenv.sh
RUN echo 'eval "$(rbenv init --no-rehash -)"' >> /etc/profile.d/rbenv.sh

# rubyとrailsをインストール
RUN source /etc/profile.d/rbenv.sh; rbenv install ${ruby_ver}; rbenv global ${ruby_ver}
RUN source /etc/profile.d/rbenv.sh; gem update --system; gem install --version ${rails_ver} --no-ri --no-rdoc rails; gem install bundle

```

# docker buildでイメージを生成
Dockerfileを作成したディレクトリでbuildコマンドを実行
-t　my_project/railsはタブ名なので任意
git clone部分は結構時間かかるかも

```bash
$ docker build -t my_project/rails .
```

最後にこんな感じで表示されれば成功

```bash
Successfully tagged my_project/rails:latest
```
ふむふむちゃんとできている。

```bash
$ docker images
REPOSITORY                              TAG                 IMAGE ID            CREATED              SIZE
my_project/rails                        latest              f45aa2897fea        About a minute ago   1.04GB
```

# docker runでコンテナ起動
ドキドキしながらdockerコンテナを起動してみます。
あらかじめ3000ポートは割り当てておく。 

```bash
$ docker run -i -d -p 3000:3000 --name rails my_project/rails
```

```bash
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
44ffd087b9e7        my_project/rails    "/bin/bash"         4 seconds ago       Up 2 seconds        0.0.0.0:3000->3000/tcp   rails
```

# railsでプロジェクト作成
docker execでコンテナ内へ

```bash
$ docker exec -it rails /bin/bash
```
rails newしてみると・・・

```bash
＃ rails new myapp

＃ cd myapp/

＃ ls -l
total 68
-rw-r--r--  1 root root 1974 Dec  6 12:53 Gemfile
-rw-r--r--  1 root root 4772 Dec  6 12:53 Gemfile.lock
-rw-r--r--  1 root root  374 Dec  6 12:53 README.md
-rw-r--r--  1 root root  227 Dec  6 12:53 Rakefile
drwxr-xr-x 10 root root 4096 Dec  6 12:53 app
drwxr-xr-x  2 root root 4096 Dec  6 12:53 bin
drwxr-xr-x  5 root root 4096 Dec  6 12:53 config
-rw-r--r--  1 root root  130 Dec  6 12:53 config.ru
drwxr-xr-x  2 root root 4096 Dec  6 12:53 db
drwxr-xr-x  4 root root 4096 Dec  6 12:53 lib
drwxr-xr-x  2 root root 4096 Dec  6 12:53 log
-rw-r--r--  1 root root   63 Dec  6 12:53 package.json
drwxr-xr-x  2 root root 4096 Dec  6 12:53 public
drwxr-xr-x  9 root root 4096 Dec  6 12:53 test
drwxr-xr-x  3 root root 4096 Dec  6 12:53 tmp
drwxr-xr-x  2 root root 4096 Dec  6 12:53 vendor
```
できたできた！
Gemfileのgem 'therubyracer'のコメントアウトを外してbundle install
（説明は省きますがtherubyracerがないと「Could not find a JavaScript runtime」を起こしちゃいます。）

```bash
＃ vi Gemfile

＃　bundle install

＃ rails s
=> Booting Puma
=> Rails 5.1.4 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.11.0 (ruby 2.4.2-p198), codename: Love Song
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```

問題なく起動しましたね！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206710/92254cf4-a6f5-3ea5-3e05-689d87ddfcc1.png)

これでdocker環境があればチームで同じ開発環境を作れそう。
便利な世の中になったなぁ。