Rails6をDocker+MySQLで環境構築


# はじめに
この記事では11/22現在、DockerでRuby on Railsの環境を構築する方向けの内容です。完成したものはGithubにて[ソースコード](https://github.com/hikobend/docker_rails)を公開しています。

またDockerをインストールする手順は、

https://www.youtube.com/watch?v=LSQKHW01ACo&t=0s&ab_channel=%E3%81%A0%E3%82%8C%E3%81%A7%E3%82%82%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%2F%E5%B1%B1%E6%B5%A6%E6%B8%85%E9%80%8F

[上の動画](https://www.youtube.com/watch?v=LSQKHW01ACo&t=0s&ab_channel=%E3%81%A0%E3%82%8C%E3%81%A7%E3%82%82%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%2F%E5%B1%B1%E6%B5%A6%E6%B8%85%E9%80%8F)に従うことで構築することができると思います。

以下、ソースコードの多くは他の方のものを使っております。予めご了承ください。(参考文献は載せてあります。)

### 各種バージョン
下記のバージョンで作業を行いました。
・OS Windows11
・Ruby 2.7
・Ruby on Rails 6.1.4
・MySQL 8.0
・docker 20.10.10
・docker-compose 2.1.1
・Visual Studio Code 1.62.3
・Ubuntu 20.04 LTS

# 手順
1. Docker Engineの設定を変更
2. ファイルの作成
3. アプリを作成する
4. イメージをビルドする
5. データベースを接続する
6. コンテナを起動、停止する

## 1. Docker Engineの設定を変更
今回ここの設定が一番キーになると思います。
まずDocker Desktopを開いてください。右上に歯車マークをクリックし、Docker Engineを選択すると、コードを変更できます。

```
{
  "debug": false,
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "insecure-registries": [
    "docker.io"
  ],
  "registry-mirrors": []
}
```
上のコードを入力したら、右下にあるApply & Restartをクリックして変更を適応します。

## 2. ファイルの作成
今回追加するファイルは5つあります。ディレクトリに追加してください。
・Dockerfile
・docker-compose.yml
・Gemfile
・Gemfie.lock
・entrypoint.sh


それぞれの中身を以下のように変更してください。

#### Dockerfile

```dockerfile:dockerfile
FROM ruby:2.7
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 nodejs yarn \
    && mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

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

#### docker-compose.yml

```docker-compose.yml
version: '3'
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-data:/var/lib/mysql
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true
volumes:
  mysql-data:
    driver: local
```
※もしMacをお使いの方で、M1チップを搭載の方は  
db:
platform: linux/x86_64　　<-こちらを追記してください
image: mysql:8.0

 M1チップに対応のために必要になります。

#### Gemfile

```:Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 6.1.4'
```

#### Gemfile.lock

こちらには何も記入しなくて大丈夫です。

#### entrypoint.sh

```entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
```

以上でファイルの作成は終了です。
もしターミナルを起動していたら、一度ターミナルを落としておいたほうがいいかもしれません。

## 3. アプリを作成する
5つのファイルが作成できたら、ターミナルを起動しましょう。下記のコードを入力して、アプリを作成します。

```
$ docker-compose run web rails new . --force --no-deps --database=mysql
```



## 4. イメージをビルドする
上記の工程が完了しましたら、Gemfile が更新されているはずです。よって、イメージをビルドする必要があります。

```
$ docker-compose build
```

## 5. データベースと接続する
データベースと接続するためにconfig/database.yml を編集します。

```config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch("MYSQL_USERNAME", "root") %>
  password: <%= ENV.fetch("MYSQL_PASSWORD", "password") %>
  host: <%= ENV.fetch("MYSQL_HOST", "db") %>

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>
```

続いて、データベースを作成します。ターミナルで以下のコードを実行してください。

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


## 6. コンテナ起動、停止する
ターミナルにて、下記のコードを実行します。

```
$ docker-compose up
```

ブラウザを開いて
localhost:3000
にアクセスすると、下の画面と同じようになるはずです。
![スクリーンショット (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2148800/0eeb6c5d-ccda-611c-dc55-100c2775e952.png)

これで、Rails6をDocker+MySQLで環境構築が完了しました！！お疲れさまでした！！(長かったと思います..)
終了するときは,
Ctrl + C
もしくは、ターミナルにて下記のコードを実行します。

```
$ docker-compose down
```
そうすると、ダウンすることができます。

## 最後に
もし実行できない方がいらっしゃいましたら、完成したものはGithubにて[ソースコード](https://github.com/hikobend/docker_rails)を公開しておりますので、お手数おかけしますが、確認していただけると幸いです。

何度かDockerで環境構築しましたが、なかなかうまくいかず苦戦しました。そこで原因を洗い出し、Docker Engineの設定が足りないことに気づきました。(必ず同じ箇所でエラーが起きて、やっと気づきました。)

もし参考にしていただけると非常にうれしいです。手順のミスやタイピングミスなどありましたら、ご連絡ください。ここまでご覧いただき、誠にありがとうございました。今回Qiitaに初めて投稿をさせていだたき、記事を書く大変さを認識しました。

## 参考文献
・https://qiita.com/nsy_13/items/9fbc929f173984c30b5d
・https://zenn.dev/hiszuk/articles/cb30071df19a1b4f8365