10
9

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

Last updated at Posted at 2020-11-29

はじめに

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

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

参考記事:
丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac)

ファイル内容は上記サイトから頂きましたが、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

開いたウィンドウのサイズを16GBに変更
スクリーンショット 2020-11-29 190843.png

こうなればOK
スクリーンショット 2020-11-29 190917.png

インスタンスの状態がoptimizing(黄色のマーク)なので、10分程度放置し終わるのを待ちます。
スクリーンショット 2020-11-29 191119.png

状態が緑のマークになると、サイズも16GBとなり反映が確認できます。
スクリーンショット 2020-11-29 193501.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のインストール

インストールの前に このページ で最新のバージョンを確認しておいてください。

下の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の環境構築 この記事を参考にしてください。

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で確認したインストール済みのバージョンと同様にしてあります。

Gemfile
source 'https://rubygems.org'
gem 'rails', '5.2.4.4' #適したバージョンを指定

rails5系で現在最新のバージョンを指定。Ruby on Rails最新情報

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を修正します。

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

その他のエラー

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'

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

10
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9