ritarock’s blog

プログラミングとか映画とか趣味とか

docker-composeでrailsとmysqlを使う

ディレクトリ構成

./
├── Dockerfile
├── docker-compose.yml
├── db_volume/
├── mysql-confd/
│   └── default_authentication.cnf
└── src/
    ├── Gemfile
    └── Gemfile.lock

ファイルの説明

Dockerfile

railsのアプリ用のDockerfileを定義する
mysqlと連携するためにmysql-clientをインストールしている

FROM ruby:latest

RUN apt-get update -qq && \
    apt-get install -y build-essential && \
    apt-get install -y libpq-dev && \
    apt-get install -y mysql-client && \
    apt-get install -y nodejs

RUN mkdir /myapp
ENV APP_ROOT /myapp
WORKDIR $APP_ROOT
ADD ./src/Gemfile $APP_ROOT/Gemfile
ADD ./src/Gemfile.lock $APP_ROOT/Gemfile.lock

RUN bundle install
ADD ./src/ $APP_ROOT

docker-compose

mysqlのバージョンが8以上だと認証でエラーになるので設定ファイルをにマウントする
参考
また
./db_volume:/var/lib/mysqlでDBを永続化している

version: '3'
services:
  db:
    image: mysql:latest
    volumes:
      - ./mysql-confd:/etc/mysql/conf.d
      - ./db_volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: root
    ports:
      - "3306:3306"

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - ./src:/myapp
    ports:
      - "3000:3000"
    links:
      - db

default_authentication.cnf

認証用の設定ファイル

[mysqld]
default_authentication_plugin= mysql_native_password

Gemfile

source 'https://rubygems.org'
gem 'rails', '5.1.6'

Gemfile.lockも作成しておく(中身は空)

$ touch ./src/Gemfile.lock

プロジェクトの構築

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

--skip-bundleでgemのインストールを回避
実行後 ./src 配下に新しいアプリケーションが作成されている

データベースに接続

./src/config/database.ymlを
password部分とhostをdocker-composeで定義した内容に変更

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

dockerの起動

ビルド

$ docker-compose build

起動

$ docker-compose up

DBの作成

$ docker-compose run web rails db:create

確認

ブラウザでlocalhost:3000にアクセス

railsのコンテナにアクセスしてDBとの接続確認

$ docker exec -it コンテナID /bin/bash

接続したコンテナからDBに接続

$ rails dbconsole