Dockerを使用して既存のRailsプロジェクト開発環境構築してみた（Rails+Mysql）

#はじめに
今回はタイトルにあるとおりDockerを使用したRails+Mysqlの開発環境構築をしたので記事にします。

###対象読者
既存のrailsプロジェクトの開発環境にdockerを利用したいかた。（今回はdbをMysqlとしています。）dockerはダウンロード済みとしています。

###参考
こちらの記事を参考にさせていただきました！
[既存のrailsプロジェクトをDockerで開発する手順](https://qiita.com/kkyouhei/items/653760627bf9d4bc9e71)
[既存のRailsアプリにDockerを導入する手順](https://qiita.com/kenzoukenzou104809/items/b9e716204e0cd0cea447)

###環境
Mac OS

```
docker -v
Docker version 19.03.8, build afacb8b

docker-compose -v
docker-compose version 1.25.4, build 8d51620a

```

#ファイル構成
既存プロジェクトの中にDockerfile,docker-compose.ymlを新たに作成して、database.yml内をdocker用に編集します。

```
testproject
└── test_app#既存プロジェクト
    ├── Dockerfile
    ├── docker-compose.yml
    ├── Gemfile
    ├── Gemfile.lock
    ├── config
         └──database.yml
```

#1.Dockerfileの作成
まずはじめにdockerファイルを作成します。既存のrailsプロジェクトのディレクトリに追加してください。（ファイル構成参照）

```dockerfile:Dockerfile
#既存のプロジェクトのrubyのバージョンを指定
FROM ruby:2.6.3 

#パッケージの取得
RUN apt-get update 
    && apt-get install -y --no-install-recommends\
    nodejs  \
    mariadb-client  \
    build-essential  \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
WORKDIR /myproject

COPY Gemfile /myproject/Gemfile
COPY Gemfile.lock /myproject/Gemfile.lock

RUN gem install bundler
RUN bundle install

#既存railsプロジェクトをコンテナ内にコピー
COPY . /myproject
```

各動作について

FROM:イメージの取得
RUN:コマンドの実行。パッケージインストールの為に主に使用。
railsで必要になる、nodejs,mysql,build-essentialをインストール。

```
apt-get update && apt-get install -y 
```
とすることで最新版のパッケージを取得しインストールする。

```
--no-install-recommends && rm -rf /var/lib/apt/lists/*
```
とすることで無駄なもののインストールとaptのインストール時のキャシュを削除。

WORKDIR:作業ディレクトリの指定。WORKDIR以下の命令を実施する場所を決める。
指定したディレクトリがない場合は作成するので「RUN　mkdir」は必要なし。

COPY：ホストマシンのファイルをコピーする。この場合はホストマシンのGemfile等をコピーする。

#2.docker-compose.ymlの作成
続いてdocker-compose.ymlを用意します。

```yml:docker-compose.yml
version: '3'

services:
  db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    ports: 
      - '3306:3306' # ホストからゲストへポートフォワード
    environment:
      MYSQL_DATABASE: docker_development
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: root#任意のユーザー名
      MYSQL_PASSWORD: password#任意のパスワード
      
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
　　 # pry-byebugを使えるようにする
    tty: true 
    stdin_open: true
    depends_on:
      - db # DB側のコンテナが出来上がってからwebを実行する
    ports:
      - "3000:3000" # ホストからゲストへポートフォワード
    volumes:
      - .:/myproject # ソースコード変更したらDocker側も即反映されるように
```

docker-composeにはMysqlとrails用コンテナを立ち上げる為の動作を記載しています。各動作の意味は
MySQL
image: 元となるmysqlのイメージを指定。
command: 文字コードをutf8に設定。
ports: ポートフォワードの設定
environment: datebase.ymlで使用する環境変数を設定。
build: rails用のイメージは先ほど作成したDcokerfileを利用。

web(rails)
build: 作成済みのDockerfileを元にコンテンなを作成。
context: . dockerfile:Dockerfileでファイルの読み込み先を指定。
command: railsサーバー起動
tty: stdin_open: コンテナでbyebugを使用できる用にする。
depends_on: コンテナの立ち上げ順と依存関係を指定。dbコンテナが立ち上がってからwebコンテナが立ち上がるようにする。
volumes:データの永続化の為に使用。ホスト側でソースコードを変更してもコンテナがホスト側を参照しているので変更が反映される。

#3.datebase.ymlの設定
既存railsのファイルをdockerコンテナのmysqlにつなげるように設定します。

```yml.config/datebase.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root#docker-composeに記載したユーザー名
  password: password#docker-composeに記載したパスワード

development:
  <<: *default
  host: db
  database: docker_development#docker-composeに記載したデータベース名
```

#4.コンテナの立ち上げよう！！
既存プロジェクトのディレクトリまで移動して下記コマンドを実行してください。

```
cd test_app
#imageの作成
docker-compose build 
#コンテナの立上げ
dokcer-compose up -d
#コンテナ内で
docker-compose exec web bundle exec rails db:migrate
```

これでhttp://localhost:3000にアクセスすればページが表示されます。

###最後に
ここまでお読みいただきありがとうございます。間違い等あればコメントお願いします。
よく使うコマンド等はこちらを参考にしてます。
[docker-compose コマンドまとめ](https://qiita.com/wasanx25/items/d47caf37b79e855af95f#run)
それではありがとうございました。