Cloud9 × Rails × Docker × MySQL で環境構築

# はじめに
cloud9を使ったDockerの環境構築の記事が少なく戸惑ったこと、自身のアウトプットのために執筆します。

間違いなどありましたらご指摘いただければ、自身でも調べ速やかに修正いたします。

>参考記事：
[丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac)](https://qiita.com/azul915/items/5b7063cbc80192343fc0)

ファイル内容は上記サイトから頂きましたが、port8080に対応するため一部編集を加えています。

# 目標
タイトルの構成で環境構築をし、「Yay! You’re on Rails!」を表示させる。

# 環境
Amazon linux
Ruby 2.6.3
Rails 5.2.4.4
MySQL 5.5.62
Docker 19.03.6
Docker-compose 1.27.4

# やってきましょう
### インスタンスのボリュームを増やす
cloud9を立ち上げてできるインスタンスはサイズが10GBとなっているので、容量が不足する可能性があります。
その都度不要ファイルを削除できればいいのですが、手っ取り早くコンソールから容量を増やしました。
（極少額の課金が発生するかもしれません、料金はご自身で調べてみてください）

まずはcloud9を立ち上げます。
その後EC2の画面に行くと、cloud9と同時に立ち上がったインスタンスがあります。

EC2のサイドメニューから下記の順番で選択します。
1.ボリューム
2.先ほど立ち上がったインスタンスのチェックボックス
3.アクション
4.ボリュームの変更

![スクリーンショット 2020-11-29 190704.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582824/663773d7-4a39-93a7-bb1c-2d84b0344808.png)

開いたウィンドウのサイズを16GBに変更
![スクリーンショット 2020-11-29 190843.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582824/30ec70e4-1606-943d-66fc-eec9ee9c0bba.png)

こうなればOK
![スクリーンショット 2020-11-29 190917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582824/590c98c0-d24b-44e5-5194-306bfa7457a8.png)

インスタンスの状態がoptimizing（黄色のマーク）なので、10分程度放置し終わるのを待ちます。
![スクリーンショット 2020-11-29 191119.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582824/b6f170c5-b47d-3fde-4559-6dcac8f622db.png)

状態が緑のマークになると、サイズも16GBとなり反映が確認できます。
![スクリーンショット 2020-11-29 193501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582824/319b302f-fc3b-84e7-8014-d48554f74b5c.png)

cloud9のターミナルに移動します。
以下のコマンドで内部からもサイズ変更が反映されているかを確認します。

```
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        483M   60K  483M   1% /dev
tmpfs           493M     0  493M   0% /dev/shm
/dev/xvda1       16G  8.6G  7.0G  55% /
```
もしリロードしても反映されていないようなら次のコマンドを入力します。

```
$ sudo growpart /dev/xvda 1
$ sudo resize2fs /dev/xvda1
```

### Docker-Composeのインストール
インストールの前に [このページ](https://github.com/docker/compose/releases) で最新のバージョンを確認しておいてください。

下の```1.27.4```の箇所を確認した最新のバージョンに書き換えてインストールします。
私は"/home/ec2-user/environment"ディレクトリで実行しています。

```
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 
```

```$ docker-compose``` コマンドを実行できるように権限を与えます。

```
$ sudo chmod +x /usr/local/bin/docker-compose
```

バージョンの確認をして、表示されればインストールは完了です。

```
$ docker-compose --version
docker-compose version 1.27.4, build 40524192
```

### ファイルの準備
プロジェクトディレクトリを作成して、その中に移動します。

```
$ mkdir myApp
$ cd myApp
```

そうしたら必要なファイルを```touch```コマンドで作成していきます。
ここでファイルは4つ用意します。

```
$ touch Dockerfile
$ touch Gemfile
$ touch Gemfile.lock
$ touch docker-compose.yml
```

通常は```vi```コマンドなどでファイルを書いていきますが、cloud9はせっかくエディタが付いているのでそちらで作業しましょう。

__なお```Gemfile.lock```は記載せずに空のままで大丈夫です。__

各ファイルの項目は [Docker × Ruby on Rails × MySQLの環境構築](https://qiita.com/tatsuo-iriyama/items/0bf3b08de03280314c91) この記事を参考にしてください。

```ruby:Dockerfile
FROM ruby:2.6.3 #適したバージョンを指定
RUN apt-get update -qq && \
    apt-get install -y build-essential \ 
                       libpq-dev \        
                       nodejs           
RUN mkdir /app_name 
ENV APP_ROOT /app_name 
WORKDIR $APP_ROOT
ADD ./Gemfile $APP_ROOT/Gemfile
ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock
RUN bundle install
ADD . $APP_ROOT
```
>FROM ruby:2.6.3

cloud9にはあらかじめrubyがインストールされています。
以前同様の環境構築をした際、インストール済みのバージョンとここで指定したバージョンが異なりエラーになりました。（原因は他にあるのかもしれませんが、2つのバージョンが競合したのか？）

その為ここのrubyのバージョンは```$ ruby -v```で確認したインストール済みのバージョンと同様にしてあります。

```ruby:Gemfile
source 'https://rubygems.org'
gem 'rails', '5.2.4.4' #適したバージョンを指定
```
rails5系で現在最新のバージョンを指定。[Ruby on Rails最新情報](https://openstandia.jp/oss_info/rubyonrails/version/)

```ruby:docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: パスワード
      MYSQL_DATABASE: データベース名
    ports:
      - "3306:3306"

  web:
    build: .
    command: rails s -p 8080 -b '0.0.0.0'
    volumes:
      - .:/app_name
    ports:
      - "8080:8080"
    links:
      - db
```
>command: rails s -p 8080 -b '0.0.0.0'
>
>ports:
      - "8080:8080"

cloud9ではport8080でサーバーに接続します。
その為、ホスト:コンテナ の両方を8080番で指定しています。

パスワードとデータベース名は任意の値を記載します。

これで設定を記載した3つのファイルと、空のGemfile.lockができました。

### Railsプロジェクト作成
カレントディレクトリがプロジェクトディレクトリ（今回は```/home/ec2-user/environment/myApp```）であることを確認します。

そうしたら```rails new```を実行してアプリケーションの型を作ります。

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

問題がなければプロジェクトディレクトリ配下にRailsのひな形が出来上がります。

```
$ ls
app  bin  config  config.ru  db  docker-compose.yml  Dockerfile  Gemfile  Gemfile.lock  lib  log  package.json  public  Rakefile  README.md  storage  test  tmp  vendor
```

データベース周りの設定のため```/myApp/config/database.yml```を修正します。

```ruby:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: パスワード
  host: db
```
パスワードの箇所には先ほど"docker-compose.yml"で設定したのと同様の値を記載します。
ここで保存しようとすると、恐らくcloud9の上部に警告文が表示されます。
>EACCES: permission denied

これは```database.yml```に対する書き込み権限が無いので保存できない旨の内容なので、権限を変更指定保存できるようにします。

/myApp/configに入り、ファイルの権限を確認します。

```
$ cd config
$ ls -l
-rw-r--r-- 1 root root 1657 Nov 29 19:06 database.yml
```

書き込み権限を変更し、反映されれば```database.yml```を保存できるようになります。

```
$ sudo chmod 666 database.yml
$ ls -l
-rw-rw-rw- 1 root root 1657 Nov 29 19:06 database.yml
```

### Dockerコンテナのビルド
プロジェクトディレクトリに戻り、コンテナを立ち上げます。

```
$ docker-compose build
```

>PermissionError: [Errno 13] Permission denied: '/home/ec2-user/environment/myApp/config/master.key

このエラーが出るのは先ほど同様```myApp/config/master.key```に対するパーミッションエラーなので、権限を変更します。

ディレクトリを移動して権限を確認。

```
$ cd config
$ls -l
-rw------- 1 root root   32 Nov 29 19:06 master.key
```

権限を変更して反映を確認します。

```
$ sudo chmod 666 master.key
$ ls -l
-rw-rw-rw- 1 root root   32 Nov 29 19:06 master.key
```

再トライ

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

これで私はうまくいきました。

### データベースの作成
コンテナが起動したらショートカットキー```Alt + T```でcloud9にターミナルをもう一つ立ち上げます。

開いたターミナルからプロジェクトファイルに移動して、データベースを立ち上げます。

```
$ cd myApp
$ docker-compose run web rails db:create
```

成功していれば Preview → Preview Running Application で「Yay! You’re on Rails!」が表示されます。
この時
>**********.vfs.cloud9.ap-northeast-1.amazonaws.com で接続が拒否されました。

と表示されたら、右上の矢印ボタンを押して別タブで開けば表示されます。

サーバーを停止させる場合は```Ctrl + C```ではなく、新しく開いた方のターミナルで下記を入力します。

```
$ docker-compose down
```

![スクリーンショット 2020-11-26 184833.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582824/792e926e-de9c-ca74-b615-72b7b5e47fba.png)


# その他のエラー
>Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

database.ymlのhostの変更を忘れていると出ます。


>Can't connect to MySQL server on 'db' (115)

コンテナが立ち上がり切っていない時に表示されます。
数秒待ってからリロードすれば表示内容が変わります。

>Unknown database 'app_name_development'

データベースを作成していないとこの表示がされます。
新しいターミナルを開いてデータベースを作成すれば解消されます。