エイチームライフスタイルアドベントカレンダー2017、10日目は株式会社エイチームライフスタイルのエンジニア @otama が担当します。
最近、弊社にて集計基盤を実現するため(Yellowfin導入事例)SQLばかりかいていましたが現場で各監視ツール等の導入時にdocker採用例が盛んになってきましたので @otama も使ってみて置いていかれないようにと触れてみました。
手始めにDockerを利用してRailsが動く環境を作成してみようと思います
Qiitaにたくさん記事はあると思いますが。。。
また今回作成に利用したファイルはコチラにあります。
対象
Dockerって聞いたことあるけどまだ利用したことがないけど使ってみたい方
ゴール
この記事を読んでMacでdocker image内にbundle installしてRuby on Railsを新規作成、ファイル編集はローカルで行うことが出来る環境を作成する
※ 今回試したバージョン
ruby2.4.1
Ruby on Rails v5.1.4
※ 私の環境
MacBook Pro (Retina, 13-inch, Early 2015)
macOS 10.12.5
Docker Version 17.09.0-ce-mac35 (19611)
Docker とは
Dockerが開発した基盤ソフトウェアでアプリやOSの開発を簡単に行える、らしいです。
メリットとしてコンテナはオーバーヘッド(余計な処理)が少なくて軽いという点が上げられます。
事前準備
-
Dockerのインストール
Mac用ダウンロードページ
Windows用ダウンロードページ※Windowsでの動作確認は出来ておりません。。。 -
今回の作業ディレクトリは
$WORKDIR
とし基本的にこのディレクトリからは移動しません。作業ディレクトリ作成$ mkdir ~/docker-practice $ cd ~/docker-practice
ステップ
- ファイルの準備
- dockerイメージの作成 + 開発準備
- docker build
- rails new
- dockerコンテナの起動
- 開発開始
- トップページの作成
実践
1. ファイルの準備
適当なディレクトリを作成しDockerfile,Gemfile,Gemfile.lockを作成します。
$ touch Dockerfile
$ touch Gemfile
$ touch Gemfile.lock
中身は以下
Gemfile.lockは空
source 'https://rubygems.org'
gem 'rails', '5.1.4'
FROM ruby:2.4.1
ENV LANG C.UTF-8
ENV APP_ROOT /app
WORKDIR $APP_ROOT
# 最低限のものをinstall
RUN apt-get update && \
apt-get install -y nodejs sqlite3 --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
# image内にbundle installするためGemfileをコピーする
COPY Gemfile $WORKDIR
COPY Gemfile.lock $WORKDIR
# docker image内にbundle install
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
# ポートのエクスポート
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]
## ----- memo -----
# bundle config --global jobs 4でbundle install 高速化
2. dockerイメージの作成 + 開発準備
2-1 docker build
$ docker build -t otama/rails-app .
を叩いてイメージを作成する
必要なものは自動的にインストールされ準備が着々と進みます。。。
$ docker images
を叩いてイメージが作成されていればOK
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
otama/rails-app latest fc495a1258a8 About a minute ago 759MB
ruby 2.4.1 e7ca4a0b5b6d 2 months ago 684MB
2-2. rails new
$ docker run --rm -it -v "$PWD":/app otama/rails-app rails new . -BT
-B bundle installを行わない
-T test::unitを組み込まない
-
rails new するとGemfileを書き換えていいか聞かれるので Y を入力して進める
$WORKDIR/src 内に必要なファイルが整います -
Gemfileが書き換わったので再度イメージ化
$ docker build -t otama/rails-app .
2-3. dockerコンテナの起動
$ docker run -d -p 3000:3000 -v "$PWD":/app otama/rails-app
-vのオプションでローカルのディレクトリをイメージ上にマウントしています
ここでブラウザを開きlocalhost:3000
にアクセスしてみる
3. 開発開始
3-1. トップページの作成 rails g controller
-
topコントローラー作ってindexのページを作成してみようと思います。
$ docker ps $ docker exec -it <コンテナID> rails g controller top index
※コンテナIDは $ docker ps
で調べます
2. ファイルが幾つか作成されました。変更してみましょう。
$WORKDIR/app/views/top/index.html.erb
のファイルを編集して保存。
3. ブラウザでlocalhost:3000/top/index
へアクセスすると変更が反映されていますね!
その他こんな時どうする?のメモ
- db:create, db:migrateしたい
$ docker run -it <コンテナID> rails db:create
$ docker run -it <コンテナID> rails db:migrate
- rails cしたい
$ docker run -it <コンテナID> rails c
-
Ctrl
+D
で抜ける
- config系のファイル変えたので反映したい
$ docker restart <コンテナID>
今回利用したコマンド
// Dockerfileからイメージの作成docker build
$ docker build -t devloper_name/pjt_name .
// -t:タグ・名前をつける
// buildしたイメージをコンテナ化
$ docker run --rm -i -t devloper_name/pjt_name -v <ローカルパス>:<マウント先パス>
// --rm:コンテナ停止時に自動的に削除
// -p:コンテナ外からのアクセス:コンテナ側のポート番号
// -i:ホストの入力をコンテナの標準出力をつなげる
// -t:コンテナの標準出力とホストの出力をつなげる
// -v:volumeをマウントする場合につける
// イメージの確認
$ docker images
// コンテナの確認
$ docker ps -a # -aをつけると停止しているコンテナも表示する
// コンテナの停止
$ docker stop <コンテナID>
// ゴミを削除
$ docker rm <コンテナID> <コンテナID> .... # コンテナを削除、複数指定可
$ docker rmi <イメージID> <イメージID> .... # イメージを削除、複数指定可
最後に
今回はひとまずRailsが動作する環境が出来ました。今後はdocker-composeを活かして好みの環境を作って行きたいと思います。
エイチームライフスタイルアドベントカレンダー2017、明日はVisual Studio Code使いの @matsu06 さんがVimについて書いてくれるらしいので、お楽しみに。
お知らせ
株式会社エイチームライフスタイルでは、一緒に働けるチャレンジ精神旺盛な仲間を募集しています。興味を持たれた方はぜひエイチームグループ採用サイトを御覧ください。
http://www.a-tm.co.jp/recruit/