Ruby on railsのDockerイメージ作成

## 概要
Ruby on railsのローカル環境をDockerで構成してみようとやってみたことをメモします。

## ミドルウェアの構成

* Ruby 2.5 (Ruby on rails 5.2)
* MySql 5.7

## Dockerイメージ作成 (Ruby on Rails)
### ファイル構成
ファイルの構成は以下のようになります。

```:ファイル構造
opt
 ├ .gitignore
 ├ database.yml
 ├ docker-compose.yml
 ├ Dockerfile           ・・・ railsのイメージを作成するDockerfile 
 ├ Gemfile              ・・・ bundle installでインストールするライブラリの定義ファイル
 └ README.md
```

### Dockerfile作成
rubyのコンテナをビルドするDockerfileを作成します。

```Dockerfile:./docker/rails/Dockerfile
FROM ruby:2.5

ENV LANG C.UTF-8
ENV WORKSPACE=/usr/local/src

# install bundler.
RUN apt-get update && \
    apt-get install -y vim less && \
    apt-get install -y build-essential libpq-dev && \
    gem install bundler && \
    apt-get clean && \
    rm -r /var/lib/apt/lists/*

# create user and group.
RUN groupadd -r --gid 1000 rails && \
    useradd -m -r --uid 1000 --gid 1000 rails

# create directory.
RUN mkdir -p $WORKSPACE $BUNDLE_APP_CONFIG && \
    chown -R rails:rails $WORKSPACE && \
    chown -R rails:rails $BUNDLE_APP_CONFIG

USER rails
WORKDIR $WORKSPACE

# bundle install.
COPY --chown=rails:rails Gemfile $WORKSPACE/Gemfile
RUN bundle install && \
    bundle exec rails new . --force --database=mysql && \
    { \
        echo "gem 'therubyracer', platforms: :ruby"; \
    } >> $WORKSPACE/Gemfile && \
    bundle update
COPY --chown=rails:rails database.yml $WORKSPACE/config/database.yml

EXPOSE  3000
CMD ["rails", "server", "-b", "0.0.0.0"]
```

### Gemfile作成
bundle installで使うGemfileを作成します。

```ruby:Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 5.2.0'
```
### database.yml作成
railsのデータベース設定ファイルを追加します。

```yml:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  database: <%= ENV['APP_DATABASE'] %>
  username: <%= ENV['APP_DATABASE_USER'] %>
  password: <%= ENV['APP_DATABASE_PASSWORD'] %>

development:
  <<: *default
  host: mysql

test:
  <<: *default
  host: mysql

production:
  <<: *default
  host: mysql
```

### docker-compose.yml作成
下記の内容にて、mysqlとrubyのコンテナを作成する。

```yml:docker-compose.yml
version: '2'
services:
  rails:
    build: .
    image: my/rails
    container_name: 'rails'
    tty: true
    ports:
      - "80:3000"
    environment:
      APP_DATABASE: 'example'
      APP_DATABASE_USER: 'app'
      APP_DATABASE_PASSWORD: 'development'
    volumes:
      - app-data:/usr/src/app
    depends_on:
      - mysql

  mysql:
    image: mysql:5.7
    container_name: 'mysql'
    environment:
      MYSQL_ROOT_PASSWORD: 'mysql'
      MYSQL_DATABASE: 'example'
      MYSQL_USER: 'app'
      MYSQL_PASSWORD: 'development'
    ports:
      - '3306:3306'
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  app-data:
     driver: local
  mysql-data:
    driver: local
```

### コンテナ構築
下記コマンドにて各コンテナを構築します。

```sh:ターミナル
$ docker-compose build
```

### サーバ起動
下記のコマンドにてサーバを起動する。

```
$ docker-compose up -d
```

dockerで3000ポートを80ポートに接続しているので、ブラウザで下記URLにアクセスしてみる。

```:ブラウザ
http://192.168.99.100/
```

※ ここ記事では、Docker Toolboxの仮想環境を使用しています。
※ 192.168.99.100のIPの部分は、各環境に合わせて変更ください。

![rails.png](https://qiita-image-store.s3.amazonaws.com/0/142279/37edfa9a-1cdc-e5d2-6118-cc687846e700.png)

## 実際に開発する場合
このままだと、railsのコードがrailsコンテナ内にあり、エディタやIDEで編集し難い。
そのため、もう少しやり方を考える必要がありそう...

下記で再度構築してみたので、追記しておきます。
※ [Ruby on railsのDockerイメージ作成(再)](https://qiita.com/reflet/items/f73cac406760ee4ecc13) - 2018/11/13作成

以上

## 参考サイト
* [docker-compose で Rails の開発環境を作る](https://qiita.com/skyriser/items/2cf98b747ed6577cc5ee)
* [Docker Compose でローカルの Rails 開発環境を作る](https://qiita.com/kbaba1001/items/39f81156589dd9a0d678)
* [Docker Compose を使って Sinatra と Redis コンテナを 1 コマンドで立ち上げる](https://qiita.com/spesnova/items/40b49b9faa5faa1f98bf)
* [rails serverコマンドでエラー発生](http://pcl.solima.net/archives/428)
* [小学生でもわかるRuby on Rails入門](https://openbook4.me/projects/92)
* [Rails5でmodelやcontrollerの修正が反映されないやつ](https://qiita.com/uenoryo/items/5dd69436e9f5af6a752e)
* [Railsアプリケーション開発を完全にDocker化する](http://tech.degica.com/ja/2016/06/14/dockerized-rails-development/)
* [Dockerでホストとコンテナ間でのファイルコピー](https://qiita.com/gologo13/items/7e4e404af80377b48fd5)

以上