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の記述をする。
gem 'rails', '5.0.0.1'
ロックファイルを作る
sudo touch Gemfile.lock
Dockerfileの編集
親イメージを読み込んで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で管理します。
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