はじめに
Dockerの勉強会に参加して少し、Dockerについて勉強しました。
tec.connpass.com
せっかく勉強したので、Raisの開発環境をDockerで構築してみました(._.)
まだまだわからないことだらけですが、とりあえず開発環境をDockerコンテナ上に構築・実行確認とherokuへのデプロイまで確認出来たので、手順をメモしてみますφ(._.)
※ちなみに下記ページを大変参考にさせて頂きました・・・!
qiita.com
DockerFile等を含んだ形でgithubにサンプルソースをpushしているので、ソースだけ見たい方はこちらへ。
github.com
環境
私の環境
ちなみに私のローカル環境は、こんな感じです!
構成 |
内容 |
ローカル |
Mac OSX Yosemite |
Docker |
17.12.0-ce-mac47 |
Docker
Dockerとは
DockerとはRubyやPosgresといったミドルウェアをDocker上にコンテナとして構築出来るものです。
似たような技術として仮想環境がありますが、下記のようなメリットがあり、最近注目されている技術です。
- 環境をテキストベースのファイルとして配布出来る。環境の再現性。
- スクラップ&ビルドが容易
- DockerがOSレイヤーをラップして、各OSの差分を吸収してくれるためOS環境を気にしなくても良い。
上記説明ではわからない部分が多いと思うので、下記のような記事で確認頂ければと思います。
employment.en-japan.com
Dockerのインストール
MACだったらDockerのインストールはとても簡単です!
下記のインストールページにアクセスし、Get Docker
を押すと安定版のインストーラーが入手出来るので、あとは手順に従えばOKです。
https://store.docker.com/editions/community/docker-ce-desktop-mac
最後にターミナルからインストールを確認して下記のようになれば、OKです。
$ docker --version
Docker version 17.12.0-ce, build c97c6d6
Dockerを使ってRails開発環境を構築する
目指す環境構成
今回目指す環境はこんな感じで、ベーシックなRailsの環境を目指して行きます!
Docker上にRailsが動作するコンテナとPosgreSQLが動作するコンテナの立てて、ローカルで動作確認を行いHerokuへデプロイしてみたいと思います。
イメージはこんな感じです。
手順
まずは、普通にローカルでRailsプロジェクトを作成します。
rails new docker_sample_app
Docker関連ファイルの配置
その後、DockerFile
及びdocker-compose.yml
をrootディレクトリ配下に配置します。
DockerFile
はコンテナの定義ファイルで、docker-conpose.yml
は、DockerFile
の関連を定義したファイルです。
DockerFile
でWeb用のコンテナを既存のrubyのimageをベースに定義しています。DB用のコンテナはdocker-compose.yml
で公式のpostgres
のイメージを使ってそのまま構築しています。
DockerFile
FROM ruby:2.4.0
ENV APP_ROOT /docker_sample_app
RUN apt-get update -qq && apt-get install -y nodejs build-essential libpq-dev postgresql-client
RUN mkdir $APP_ROOT
WORKDIR $APP_ROOT
ADD Gemfile ${APP_ROOT}/Gemfile
ADD Gemfile.lock ${APP_ROOT}/Gemfile.lock
RUN bundle install
ADD . $APP_ROOT
docker-compose.yml
version: '2'
services:
db:
image: postgres
ports:
- "5432"
volumes:
- ./data/postgres:/var/lib/postgresql/data
web:
build: .
command: bundle exec rails s -p 3000 -b 0.0.0.0
ports:
- "3000:3000"
links:
- db
volumes:
- ./:/docker_sample_app
environment:
DATABASE_USER: postgres
DATABASE_PASSWORD:
DATABASE_PORT: 5432
DATABASE_HOST: db
DB関連ファイルの修正
DBをPosgreSQLに変更
これは、過去の記事にまとめているので参照して頂ければと思います。
madogiwa0124.hatenablog.com
DB設定をDB用のコンテナに合わせて変更
DockerコンテナでDBを構築するにあたって、DBの参照の仕方等を少し工夫する必要があるためにdatabase.yml
ファイルを編集します。
default: &default
adapter: postgresql
encoding: unicode
timeout: 5000
port: <%= ENV.fetch('DATABASE_PORT') { 5432 } %>
host: <%= ENV.fetch('DATABASE_HOST') { 'localhost' } %>
username: <%= ENV.fetch('DATABASE_USER') { 'root' } %>
password: <%= ENV.fetch('DATABASE_PASSWORD') { 'password' } %>
pool: <%= ENV.fetch('RAILS_MAX_THREADS') { 5 } %>
development:
<<: *default
database: docker_sample_app_development
test:
<<: *default
database: docker_sample_app_test
production:
<<: *default
database: docker_sample_app_production
username: docker_sample_app
password: <%= ENV['appname_DATABASE_PASSWORD'] %>
Dockerコンテナの起動
では実際にDocker上に環境を構築していきます。
流れとしては、下記のような形になります。
1. Web用のコンテナとDB用のコンテナを構築
2. DBを作成
3. マイグレーションの実行
4. Dockerコンテナの起動
# Dockerイメージの取得等の初期化処理
$ docker-compose build
# DBの作成とマイグレーションの実行
$ docker-compose run web rake db:create
$ docker-compose run web rake db:migrate
# Web、DB用のコンテナの起動
$ docker-compose up
localhost:3000
にブラウザから接続するとRailsのスタートページが見えました!
Herokuにデプロイ
最後にHerokuにデプロイしてみようと思います。
HerokuへのデプロイはDockerを使わない環境と特に変わりません。
今回は、scaffold
でUser
モデルを作成後、Herokuへデプロイしてみました。
$ rails generate scaffold user name:string age:integer
$ git add -A
$ git commit -m "scaffold user model"
$ git push heroku master
$ heroku run db:migrate
$ heroku open
無事にherokuにデプロイできました!
https://rails-docker-sample-app.herokuapp.com/users
おわりに
まだまだDockerのことは理解出来ていない部分が多いですが、なんとかネットの情報を元に環境と立ててデプロイすることが出来ましたφ(..)
Dockerだと失敗しても潰して、もう一回ということが簡単に出来るので、仮想環境の構築よりもストレスは大分少ないんじゃないかなぁと思います…!
Dockerは色々書籍も出ているので、色々と勉強してみようと思いました。
オススメの書籍等あれば、教えてくださいφ(..)
参考
tech.recruit-mp.co.jp
qiita.com