はじめに
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.ボリュームの変更
インスタンスの状態がoptimizing(黄色のマーク)なので、10分程度放置し終わるのを待ちます。
状態が緑のマークになると、サイズも16GBとなり反映が確認できます。
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の環境構築 この記事を参考にしてください。
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
で確認したインストール済みのバージョンと同様にしてあります。
source 'https://rubygems.org'
gem 'rails', '5.2.4.4' #適したバージョンを指定
rails5系で現在最新のバージョンを指定。Ruby on Rails最新情報
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
を修正します。
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
その他のエラー
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'
データベースを作成していないとこの表示がされます。
新しいターミナルを開いてデータベースを作成すれば解消されます。