いけすの技術メモ

趣味開発etc.用の自己満ブログです

MENU

Docker Composeを用いてRailsの開発環境を構築する

目的

Docker Composeを用いてRailsの開発環境を構築する

Docker Composeとは

複数のコンテナをまとめて操作できる。

 Docker Composeの基本操作

# イメージのビルド
$ docker-compose build

# コンテナの作成と起動(-d でバックグラウンドで実行)
$ docker-compose up -d
 
# コンテナの停止・削除
$ docker-compose down

# コンテナの一覧を表示
$ docker-compose ps 

# ログを表示
$ docker-compose logs

# コマンドを作成してコマンドを実行
$ docker-compose build 

# 起動中のコンテナに対してコマンドを実行
$ docker-compose build

ディレクトリ構成(初期)

.
├── Dockerfile
├── docker-compose.yml
└── src
   └── Gemfile

Dockerfile

RailsではyarnやらNode.jsといったJavaScript関連のライブラリが必要なのでこれらもインストールしておく必要がある。

FROM ruby:3.0

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
&& apt-get update -qq \
&& apt-get install -y nodejs yarn
WORKDIR /app
COPY ./src /app
RUN bundle config --local set path 'vendor/bundle' \
&& bundle install

Gemfile

Railsを実行すると書き換わるが、Railsの実行に利用したいので以下のように記載。

source 'https://rubygems.org'

gem 'rails', '~> 6.1.3'

 docker-compose.yml

 db:

データベースにはMySQL8.0を利用。

MySQL8.0からは認証形式の変更でcommand: --default-authentication-plugin=mysql_native_passwordと記載しないとうまく通らないらしい。

volumesでローカルとコンテナ内のディレクトリをマウントできる。

今回は、MySQLのコンテナ内で建ててるので、コンテナを作り直した際にもデータが残るようにvolumesの指定は必須。(ただし、DBはコンテナ内で建てるべきでないという思想を耳にするので、将来的にアプリケーションを作る際にはAWSのRDS等を利用したいところ。)


web:

build: .と記載することでカレントディレクトリ内のDockerfileを参照にするということを表している。

depends_on: - dbとすることで、MySQLIPアドレスを指定する手間がなくなるらしい。

 

version: '3'
services:
db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
volumes:
- ./src/db/mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: password
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- ./src:/app
ports:
- "3000:3000"
environment:
RAILS_ENV: development
depends_on:
- db

 

 

初期設定

Railsの雛形を作成する。

$ docker-compose run web rails new . --force --database=mysql

新しくGemfileuが更新されたので、イメージをbuildし直す。

$ docker-compose build

データベースの設定する

src/config/database.ymlを編集する。 default:password:host:docker-compose.ymlで指定した値に変更、追記する。

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db

development:
  <<: *default
  database: app_development

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: app_test

production:
  <<: *default
  database: app_production
  username: app
  password: <%= ENV['APP_DATABASE_PASSWORD'] %>

データベースのを作成する

$ docker-compose run web rails db:create
Creating rails_app_web_run ... done
Created database 'app_development'
Created database 'app_test'

docker を起動する。

$ docker-compose up

http://localhost:3000/にアクセスすると・・・

f:id:IKDrocket:20210322012538p:plain

おなじみのYay! You’re on Rails!をDocker Composeを用いて表示できた!!

補足

# コンテナ内のrails環境下にアクセスする
$ docker-compose exec web /bin/bash

まとめ

ついにRails環境をDocker Composeを用いて、構築できた。
今回も以下の動画を参考にした。(ありがとうございました)

www.youtube.com