docker for mac Rails環境構築

2017年3月24日

macでの開発環境といえば、Vargrant/直接railsパッケージを導入する方法が多いですが、ちょっとしたことを試したりしたい時に、
環境を簡単に作ったり・壊したりしたいなと思いDockerを導入しました。

今回は、Docker for macを既にインストール済みの状態から、Rails環境を構築するところまでやっていきたいと思います。

Docker for mac未インストールの方は、以下過去記事を参考にインストールしてください。
参考MacでDockerはじめました

スポンサーリンク

環境

・Mac
・Rails 5.0.1
・Ruby 2.4.0
・DB:mysql

環境構築の流れ

主に以下の内容について、コマンド単位で構築していきます。
・作業フォルダを作成し、dockerfile作成からimageを構築する。
・Railsプロジェクトの作成をする。
・dockerfileをdocker-compose.ymlで管理する。
・DB(mysql)周りもdocker-compose管理下にする。
・docker-composeコマンドで、Rails環境起動する。

環境を構築する

以下の手順で、コマンドラインから作業します。

// 作業ディレクトリ作成
$ mkdir <project_name>
$ cd <project_name>

// Ruby bundle init
$ docker pull ruby:2.4.0
$ docker run --rm -v "$PWD":<project_path> -w <project_path> ruby:2.4.0 bundle init

GemfileにRailsを設定

// Gemfile設定
$ vim Gemfile
#Gemfile
source "https://rubygems.org"
gem 'rails', ‘5.0.1'

// lockファイル作成
#Gemfile.lock
$ touch Gemfile.lock

Dockerfileを作成して、中身を設定

// Dockerfile作成
$ vim Dockerfile
#Dockerfile ~ 中身
FROM ruby:2.4.0

ENV APP_ROOT <project_path>/<project_name>

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

imageを作成して、railsプロジェクトを作成

// docker image作成
$ docker build -t <developer_name>/<project_name> .

// imageの確認
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<developer_name>/<project_name>      latest              XXXXXXX        4 seconds ago       790 MB

// rails new
$ docker run --rm -it -v "$PWD":<project_path>/<project_name> <developer_name>/<project_name> rails new . -BT

IPやポートの設定も追加

// アプリケーション用のツール類も設定
$ cat Dockerfile
FROM ruby:2.4.0

ENV APP_ROOT <project_path>/<project_name>

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

COPY . $APP_ROOT

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

image再作成し、mout

// Docker image再作成
$ docker build -t <developer_name>/<project_name> .

// image起動
$ docker run -d -p 3000:3000 <developer_name>/<project_name>

// moutしてimage起動
$ docker run -d -p 3000:3000 -v "$PWD":<project_path>/<project_name> <developer_name>/<project_name>

docker-compose化

// dockerfileをdocker-compose.ymlで管理
$ cat docker-compose.yml
version: '2'
services:
  app:
    build: .
    environment:
      RAILS_ENV: development
    ports:
      - '3000:3000'
    volumes:
      - .:<project_path>/<project_name>

ビルドしてデータベース系の設定

// ビルド
$ docker-compose build

// 起動
$ docker-compose up -d

// db設定 Gemfile mysqlを利用
#gem 'sqlite3'
gem 'mysql2'

// database.ymlの設定
$ vim config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  port: 3306
  pool: 5
  timeout: 5000
  url: <%= ENV['DATABASE_URL'] %>
development:
  <<: *default
  database: db_development

test:
  <<: *default
  database: db_test

production:
  <<: *default
  database: db_production

// docker-composeにmysqlを設定
$ cat docker-compose.yml 
version: '2'
services:
  app:
    build: .
    environment:
      RAILS_ENV: development
      DATABASE_URL: mysql2://root:pass@mysql:3306
      MYSQL_ROOT_PASSWORD: 'pass'
    ports:
      - '3000:3000'
    volumes:
      - .:/usr/src/<project_name>
    links:
      - mysql
  mysql:
    image: mysql:5.7.10
    environment:
      MYSQL_ROOT_PASSWORD: 'pass'
    ports:
      - '3306:3306'
    volumes:
      - mysql-data:/var/lib/mysql
volumes:
  mysql-data:
    driver: local

ビルドしてプロセスを確認

// ビルド
$ docker-compose build

// コンテナ裏で起動
$ docker-compose up -d

// プロセス確認
$ docker-compose ps
    Name           Command          State           Ports
-------------------------------------------------------------
vagrant_app_1       rails server -b 0.0.0.0    Up              0.0.0.0:3000->3000/tcp
vagrant_mysql_1     /entrypoint.sh mysqld   Up              0.0.0.0:3306- >3306/tcp

動作チェック

Macから以下のUrlにアクセスして、ブラウザから動作確認する。
http://0.0.0.0:3000/

表示されれば、構築完了です。

開発について

今回作成したRails環境は、ローカル環境とdockerコンテナ上のディレクトリをmountしているため、Atomなどでローカルで保存したコードを即座にブラウザで動作確認ができます。

また、docker-composeコマンドでRailsコマンドの実行もできます。

良く使うRailsコマンド

開発で良く使うコマンドをいくつか紹介します。

// DB作りたくなったら
$ docker-compose run --rm app rake db:create

// マイグレーションしたくなったら
$ docker-compose run --rm app rake db:migrate

// seed(テストデータ)実行したくなったら
$ docker-compose run --rm app rake db:seed

// コントローラー作成したくなったら(controller_name変更)
$ docker-compose run --rm app rails generate controller <controller_name>

// Model作成したくなったら(model_nameを変更、引数にname:stringとかでnameカラムを作る)
$ docker-compose run --rm app rails generate model model_name name:string

// ルーティング変更したくなったら(config/routes.rbを編集後実行)
$ docker-compose run --rm app rake routes

まとめ

今回のように一度環境を用意してしまえば、色々とRails環境での開発が容易になります。

DBも含まれているので、簡易ブログ・掲示板サイトなどを作成してみたり、Rails5.0.1で実装された「ActionCable」のお試しもすぐに可能です。

今後もDocker for macを使って、開発環境を充実していきたいと思います。


スポンサーリンク
PAGE TOP