Railsアプリ起動に最低限必要なDockerによる環境構築の仕方


# はじめに

### 目的
Dockerの環境構築をする中で最低限必要な実装でRailsアプリを起動することを目的とします。
またこの記事ではDockerでRails6に対応したRuby on Railsの環境構築を行うことも
可能としております。

### 自身のスキルレベル
Railsを半年程、Dockerを1ヶ月ほど触っています。
触るのは慣れてきたものの、理解が曖昧な部分もあるので、
不適切な表現などあった場合はぜひご指摘いただけるとありがたいです。

### 対象読者
「Railsを触ったけど、その後なにから取り掛かればいいか分からない」
「Dockerってよく聞くけど難しそうでどこから取り掛かればいいか分からない」
「Dockerを使ってとりあえず何か作ってみたい！」

という私と同じプログラミング初心者です。
私も以前よりDockerに関して難しいイメージを持っていたが、実際に取り組みそのイメージを払拭できたので
最低限の実装でまずは実装しアプリ起動させてみるといった方法で取り組もうと思います。

# 環境構築手順

## 1. 必要なフォルダ・ファイル作成の準備
### 1-1.作業フォルダの作成
まず、アプリを開発用の作業フォルダをmkdirで任意の場所に作成します
「work_space」という名前のフォルダを作成するとします。
※ファイル名は特に指定しません

cdコマンドで、作業フォルダへ移動しておきましょう。

```
$ cd work_space(＝作成したフォルダ名）
```
この作業フォルダの中に、rails, Dockerの環境構築に必要なファイルを保存していきます。
### 1-2.Dcokerfile 作成

1-1で作成したフォルダ内に、Dockerfileを作成します（以降のファイルも同様）。
このDockerfileに、Dockerイメージを構築するための手順を記載します。

Rubyのバージョンを最新の2.7.2(2020年12月時点)にて下記のように作成します。

```rb:Dockerfile
FROM ruby:2.7.2-alpine3.12

RUN apk update && apk upgrade && apk add build-base \
                                         curl \
                                         curl-dev \
                                         less \
                                         linux-headers \
                                         libc6-compat \
                                         libxml2-dev \
                                         libxslt-dev \
                                         mariadb-dev \
                                         pcre-dev \
                                         nodejs \
                                         ruby-dev \
                                         tzdata \
                                         yaml-dev \
                                         zlib-dev

RUN mkdir /app
WORKDIR /app

ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
RUN gem update bundler && bundle install

ADD . /app

EXPOSE 3000
CMD bundle exec rails s

```
中身を簡潔に説明します。
**[FROM]** 使用するイメージとバージョン
**[RUN]** コマンドの実行　Rails起動に必要なパッケージをインストールします
※各パッケージの説明は省略します。気になる方は調べてください。
**[WORKDIR]** 作業ディレクトリを設定
**[ADD]** コンテナ内に指定のファイルを追加する
**[EXPOSE]** コンテナがリッスンするport番号
**[CMD]** イメージ内部のソフトウェア実行（ここではRailsを指す）

### 1-3.Dockercompose 作成
docker-compose.ymlは、アプリケーションを構成する各サービスを記載し、一斉に実行するための元となるファイルです。
ここでは、「db（MYSQLを指定）」「web（アプリケーション、ポートなどを指定）」の2つを記載しています。

```rb:Dockecompose
version: '3'
services:
  app:
    build: .
    command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    ports:
      - 3000:3000
    depends_on:
      - db
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    ports:
      - 3306:3306
    volumes:
      - db-store:/var/lib/mysql
volumes:
  db-store:
```
**[version]** docker-composeのバージョンです。2020年12月現在、最新は'3'です。
**[services]** この下のハッシュにサービスを作りましょう。今回命名はappと
dbと名付けました。
**[image]** 使用するimage（dbでmysql5.7を指定しています）
**[environment]** コンテナ内での環境変数の設定
**[volumes]** ディレクトリのマウント設定（db永続化可能になります。）
**[build]** Dockerfileなどがあるパス（基本的にカレントディレクトリ）
**[command]** コマンド（server.pidファイルを削除してからrailsサーバー起動)
**[ports]** ポート番号。[ホスト：コンテナ]で設定。
**[depends_on]**　依存関係を示していて、起動順を指定できます。ここではdb→webへと起動します


### 1-4.Gemfile 作成

```rb 
gem 'rails', '~> 6'
```

インストールするRailsのバージョンを指定します。
ここではRails 6に対応するようにしています。
Gemfileの内容は、後でrails newをすると書き換えられます。

## 2. アプリ起動
### 2-1.rails new アプリ作成
先程作成した作業ディレクトリ配下にrails newで空アプリを作成します。

```rb 
rails new sample_app
```

先程作成したDocker fileとDocker composeファイルをrails アプリ配下に
移動させます。
最終的なフォルダ構成は、下記のようになっているはずです。

```
work_space
  sample_app
   .....
   - Dockerfile
   - Gemfile
   - docker-compose.yml
   .....
```

### 2-2 Gemfileの編集
先ほどのrails newにより、Gemfileが書き換わっています。
今回のデータベース接続はMYSQLの為、Gemfile内を編集します。

```
gem 'sqlite3'
```
↓

```
gem 'mysql2'
```
### 2-3.bundle install

先程編集したGemfileの内容を元にbundle installしていきます。
下記コマンドを実行すると、Dockerイメージををビルドする際にbundle installしてくれます。

```rb
$ docker-compose build
```
### 2-4.DB接続設定
Railsのconfig/database.ymlファイルを、下記のように書き換えます。

```rconfig/database.yml
default: &default
  adapter: mysql2
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000
  encoding: utf8mb4
  username: root
  password: password
  host: db

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default
```

### 2-5.Docker
下記コマンドでコンテナ及びアプリを起動します。

```rb
$ docker-compose up
```
最後コンテナが起動しているか下記コマンドで確認。コンテナが起動していたら
成功です。

```rb
$ docker-compose ps
```

### 2-6. Railsが起動していることを確認
ブラウザで http://localhost:3000/ へアクセスすると、無事Railsが立ち上がっています。

<img width="806" alt= "スクリーンショット 2020-12-31 16.44.44.png" src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867527/f213a2f1-d478-9063-2cce-f7bed82efcce.png">


# まとめ
DockerでRails 6に対応したRuby on Railsの環境構築を行いました。
Dockerをやり始めた人に向け最低限の実装でアプリを起動することを目標としました。一つ一つの工程を理解すればそれ程難易度が高いものではないと思います。
私と同じような人の参考記事になったら幸いです。

# 参考サイト一覧
下記の記事を参考にさせていただきました。
ありがとうございます。

https://knowledge.sakura.ad.jp/13265/
https://qiita.com/daichi41/items/dfea6195cbb7b24f3419