Docker+rails5+mysql5.7 環境構築

## Docker+rails+mysql 環境構築

Docker Composeを用いてrails+mysqlの環境構築をメモ。基本はDocker ComposeのQuickstartを参考にしている。
[https://docs.docker.com/compose/rails/](https://docs.docker.com/compose/rails/)
以降の構築作業はmyappディレクトリ配下での作業とする。

## Dockerfile
Dockerfile作成

```shell-session:Dockerfile
FROM ruby:2.3.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
```

## Gemfile
Gemfile作成

```rb:Gemfile
source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.0.0'
```

Gemfile.lockを空で作成

## docker-compose.yml
docker-compose.yml作成

```yaml:docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
```

ここまでのファイル構成

```shell-session
myapp/
├── Dockerfile
├── Gemfile.lock
├── Gemfile
└── docker-compose.yml
```

## railsビルド
docker-compose runコマンドでrailsスケルトン作成

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

実行後のファイル構成

```shell-session
myapp/
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── README.md
├── Rakefile
├── app
│   ├── assets
│   │   ├── config
│   │   │   └── manifest.js
│   │   ├── images
│   │   ├── javascripts
│   │   │   ├── application.js
│   │   │   ├── cable.js
│   │   │   └── channels
│   │   └── stylesheets
│   │       └── application.css
│   ├── channels
│   │   └── application_cable
│   │       ├── channel.rb
│   │       └── connection.rb
│   ├── controllers
│   │   ├── application_controller.rb
│   │   └── concerns
│   ├── helpers
│   │   └── application_helper.rb
│   ├── jobs
│   │   └── application_job.rb
│   ├── mailers
│   │   └── application_mailer.rb
│   ├── models
│   │   ├── application_record.rb
│   │   └── concerns
│   └── views
│       └── layouts
│           ├── application.html.erb
│           ├── mailer.html.erb
│           └── mailer.text.erb
├── bin
│   ├── bundle
│   ├── rails
│   ├── rake
│   ├── setup
│   └── update
├── config
│   ├── application.rb
│   ├── boot.rb
│   ├── cable.yml
│   ├── database.yml
│   ├── environment.rb
│   ├── environments
│   │   ├── development.rb
│   │   ├── production.rb
│   │   └── test.rb
│   ├── initializers
│   │   ├── application_controller_renderer.rb
│   │   ├── assets.rb
│   │   ├── backtrace_silencers.rb
│   │   ├── cookies_serializer.rb
│   │   ├── filter_parameter_logging.rb
│   │   ├── inflections.rb
│   │   ├── mime_types.rb
│   │   ├── new_framework_defaults.rb
│   │   ├── session_store.rb
│   │   └── wrap_parameters.rb
│   ├── locales
│   │   └── en.yml
│   ├── puma.rb
│   ├── routes.rb
│   ├── secrets.yml
│   └── spring.rb
├── config.ru
├── db
│   └── seeds.rb
├── docker-compose.yml
├── lib
│   ├── assets
│   └── tasks
├── log
├── public
│   ├── 404.html
│   ├── 422.html
│   ├── 500.html
│   ├── apple-touch-icon-precomposed.png
│   ├── apple-touch-icon.png
│   ├── favicon.ico
│   └── robots.txt
├── test
│   ├── controllers
│   ├── fixtures
│   │   └── files
│   ├── helpers
│   ├── integration
│   ├── mailers
│   ├── models
│   └── test_helper.rb
├── tmp
│   └── cache
│       └── assets
└── vendor
    └── assets
        ├── javascripts
        └── stylesheets
```

## データベース設定ファイル修正
パスワード、hostを修正

```rb:config/database.yml
# 抜粋
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: root # docker-compose.ymlのMYSQL_ROOT_PASSWORD
  host: db       # docker-compose.ymlのサービス名

development:
  <<: *default
  database: myapp_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: myapp_test
```

## ビルド&起動
docker-composeのコマンドでビルド&起動

```shell-session
$ docker-compose build
$ docker-compose up
```

別ターミナルを立ちあげDBの作成

```shell-session
$ docker-compose run web rails db:create
```

http://localhost:3000/ にアクセスし、railsの画面が表示されれば成功

## おまけ
scaffoldも実行できる

```shell-session
# scaffold
$ docker-compose run web rails g scaffold users name:string
# マイグレーション
$ docker-compose run web rails db:migrate
```

http://localhost:3000/users にアクセスすると表示される

## 感想
簡単にrails環境が構築できるので便利