Ruby on Rails ✕ Docker✕MySQL開発中のアプリにDockerとdocker-composeを導入
はじめに
はじめてのDocker導入だと、何から手を付けたら良いのかわからない、ということがよくありますが、まさに自分がそれでした...
本記事では開発途中・完成したRailsアプリケーション(DB: MySQL)にDockerを導入する方法・流れを解説していきます。
参考までに自分は6時間位かけてローカルに導入できました。その苦労を忘れないようにしっかりアウトプットしていこうと思います(笑)
間違っていたら指摘してくださると幸いです!
Dockerの導入
1)Dockerのインストール
まずMacにDockerのアプリをインストールしてください
それに関しては以下の記事がわかりやすいです!
DockerをMacにインストールする
インストールできたらターミナルで以下コマンドを実行しましょう!
~ % docker run -d -p 80:80 docker/getting-started
2)インストールの確認
~ % docker -v
以下のように出力されたらインストール成功です。
Docker version 20.10.0, build 7287ab3
~ % docker-compose -v
こちらも同じようにdocker-compose version 1.27.4, build 40524192
と出力されたら成功です。
3)開発中・完成済みのアプリでDockerファイルの作成
次にDockerを導入するためにDockerファイルを作成し、設定を記述していきます。
テキストエディタでも可能ですが、自分の場合はターミナルから入力して方がエラーもなくスムーズだったため、そちらの方法を記載していきます。
①Dockerfileの作成
まずアプリのルートディレクトリにDockerfileを作成して、記述していきます。
ルートディレクトリというのは以下の図のようにアプリ直下のディレクトリを表します。
dock_app ----|-- app
|-- bin
|-- config
|-- db
・・・・・・
・・・・・・
|-- Gemfile
|-- Gemfile.lock
|-- package.json
|-- Rakefile
|-- README.md
|-- Dockerfile ←「Dockerfile]
|-- docker-compose.yml ←[docker-compose.yml]
手順としては以下の順に進んでいきます。
① ~ % cd Dockerを導入したいアプリのパス
② アプリ名 % vi Dockerfile
#ファイルを開いたら「i」でインサートモードにして以下記述
FROM ruby:2.6.5 #アプリのRubyバージョン
RUN apt-get update -qq && \
apt-get install -y build-essential \
libpq-dev \
nodejs
RUN mkdir /アプリ名
WORKDIR /アプリ名
ADD ./Gemfile /アプリ名/Gemfile
ADD ./Gemfile.lock /アプリ名/Gemfile.lock
RUN gem install bundler #bundlerをインストールしないとエラーが出る
RUN bundle install
ADD . /アプリ名
#記述ができたら「escキー」を押して「:wq」で保存
②docker-compose.ymlファイルの作成
① アプリ名 % vi docker-compose.yml
② docker-compose.ymlに以下記述
#「i」と入力しインサートモードで記述
version: '3'
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 'password' # このままpasswordとしても問題なく動く
ports:
- "4306:3306" #DockerコンテナとSequelpro接続の為に必要な設定
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/アプリ名
ports:
- "3000:3000"
depends_on:
- db
#記述が終了したら「escキー」を押して「:wq」で保存
4)config/database.ymlファイルの編集
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password # passwordの設定がなければ、このままで良い
socket: /tmp/mysql.sock
host: db
development:
<<: *default
database: アプリ名_development
追加されたのはpassword: password
とhost: db
の2つのみ。
5)docker-compose buildでコンテナ作成
アプリ名 ~ % docker-compose build
上記コマンドを実行してコンテナを作成しましょう。※時間がかかることがあります
以下のように出力されれば成功です。
Removing intermediate container dac250609513
---> f0ba8d685e44
Step 9/9 : ADD . /アプリ名
---> f50cb7681119
Successfully built f50cb7681119
Successfully tagged アプリ名_web:latest
ちなみに初心者の方だとコマンド実行中に赤字でdebconf: delaying package configuration, since apt-utils is not installed
と表示されますが、自分の調べた範囲では特に気にするようなこともない?出力のようです。
6)コンテナ上でDB作成・migrationの実行
コンテナが作成できたらコンテナ上でDBを作成していきます。
アプリ名 % docker-compose run web bundle exec rake db:create
Rails6だとこのコマンドを実行すると
========================================
Your Yarn packages are out of date!
Please run `yarn install --check-files` to update.
========================================
To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).
このように出力されることがあります。
このように出力されたら、エラー分通りconfig/webpacker.ymlファイル
の記述を以下のように編集しましょう。
# Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
check_yarn_integrity: true
# check_yarn_integrity: true を falseに変えましょう → check_yarn_integrity: false
これでエラーは解決できると思うので、記述を変更したら、もう1度DB作成のコマンドを実行しましょう。
Created database 'アプリ名_development'
Created database 'アプリ名_test'
#上記のようにcreatingがcreated...doneとなったら成功
続いてmigrationを実行しましょう。
アプリ名 % docker-compose run web bundle exec rake db:migrate
== 20201222010929 Createテーブル名: migrating ====================================
-- create_table(:テーブル名)
-> 0.0095s
== 20201222010929 Createテーブル名: migrated (0.0096s) ===========================
# 上記のようにrails db:migrateを実行したときのようにマイグレーションが実行されれば成功です
7)コンテナの起動
最後にコンテナを起動して無事、アプリがブラウザで表示されるか確認しましょう。
コンテナの起動コマンドを実行しましょう。
アプリ名 % docker-compose up
# 起動していれば以下の様の出力が出る
db_1 | 2020-12-27T06:45:52.494912Z 0 [Note] Event Scheduler: Loaded 0 events
db_1 | 2020-12-27T06:45:52.497330Z 0 [Note] InnoDB: Buffer pool(s) load completed at 201227 6:45:52
db_1 | 2020-12-27T06:45:52.497669Z 0 [Note] mysqld: ready for connections.
db_1 | Version: '5.7.32' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)
web_1 | => Booting Puma
web_1 | => Rails 6.0.3.4 application starting in development
web_1 | => Run `rails server --help` for more startup options
web_1 | Puma starting in single mode...
web_1 | * Version 3.12.6 (ruby 2.6.5-p114), codename: Llamas in Pajamas
web_1 | * Min threads: 5, max threads: 5
web_1 | * Environment: development
web_1 | * Listening on tcp://0.0.0.0:3000
web_1 | Use Ctrl-C to stop
コマンドを実行し、サーバーが起動したらローカル環境にアクセスしてみましょう
http://localhost:3000/
無事に表示・挙動が確認できれば開発環境にDockerを導入できたということになります。
自分はこれだけで6時間くらいかかったので、ぜひ皆さんは本記事を活用して、さくさく進めていってください!!
8)Docker環境(開発環境)のRailsアプリとSequelProを接続する
最後にDBを接続しましょう!
以下の設定ページを開いて標準を選択します。
設定ページに以下を記述
「名前」 → 任意のものを設定
「ホスト」 → 「127.0.0.1」
「ユーザー名・パスワード」 → ymlファイルで記述したものに合わせる
「ポート」 → 「4306」
以上を設定して「接続」するとSequelPro内で該当アプリのDBが作成されているはずです。
また、ボート番号はdocker-compose.yml
のports:
の記述と合わせています。
以上でDockerとdocker-composeの開発環境への導入は終了です。
ちなみに僕はここまで6時間前後かかったので、ぜひ参考にしてさくさく進めていってください。
本記文献
①『さわって学ぶクラウドインフラ docker基礎からのコンテナ構築』
② 既存のrails6のアプリにMySQLでDockerを導入する。
③ Ruby on Rails 「途中まで作ったアプリにDockerを導入したい」に挑戦してみる(MySQL / Sequel Pro)
Discussion