LoginSignup
36
41

More than 1 year has passed since last update.

【Docker】作成中Railsプロジェクトで開発環境構築

Last updated at Posted at 2019-10-28

以前技術書を参考にアプリ開発をした時にDockerを少し触ったんだけど、今回は自分で作ったアプリケーションに導入してみたので簡単にまとめようかなと思います。

バージョン

  • Ruby(2.5.1)
  • Ruby on Rails(5.2.3)
  • MySQL(5.6)
  • Docker(19.03.4)
  • docker-compose(1.24.1)

参考にした記事、サイト

入門 Docker
既存のRailsアプリにDockerを導入する手順
DockerでRuby on Railsの開発をしよう

先人の方々には感謝しかないね・・・

手順

  • Dockerfileの作成(ruby及びrailsの環境を構築)
  • docker-compose.ymlの作成(mysqlとDockerfileで構築したrailsを連携させる)
  • database.ymlの編集(docker-composeと併せて編集が必要)

最終的なディレクトリ構造

みにくいかな?
Dockerfile及びdocker-composeはアプリケーションのルートディレクトリに配置。
database.ymlは初期位置です。(config/database.yml)

191028.png

Dockerfileの作成

こちらの記事を参考に作りましたが、オリジナルは公式に載っているようです。

簡単な説明はコメントアウトにかいておきます。

Dockerfile
# rubyのバージョンを指定(もともと2.5.1で開発していたのでこのバージョン)
FROM ruby:2.5.1

RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y mysql-client --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

# Docker内部でworkdirをどこに置くか、どういう名前にするかを決める記述
RUN mkdir /workdir
WORKDIR /workdir

# Docker内部でGemfile、Gemfile.lockをどこに配置するかを決める記述
ADD Gemfile /workdir/Gemfile
ADD Gemfile.lock /workdir/Gemfile.lock

# 注意!! Gemfile.lockにかいてあるbundlerバージョンが2.0.1以降だとエラーが出ます!
# 僕の場合はここで環境設定してあげれば通りました。
ENV BUNDLER_VERSION 2.0.2
RUN gem install bundler
RUN bundle install

ADD . /workdir

コメントアウトにも少しかいてますが、gemfileとバージョンを揃える必要があります。
また、bundlerは2.0.1以降だとエラーが出るようです。
僕の場合はENV BUNDLER_VERSION 2.0.2と記述してあげればエラーがなくなりました。
gem install bundlerとbundle installの前に書いてね!

docker-compose.ymlの作成

こちらも簡単な説明はコメントアウトをご覧ください。

docker-compose.yml
version: '3'
services:
  db: # database.ymlと対応したものを読み込みます
    image: mysql:5.6 # もともと5.6で動かしていたので
    environment:
      MYSQL_DATABASE: docker_development
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: root
      MYSQL_PASSWORD: password
    volumes:
      - ./mysql/mysql_data:/var/lib/mysql # データの永続化
    ports:
      - "4306:3306" # ホストからゲストへポートフォワード。sequelProと繋ぎたいので、3306ではなく4306をポートに指定
  web: # さっき書いたDockerfileをwebって名前で扱うよ、って感じです
    build:
      context: .
      dockerfile: Dockerfile
    # 一度サーバーが起動すると起動し続けるので、rm -f /workdir/tmp/pids/server.pidで、dockerが起動する度に一旦停止させる
    command: /bin/sh -c "rm -f /workdir/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    tty: true
    stdin_open: true
    depends_on:
      - db # DB側のコンテナが出来上がってからwebを実行する
    ports:
      - "3000:3000" # ホストからゲストへポートフォワード
    volumes:
      - .:/workdir # ソースコード変更したらDocker側も即反映されるように

config/database.ymlの編集

ちなみに今回は本番環境でDockerを使わない設定です。
おそらく、本番環境でDockerを使用したい場合はdefaultブロック、productionブロックあたりを編集しないといけないのですが、developmentブロックだけ編集しています。

ちなみに最初defaultブロックにhost: dbと書いていたのですが、本番環境デプロイ時にエラーがでました・・・:frowning2:

config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: 
  socket: /tmp/mysql.sock

# development環境だけ書き換えてます。
development:
  <<: *default
  database: my_new_gear_development
# ここから下はdocker-compose.ymlと対応させてください。
  username: root 
  password: password
  database: docker_development
  host: db

test:
  <<: *default
  database: my_new_gear_test

production:
  <<: *default
  database: my_new_gear_production
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock

セッティングおしまい!

動かしてみましょう!

bash
# Dockerのimageを作成する
docker-compose build

#DB create
docker-compose run web rake db:create

#DB migrate
docker-compose run web rails db:migrate

#rails server
docker-compose up

これでいつも通りURLにlocalhost:3000を打ち込むと、アプリケーションが立ち上がるはず・・です

続編

Dockerで構築したrailsイメージの軽量化

36
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
41