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のソースを置くプロジェクトのフォルダを作成します。

sudo mkdir /usr/src/hoge
cd /usr/src/hoge

rubyイメージのダウンロードとgemfileの作成

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

docker pull ruby:2.3.1
docker run --rm -v "$PWD":/usr/src/hoge -w /usr/src/hoge ruby:2.3.1 bundle init
オプション
docker pull
イメージをダウンロードします。この場合は「ruby:2.3.1」を取得します。

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

Gemfileの編集

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

/usr/src/hoge/Gemfile
gem 'rails', '5.0.0.1'

ロックファイルを作る

sudo touch Gemfile.lock

Dockerfileの編集

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

/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"]
メモ
FROM: 親イメージの指定
ENV: 環境変数の設定
WORKDIR: ワーキングディレクトリの指定
COPY: ファイルをイメージにコピー
RUN: コマンド実行

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

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

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

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を選択して上書きしましょう

docker run --rm -it -v "$PWD":/usr/src/hoge  kite_999/hoge  rails new . -BT
--rm: 実行後のコンテナを削除します。指定しない場合はゴミが残り続けます。
-it: コンテナのプロセスに対してttyを割り当てる(コンテナをつくってログインする)
-BT: bundle install 無し、テストツール無し

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

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

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

EXPOSE  3000
CMD ["rails", "server", "-b", "0.0.0.0"]
docker build -t kite_999/hoge .

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

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

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

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

開発時は?

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

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

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

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

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

いちいち

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

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

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

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

docker-compose build

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

docker-compose up -d
-d: バックグラウンド実行

再起動も下記だけ。

docker-compose restart

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

掃除

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

docker ps -a

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

docker rm コンテナID

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

docker images

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

docker rmi イメージID