はじめに
開発中の Rails プロジェクトに対して Dokcer を導入する方法をまとめました。
具体的には、WEBコンテナ(Railsアプリ)とDBコンテナ(MySQL)を別々に作成して、docker-compose で一括して管理する方法を用いています。
既に同様の記事が多々ありますが、うまくいかなかったところの記述を変更してまとめています。
一例としてこのような書き方でも導入できるんだなぁと思っていただければと思います。
この記事の対象
- Rails についてある程度の知識がある方
- Docker、docker-compose についてある程度の知識がある方
- 他の記事を見て導入できなくて、別の一例を見てみたい方
Dockerfile, docker-compose.yml 作成
まずは、開発中のRailsプロジェクトにDockerfile
とdocker-compose.yml
を作成します。
$ touch Dockerfile
$ touch docker-compose.yml
Dockerfile 内容
WEB コンテナ(Rails アプリケーション)の環境を構築するためのファイルです。
基本的な形は以下になるかなと思います。
プロジェクトで必要なライブラリやツールがあれば追加でインストールしてください。
# ruby バージョン指定
FROM ruby:2.6.5
RUN mkdir /app
WORKDIR /app
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 mariadb-client --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
# bundler バージョン指定
ENV BUNDLER_VERSION 2.1.4
RUN gem install bundler
RUN bundle install
ADD . /app
docker-compose.yml 内容
WEB コンテナ と DB コンテナ をそれぞれ作成して、一括で管理するための設定となります。
参考にさせていただいたサイトのまま実行しても自分の環境ではうまくいかないことがあったので、中身を変えております。
version: '3'
services:
# database.yml の host で指定した名前と一致させること
db:
image: mysql:5.7
volumes:
# dbコンテナが停止しても、データを保持するようにする
- ./tmp/volumes/db:/var/lib/mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
# Dockerfile で構築するイメージを web という名前で扱う
web:
build:
context: .
dockerfile: Dockerfile
# 一度サーバーが起動すると起動し続けるので、rm -f /app/tmp/pids/server.pidで、dockerが起動する度に一旦停止させる
command: /bin/sh -c "rm -f /app/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
tty: true
stdin_open: true
depends_on:
# 依存関係 - dbコンテナ作成後、web実行
- db
ports:
- "3000:3000"
volumes:
# ソースコード変更したらDocker側も即反映されるように
- .:/app
database.yml
上記で作成したdocker-compose.yml
の DB コンテナの設定に合わせて、database.yml
を修正していきます。
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password
socket: /tmp/mysql.sock
development:
<<: *default
database: docker_development
username: root
password: password
host: db
port: 3306
test:
<<: *default
database: docker_test
username: root
password: password
host: db
port: 3306
# 本番環境はご自身の設定に合わせてください
production:
<<: *default
実行
上記でコードの準備はできたので、以下のコードで実行していきます。
# Docker image 作成
$ docker-compose build
# DB 作成・マイグレーション
$ docker-compose run web rails db:create
$ docker-compose run web rails db:migrate
# docker-compose.yml に記述したコンテナを起動 (今回は WEB と DB)
$ docker-compose up
まとめ
ほぼ自分用の記事になってしまいましたが、少しでも他の方の役に立てばなと思います。
それにしても docker 便利すぎる。。
参考
以下のサイトを参考にさせていただきました。ありがとうございました。
- 【Docker】作成中Railsプロジェクトで開発環境構築
- 既存のRailsアプリにDockerを導入する手順