Rails6［APIモード］+ MySQL5.7 を docker-compose で環境構築

#はじめに
自分用です
Rails6 APIモード + MySQL5.7 を Docker（docker compose） で環境構築

Dockerそのものの導入は省略

#はじめに環境構築に必要なファイルを作成

* 以下のファイルを作成する
    * アプリ用のトップレベルディレクトリ
        * Dockerfile
        * docker-compose.yml
        * Gemfile
        * Gemfile.lock


### アプリ用のトップレベルディレクトリ作成&移動

```bash
$ cd

$ mkdir sample_app

$ cd sample_app
```

<br>

### Dockerfile, docker-compose.yml, Gemfile, Gemfile.lock作成

```bash
sample_app$ touch {Dockerfile,docker-compose.yml,Gemfile,Gemfile.lock}

sample_app$ ls
Dockerfile docker-compose.yml Gemfile Gemfile.lock
```

<br>

# ファイルの中身書いていく

### sample_app/Dockerfileファイル

```yml:Dockerfile
FROM ruby:2.6.5

# 必要なパッケージのインストール（Rails6からWebpackerがいるので、yarnをインストールする）
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
		&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
		&& apt-get update -qq \
		&& apt-get install -y build-essential libpq-dev nodejs yarn

# 作業ディレクトリの作成
RUN mkdir /myapp
WORKDIR /myapp

# ホスト側（ローカル）（左側）のGemfileを、コンテナ側（右側）のGemfileへ追加
ADD ./Gemfile /myapp/Gemfile
ADD ./Gemfile.lock /myapp/Gemfile.lock

# Gemfileのbundle install
RUN bundle install
ADD . /myapp
```

<br>

### sample_app/docker-compose.yml

```yml:docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    ports:
    - "3306:3306"

  web:
    build: .
    command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3001 -b '0.0.0.0'"
    tty: true
    stdin_open: true
    depends_on:
      - db
    ports:
      - "3001:3001"
    volumes:
      - .:/myapp
```

<br>

### sample_app/Gemfile

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

gem 'rails', '~> 6.0.3'
```

<br>

### Gemfile.lockは空のまま

# docker-compose run コマンドで Rails アプリを作成

* APIモードなので`--api`オプション付与
* バージョン６以降なので、`--webpacker`オプション付与

```bash
$ docker-compose run web rails new . --force --database=mysql --skip-bundle --api --webpacker
```

<br>

# database.yml ファイルを修正

* sample_app/config/database.yml ファイルに、コンテナに作成されたDB情報を記述する

```yml:database.yml
default: &default
	adapter: mysql2
	encoding: utf8
	pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
	username: root
	password: password  # docker-compose.ymlの MYSQL_ROOT_PASSWORD
	host: db    # docker-compose.ymlの service名
```

<br>

# Dockerコンテナを起動する

* コンテナの実行

```bash
$ docker-compose build
```

<br>

* コンテナを起動
    * `-d` オプション付与でバックグラウンド実行をする。これを実行すると、コンテナを起動したままプロンプト画面へ戻る

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

<br>

# DBを作成する

* まだコンテナを起動していない場合はしておく

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

<br>

* コンテナID確認

```bash
$ docker ps -a
```

<br>

* 確認したIDより、コンテナに入る

```bash
$ docker exec -it <コンテナのID> /bin/bash
```

<br>

* DB作成

```bash
$ rails db:create
$ rails db:migrate
```

<br>

* コンテナから出る

```bash
$ exit
```

<br>

* コンテナに入らず、ローカルから実行する場合。コンテナ起動後に、`docker-compose run` コマンドを実行する

```bash
$ docker-compose run web rails db:create
$ docker-compose run web rails db:migrate
```

<br>

---

構築は以上。
`localhost:3001`で開くようになった。

---

<br>

# その他

### サーバーを止める場合

- Ctrl + C で止めないこと。コンテナが残って次回起動時にエラーが出る
    - もしやってしまった場合、tmp/pids/server.pid を削除して、再びdocker-compose upで再起動する

```bash
$ docker-compose down
```

<br>

### Dockerfileやdocker-compose.ymlの変更を反映、railsサーバー再起動

```bash
$ docker-compose up --build
```

<br>

### bundle install などのコマンドを実行したい場合

```bash
#  docker-compose run { サービス名 } { 任意のコマンド }
$ docker-compose run web bundle install
```

<br>

### ローカルからMySQLコンテナに接続

- コンテナ起動してない場合は起動

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

<br>

- mysqlのidを確認

```bash
$ docker ps
```

<br>

- MySQLコンテナにログイン

```bash
$ docker exec -it <MySQLのコンテナのID> /bin/bash
```

<br>

```bash
$ mysql -u root -p -h 0.0.0.0 -P 3306 --protocol=tcp

mysql>

// 脱出
mysql> quit
```

<br>

---

以上。

---
<br>

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

[丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac)](https://qiita.com/azul915/items/5b7063cbc80192343fc0)
[【Rails】Rails 6.0 x Docker x MySQLで環境構築](https://qiita.com/nsy_13/items/9fbc929f173984c30b5d)