既存のRailsアプリにDockerを導入する手順

既存のRailsアプリについてDockerの開発環境を構築する手順について書きます。独学で試行錯誤しながらやりましたので、誤っているところなどあるもしれませんが、その際はご指摘いただけると幸いです。

# 2020/01/29追記

Rails6のアプリケーションをDocker化して、CIもかませるところまで含めた記事書きましたので、良かったら合わせてご覧ください。

[既存のRails6アプリをDocker化しつつCircleCIでシステムスペックも実行できる環境を作る](https://qiita.com/kenzoukenzou104809/items/e3d970b59bf106cab19e)

# 事前準備

- [Docker-for-macをインストール](https://docs.docker.com/docker-for-mac/)
- Dockerを起動させておく

詳しくは[DockerでRuby on Railsの開発をしよう](https://qiita.com/saitoeku3/items/b1aa2ae143624e551aea)が分かりやすいかと思います。

# 既存アプリにDockerで環境構築
![untitled_—_tweet_app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348703/f79a6878-6066-ba72-fb37-26ac915334e5.jpeg)
すでにアプリが作成されているところにDockerで環境を作っていきます。

以下の作業を行います。

- Dockerfile：新規作成
- docker-compose.yml：新規作成
- database.yml：編集

![untitled_—_tweet_app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348703/545ee015-3f76-99d8-f690-8645421c62ce.jpeg)
⬆︎Docker関連のファイル配置場所


##  Dockerfile作成

```ruby:Dockerfile
FROM ruby:2.5
RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y postgresql-client --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

WORKDIR /myproject

ADD Gemfile /myproject/Gemfile
ADD Gemfile.lock /myproject/Gemfile.lock

RUN gem install bundler
RUN bundle install

ADD . /myproject
```

上記ファイルについては、[こちらの記事](https://qiita.com/kkyouhei/items/653760627bf9d4bc9e71)を参考にさせていただきました。

当初はMySQLを使用して作ろうかと考えていたのですが、エラーが出まくってしまい萎えそうだったので、Postgresqlを使用する方向に変更しました。

Dockerfileで指定するバージョンは、プロジェクトのRubyバージョンに合わせておく必要があります。

```ruby:Gemfile
ruby '2.5.5'
```

## docker-compose.yml作成

```yml:docker-compose.yml
#docker-composeのバージョン
version: '3'
services:
  db:
    image: postgres
    ports:
      - '5432:5432' # ホストからゲストへポートフォワード
    volumes:
      - postgresql-data:/var/lib/postgresql/data
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    tty: true
    stdin_open: true
    depends_on:
      - db # DB側のコンテナが出来上がってからwebを実行する
    ports:
      - "3000:3000" # ホストからゲストへポートフォワード
    volumes:
      - .:/myproject # ソースコード変更したらDocker側も即反映されるように
volumes:
  postgresql-data:
    driver: local
```

上記ファイルについては[DockerでRailsの環境構築してHerokuへデプロイする](https://qiita.com/fuku_tech/items/dc6b568f7f34df10cae7)を参考にさせていただきました。

## database.yml編集

```yml:database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password:
  pool: 5

development:
  <<: *default
  database: myproject_development

test:
  <<: *default
  database: myproject_test
```
初期のデフォルトでは`sqlite3`になっているところは`postgresql`に置き換えていきます。



```
$ docker-compose build
```

```
$ docker-compose run web rake db:create db:migrate
$ docker-compose up
```

これで localhost:3000 にアクセスしたら確認できます。


## 参考にさせていただいた記事

- [DockerでRuby on Railsの開発をしよう](https://qiita.com/saitoeku3/items/b1aa2ae143624e551aea)
- [DockerでRailsの環境構築してHerokuへデプロイする](https://qiita.com/fuku_tech/items/dc6b568f7f34df10cae7)
- [既存のrailsプロジェクトをDockerで開発する手順](https://qiita.com/kkyouhei/items/653760627bf9d4bc9e71)