Ruby on Rails ✕ Docker✕MySQL開発中のアプリにDockerとdocker-composeを導入


# はじめに

はじめてのDocker導入だと、何から手を付けたら良いのかわからない、ということがよくありますが、まさに自分がそれでした...

本記事では開発途中・完成したRailsアプリケーション(DB: MySQL)にDockerを導入する方法・流れを解説していきます。
参考までに自分は6時間位かけてローカルに導入できました。その苦労を忘れないようにしっかりアウトプットしていこうと思います(笑)
間違っていたら指摘してくださると幸いです!

# Dockerの導入

## 1)Dockerのインストール

まずMacにDockerのアプリをインストールしてください
それに関しては以下の記事がわかりやすいです!
[DockerをMacにインストールする](https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)

インストールできたら**ターミナル**で以下コマンドを実行しましょう!

```ruby:ターミナル
~ % docker run -d -p 80:80 docker/getting-started
```

## 2)インストールの確認

```ruby:ターミナル
~ % docker -v
```

以下のように出力されたらインストール成功です。
`Docker version 20.10.0, build 7287ab3`


```ruby:ターミナル
~ % docker-compose -v
```

こちらも同じように`docker-compose version 1.27.4, build 40524192`と出力されたら成功です。


## 3)開発中・完成済みのアプリでDockerファイルの作成

次にDockerを導入するためにDockerファイルを作成し、設定を記述していきます。
テキストエディタでも可能ですが、自分の場合はターミナルから入力して方がエラーもなくスムーズだったため、そちらの方法を記載していきます。

### ①Dockerfileの作成

まずアプリの**ルートディレクトリ**にDockerfileを作成して、記述していきます。
ルートディレクトリというのは以下の図のようにアプリ直下のディレクトリを表します。

```
dock_app ----|-- app
            |-- bin
            |-- config
            |-- db
            ・・・・・・
　　　　　　　・・・・・・
            |-- Gemfile
            |-- Gemfile.lock
            |-- package.json
            |-- Rakefile
            |-- README.md
            |-- Dockerfile  ←「Dockerfile]
            |-- docker-compose.yml　 ←[docker-compose.yml]
```


手順としては以下の順に進んでいきます。

```ruby:ターミナル
① ~ % cd Dockerを導入したいアプリのパス

② アプリ名 % vi Dockerfile
 #ファイルを開いたら「i」でインサートモードにして以下記述
FROM ruby:2.6.5 #アプリのRubyバージョン
  
RUN apt-get update -qq && \
    apt-get install -y build-essential \
                       libpq-dev \
                       nodejs

RUN mkdir /アプリ名
WORKDIR /アプリ名

ADD ./Gemfile /アプリ名/Gemfile
ADD ./Gemfile.lock /アプリ名/Gemfile.lock

RUN gem install bundler #bundlerをインストールしないとエラーが出る
RUN bundle install
ADD . /アプリ名

 #記述ができたら「escキー」を押して「:wq」で保存
```

### ②docker-compose.ymlファイルの作成

```ruby:ターミナル
① アプリ名 % vi docker-compose.yml

② docker-compose.ymlに以下記述

 #「i」と入力しインサートモードで記述

version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 'password' # このままpasswordとしても問題なく動く
    ports:
      - "4306:3306" #DockerコンテナとSequelpro接続の為に必要な設定

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/アプリ名
    ports:
      - "3000:3000"
    depends_on:
      - db
 #記述が終了したら「escキー」を押して「:wq」で保存
```

### 4)config/database.ymlファイルの編集

```ruby:(テキストエディタ)

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password　# passwordの設定がなければ、このままで良い
  socket: /tmp/mysql.sock
  host: db

development:
  <<: *default
  database: アプリ名_development

```

追加されたのは`password: password`と`host: db`の２つのみ。

### 5)docker-compose buildでコンテナ作成

```ruby:ターミナル
アプリ名 ~ % docker-compose build
```

上記コマンドを実行してコンテナを作成しましょう。※時間がかかることがあります

以下のように出力されれば成功です。

```ruby:ターミナル
Removing intermediate container dac250609513
 ---> f0ba8d685e44
Step 9/9 : ADD . /アプリ名
 ---> f50cb7681119

Successfully built f50cb7681119
Successfully tagged アプリ名_web:latest
```

ちなみに初心者の方だとコマンド実行中に赤字で`debconf: delaying package configuration, since apt-utils is not installed`と表示されますが、自分の調べた範囲では特に気にするようなこともない？出力のようです。


### 6)コンテナ上でDB作成・migrationの実行

