はじめに
GW ということで普段できないことがしたいなと思ったのと、ちょうど 2019 年卒の新卒エンジニア研修を担当していて、題材として Rails Tutorial を使っているので、Rails Tutorial の sample_app をチュートリアルにはないモダンな技術で作ってみることにしました。
今回は環境構築編で、Docker と Kubernetes を使って sample_app の環境構築を行いたいと思います。
この記事では「Yay! You’re on Rails!」の画面を表示させてデプロイするところまで行います。
環境
手順
- ルートディレクトリの作成
- Dockerfile の作成
- Gemfile と Gemfile.lock の作成
- docker-compose.yml の作成
rails new
する- database.yml の設定
- DB の作成
- アプリの起動
- デプロイ
ルートディレクトリの作成
まずは、ルートディレクトリを作成してそのディレクトリに移動します。
$ mkdir rails_turorial_app $ cd rails_turorial_app
Dockerfile の作成
次に Dockerfile を作成します。場所はルートディレクトリの直下に置くことにしました。
Dockerfile FROM ruby:2.6.3 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN mkdir /rails_tutorial_app WORKDIR /rails_tutorial_app ADD Gemfile /rails_tutorial_app/Gemfile ADD Gemfile.lock /rails_tutorial_app/Gemfile.lock RUN bundle install ADD . /rails_tutorial_app
Gemfile と Gemfile.lock の作成
次に Gemfile と Gemfile.lock を作成します。 Gemfile.lock は空ファイルで大丈夫です。
Gemfile source 'https://rubygems.org' gem 'rails'
$ touch Gemfile.lock
docker-compose.yml の作成
次に docker-compose.yml を作成します。これもルートディレクトリの直下に置くことにしました。
docker-compose.yml version: '3' services: db: image: mysql:5.7.23 environment: MYSQL_USER: root MYSQL_ROOT_PASSWORD: root ports: - '3316:3306' volumes: - ./db/mysql/volumes:/var/lib/mysql web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/rails_tutorial_app ports: - "3000:3000" depends_on: - db
ここで MySQL は明示的に 5.7 系にしています。指定しないと MySQL 8 系になってしまい、認証が色々と面倒になるので 5.7 系にしました。
rails new
する
rails new
します。ただ、Docker コンテナ内にスケルトンを作成することになるので、お馴染みのコマンドとは少し異なります。
$ docker-compose run web rails new . --force --database=mysql
database.yml の設定
config/database.yml の設定を少し書き換えます。
docker-compose.yml で MYSQL_ROOT_PASSWORD
を root
にしたので password
を root
にして、host
は db
にします。
config/database.yml ・・・(略)・・・ default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: root host: db ・・・(略)・・・
DB の作成
DB の設定が終わったので、DB を作成します。
$ docker-compose run web rake db:create
アプリの起動
これでアプリが起動できるようになったので、実際に docker-compose up
で起動してみます。
$ docker-compose up
デプロイ
Kubernetes を用いてデプロイします。
こちらも一からやり方を書こうかと思いましたが、以下の記事に既にまとまっており、ほぼ同じ内容になりそうだったので割愛します。
終わりに
Docker を用いて rails のアプリを起動させて Kubernetes を用いてデプロイすることができました。
これから sample_app をフロントは TypeScript & React & CSS in JS で、テストは RSpec で書きながら TDD でサーバー側を書いていこうと思います。