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
とすることで、MySQLのIPアドレスを指定する手間がなくなるらしい。
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/
にアクセスすると・・・
おなじみのYay! You’re on Rails!
をDocker Composeを用いて表示できた!!
補足
# コンテナ内のrails環境下にアクセスする $ docker-compose exec web /bin/bash
まとめ
ついにRails環境をDocker Composeを用いて、構築できた。
今回も以下の動画を参考にした。(ありがとうございました)