##はじめに
以下のAWS Cloud9で作成したRailsアプリをDockerに移行します。
本アプリはログイン、投稿、DM、フォロー、通知などの機能がついたもので、
すでにPostgreSQLのデータベースを導入し、Herokuにデプロイしております。
今回はこちらのデータベースにMySQLを導入し、
Dockerの開発環境に移行する流れとなります。
Railsアプリの使用技術
######バックエンド
・Ruby(2.6.5)
・Rails(5.2.6)
フロントエンド
・HTML/CSS
・Javascript
開発環境、インフラ
・Cloud9
・Puma
・pg(0.20.0)
テスト、静的コード解析
・Rspec
・Rubocop
##Docker for Macをインストール
まずは以下の記事を参考にMacPCにDockerをインストールします。
##MySQLを導入
私はもともとアプリケーションの開発環境にSQLite3を導入しており、
その後Herokuデプロイ用にPostgreSQLを導入しました。
今回は以下の記事を参考にMySQLを導入します。
※私はここで以下のエラーが出ました。
ld: library not found for -lssl
うまくパスが通っていなかったようなので、以下の記事でパスを通して解決。
##実装
ここからは実装を進めていきます。
######実装の流れ
1 Dockerfile/docker-compose.ymlを作成
2 database.yml編集
3 コンテナをbuildする docker-compose build
4 Dockerコンテナ上でDB作成&migrationを実行
docker-compose run web bundle exec rake db:create / db:migrate
5 コンテナを起動する docker-compose up
###1 Dockerfile/docker-compose.ymlを作成
まずは以下のファイルをRailsアプリに追加します。
(1)Dockerfile
(2)docker-compose.yml
アプリのルートディレクトリにこれらのファイルを追加します。
boditore----|-- app
|-- bin
|-- config
|-- db
・・・・・・
・・・・・・
|-- Gemfile
|-- Gemfile.lock
|-- package.json
|-- Rakefile
|-- README.md
|-- Dockerfile #ここに追加
|-- docker-compose.yml #ここに追加
ファイルの中身は以下の通りです。
FROM ruby:2.6.5
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 gem install bundler
RUN bundle install
ADD . $APP_ROOT
version: '3'
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 'password'
ports:
- "4306:3306"
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/app_name
ports:
- "3000:3000"
depends_on:
- db
###2 database.yml編集
configフォルダ内のdatabase.ymlも編集します。
〜省略〜
#以下を追加
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password
socket: /tmp/mysql.sock
host: db
development:
<<: *default
database: boditore #自分のアプリのデータベース名
###3 コンテナをbuildする docker-compose build
ここまできたら、あとはビルドしてDB作って起動するのみです。
アプリのディレクトリで以下をターミナルに入力して実行します。
[boditore] $ docker-compose build
※この作業は少し時間がかかるので、気長に待ちましょう。
###4 Dockerコンテナ上でDB作成&migrationを実行
次はデータベースの作成とマイグレーションです。
ターミナルで以下のコマンドを実行します。
[boditore] $ docker-compose run web bundle exec rake db:create
Created database 'boditore'
Created database 'boditore_test'
[boditore] $ docker-compose run web bundle exec rake db:migrate
== CreateUsers: migrating ======================================
-- create_table(:users)
-> 0.0150s
== CreateUsers: migrated (0.0152s) =============================
上記のコマンドで、Dockerコンテナ上にデータベースの作成とマイグレートをします。
###5 コンテナを起動する docker-compose up
最後にrails sの感覚で、docker-compose upを実行します。
[boditore] $ docker-compose up
Starting boditore_db_1 ... done
Recreating boditore_web_1 ... done
これでローカル環境でアプリが動かせるはずです。
##まとめ
いろいろな記事を参考にしながらDocker環境設定を行いました。
企業で当たり前のように使用されているようなので、
早く使い慣れることができるようこれからも研究していこうと思います。
さいごまでお読みいただき、ありがとうございました!