コンテナが作成できたらコンテナ上でDBを作成していきます。

```ruby:ターミナル
アプリ名  % docker-compose run web bundle exec rake db:create
```

**Rails6**だとこのコマンドを実行すると

```
========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================


To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).
```

このように出力されることがあります。
このように出力されたら、エラー分通り`config/webpacker.ymlファイル`の記述を以下のように編集しましょう。

```ruby:webpacker.yml

# Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
  check_yarn_integrity: true

 # check_yarn_integrity: true を falseに変えましょう　→　check_yarn_integrity: false
```

これでエラーは解決できると思うので、記述を変更したら、**もう1度DB作成のコマンド**を実行しましょう。

```ruby:ターミナル
Created database 'アプリ名_development'
Created database 'アプリ名_test'

#上記のようにcreatingがcreated...doneとなったら成功
```

続いてmigrationを実行しましょう。

```ruby:ターミナル
アプリ名  % docker-compose run web bundle exec rake db:migrate


== 20201222010929 Createテーブル名: migrating ====================================
-- create_table(:テーブル名)
   -> 0.0095s
== 20201222010929 Createテーブル名: migrated (0.0096s) ===========================

# 上記のようにrails db:migrateを実行したときのようにマイグレーションが実行されれば成功です
```

### 7)コンテナの起動

最後にコンテナを起動して無事、アプリがブラウザで表示されるか確認しましょう。

コンテナの起動コマンドを実行しましょう。

```ruby:ターミナル
アプリ名 % docker-compose up 

# 起動していれば以下の様の出力が出る

db_1   | 2020-12-27T06:45:52.494912Z 0 [Note] Event Scheduler: Loaded 0 events
db_1   | 2020-12-27T06:45:52.497330Z 0 [Note] InnoDB: Buffer pool(s) load completed at 201227  6:45:52
db_1   | 2020-12-27T06:45:52.497669Z 0 [Note] mysqld: ready for connections.
db_1   | Version: '5.7.32'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
web_1  | => Booting Puma
web_1  | => Rails 6.0.3.4 application starting in development 
web_1  | => Run `rails server --help` for more startup options
web_1  | Puma starting in single mode...
web_1  | * Version 3.12.6 (ruby 2.6.5-p114), codename: Llamas in Pajamas
web_1  | * Min threads: 5, max threads: 5
web_1  | * Environment: development
web_1  | * Listening on tcp://0.0.0.0:3000
web_1  | Use Ctrl-C to stop
```

コマンドを実行し、サーバーが起動したらローカル環境にアクセスしてみましょう
[http://localhost:3000/](http://localhost:3000/)
無事に表示・挙動が確認できれば開発環境にDockerを導入できたということになります。

自分はこれだけで6時間くらいかかったので、ぜひ皆さんは本記事を活用して、さくさく進めていってください！！

### 8)Docker環境（開発環境）のRailsアプリとSequelProを接続する

最後にDBを接続しましょう！

以下の設定ページを開いて**標準**を選択します。

![se.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/879778/ac215c5b-3d71-1b92-dbdb-f5b24c5b145c.png)

設定ページに以下を記述

![eee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/879778/1029e2ed-ee83-bd83-d773-7596cad06bf1.png)

「名前」　→　任意のものを設定
「ホスト」　→　「127.0.0.1」
「ユーザー名・パスワード」 →　ymlファイルで記述したものに合わせる
「ポート」　→　「4306」

以上を設定して「接続」するとSequelPro内で該当アプリのDBが作成されているはずです。

また、ボート番号は`docker-compose.yml`の`ports:`の記述と合わせています。

以上でDockerとdocker-composeの開発環境への導入は終了です。
ちなみに僕はここまで６時間前後かかったので、ぜひ参考にしてさくさく進めていってください。

## 本記文献

①[『さわって学ぶクラウドインフラ　docker基礎からのコンテナ構築』](https://www.amazon.co.jp/%E3%81%95%E3%82%8F%E3%81%A3%E3%81%A6%E5%AD%A6%E3%81%B6%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9-docker%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E6%A7%8B%E7%AF%89-%E5%A4%A7%E6%BE%A4-%E6%96%87%E5%AD%9D-ebook/dp/B089VZXX63)
② [既存のrails6のアプリにMySQLでDockerを導入する。](https://qiita.com/momokan928/items/d560fff3855fcbe0b811)
③ [Ruby on Rails 「途中まで作ったアプリにDockerを導入したい」に挑戦してみる（MySQL / Sequel Pro)](https://qiita.com/majorboy/items/9fbfc78fc7bbc1f35e77)