以前技術書を参考にアプリ開発をした時に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)
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の作成
こちらも簡単な説明はコメントアウトをご覧ください。
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と書いていたのですが、本番環境デプロイ時にエラーがでました・・・
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
セッティングおしまい!
動かしてみましょう!
# 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を打ち込むと、アプリケーションが立ち上がるはず・・です