ruby on railsをubuntuのdockerで構築する

#ruby on railsをubuntuのdockerで構築する
railsを勉強しようと思いましたが、rubyが良くわからず試行錯誤しそうだったので
hostを汚さないようにdockerでrailsの実行環境を構築してみました。
ほぼ
http://qiita.com/togana/items/30b22fc39fe6f7a188ec
を参考にしています。

##前提
ruby 2.3.1
他のバージョンを使う場合は下記を参照ください。
https://hub.docker.com/r/_/ruby/

rails 5.0.0.1
他のバージョンを使う場合は下記を参照ください。
http://rubyonrails.org/

今回はhogeというアプリを作成するプロジェクトと仮定します。

##インストール
http://qiita.com/kite_999/items/9178b3e7cd80bbe9ce15
に記載しました。

##dockerイメージの作成

host側にrubyのソースを置くプロジェクトのフォルダを作成します。

```lang:
sudo mkdir /usr/src/hoge
cd /usr/src/hoge
```

###rubyイメージのダウンロードとgemfileの作成
rubyもインストールしたくないのでイメージを使用し、gemfileの作成もdockerで行う。

```lang:
docker pull ruby:2.3.1
docker run --rm -v "$PWD":/usr/src/hoge -w /usr/src/hoge ruby:2.3.1 bundle init
```

```lang:オプション
docker pull
イメージをダウンロードします。この場合は「ruby:2.3.1」を取得します。

docker run オプション image名:タグ名 実行コマンド
--rm: 実行後のコンテナを削除します。指定しない場合はゴミが残り続けます。
-v: ホストのディレクトリをコンテナ内のディレクトリにマウントします。"$PWD"はカレントディレクトリを意味します。
-w: ワーキングディレクトリを指定します。
```

###Gemfileの編集
先程作成したGemfileにrailsの記述をする。

```lang:/usr/src/hoge/Gemfile
gem 'rails', '5.0.0.1'
```

ロックファイルを作る

```lang:
sudo touch Gemfile.lock
```

###Dockerfileの編集
親イメージを読み込んでhogeのアプリイメージを構築するためにDockerfileを編集します。

```lang:/usr/src/hoge/Dockerfile
FROM ruby:2.3.1
MAINTAINER kite_999
ENV APP_ROOT /usr/src/hoge

WORKDIR $APP_ROOT

RUN apt-get update && \
    apt-get install -y nodejs \
                       mysql-client \
                       postgresql-client \
                       sqlite3 \
                       --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*

COPY Gemfile $APP_ROOT
COPY Gemfile.lock $APP_ROOT

RUN \
  echo 'gem: --no-document' >> ~/.gemrc && \
  cp ~/.gemrc /etc/gemrc && \
  chmod uog+r /etc/gemrc && \
  bundle config --global build.nokogiri --use-system-libraries && \
  bundle config --global jobs 4 && \
  bundle install && \
  rm -rf ~/.gem
 
# bundle install でカレントディレクトリに rails5 をインストールした後、
# 以下のコメントアウトを外して再度 docker build を実行する
#
#COPY . $APP_ROOT
#
#EXPOSE  3000
#CMD ["rails", "server", "-b", "0.0.0.0"]
```

```lang:メモ
FROM: 親イメージの指定
ENV: 環境変数の設定
WORKDIR: ワーキングディレクトリの指定
COPY: ファイルをイメージにコピー
RUN: コマンド実行
```

###Dockerfileを用いてimageの作成をする

```lang:
docker build -t kite_999/hoge .
```

```lang:
docker build . : カレントディレクトリのDockerfileをビルド
-t: 開発者名/プロジェクト名でイメージ名が作成される
```

上記でgem 'rails', '5.0.0.1'を持ったimageを作成
結果は下記コマンドで参照できます。

```lang:
docker images

REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
kite_999/hoge   latest              00fd952ad98c        39 hours ago        878.8 M
```

###rails newを行います
イメージができたので、railsの雛形をrails new . で生成します。Gemfileがコンフリクト起こすのでYを選択して上書きしましょう

```lang:
docker run --rm -it -v "$PWD":/usr/src/hoge  kite_999/hoge  rails new . -BT
```

```lang:
--rm: 実行後のコンテナを削除します。指定しない場合はゴミが残り続けます。
-it: コンテナのプロセスに対してttyを割り当てる（コンテナをつくってログインする）
-BT: bundle install 無し、テストツール無し
```

###newしたものを使用して再度イメージを作成します。

Dockerfileのコメントアウトを外して、イメージを再作成します。

```lang:
# bundle install でカレントディレクトリに rails5 をインストールした後、
# 以下のコメントアウトを外して再度 docker build を実行する
#
COPY . $APP_ROOT

EXPOSE  3000
CMD ["rails", "server", "-b", "0.0.0.0"]
```

```lang:
docker build -t kite_999/hoge .
```

以上でrailsのイメージ作成完了

下記で試験的に実行できます。

```lang:
docker run -d -p 3000:3000 kite_999/hoge
```

上記実行後、3000portにhttpでアクセスすると下記のような画面が表示されます。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/56889/3062f8a0-7238-af92-c0a9-a1bdfd5b4f3f.png)

###開発時は？
/usr/src/hogeディレクトリを下記オプションでマウントしているので
hostのファイルをそのまま見ています。
なのでhostの/usr/src/hogeディレクトリを更新すれば反映されます。

```lang:
-v "$PWD":/usr/src/hoge
```

サーバのコンフィグ修正時はrestart必要。
再起動方法は下記

```lang:
docker ps
でコンテナIDを取り
docker restart コンテナID
で再起動可能
```

##docker-composeによるコンテナ管理
いちいち

```lang:
docker run -d -p 3000:3000 kite_999/hoge
```

などと打つのは大変なのでdocker-composeで管理します。

```lang:docker-compose.yml
version: '2'
services:
  app:
    build: .
    environment:
      RAILS_ENV: development
    ports:
      - '3000:3000'
    volumes:
      - .:/usr/src/hoge
```

上記ファイル作成後、下記コマンドで再ビルド

```lang:
docker-compose build
```

起動は下記だけで済むようになります。

```lang:
docker-compose up -d
```

```lang:
-d: バックグラウンド実行
```

再起動も下記だけ。

```lang:
docker-compose restart
```

コマンド類の詳細は下記。
http://docs.docker.jp/compose/reference/index.html

##掃除
上記手順でcompose前のイメージとrailsをgemfileにもったイメージができ、使用していないので
削除します。

```lang:
docker ps -a
```

でコンテナの一覧を表示、下記で削除する

```lang:
docker rm コンテナID
```

コンテナを消したらイメージを削除することができます。

```lang:
docker images
```

でimageの一覧を表示、下記で削除する

```lang:
docker rmi イメージID
```