【Rails6】Dockerを用いたRails6の開発環境構築【コピペでOK】

はじめに

この記事の概要

皆さん、Railsの開発環境はどのようにしていますか?
もちろん、ホストに直接rubyRailsをインストールしてませんよね?🥺
ホストにインストールしてしまうと、下記のようなデメリットが考えられます

  • 本番環境へのデプロイが大変
  • チーム開発の際に環境構築でつまづく
  • 違うプロジェクトを行き来する際にRailsのバージョンを毎回変えなければならない

ツキヤ

他には、今どきのシステム開発会社はDockerを使っているところが多いというのも大きいですね!

そこで、今回はDockerを使ってRails6でいつもの画面が表示されるところまでを説明します!
なるべくコピペだけで動くようにコード等も載せますのでぜひ最後までお付き合い下さい🙏
(今回はMacBookでの説明となります)

対象読者

  • Dockerでrails6の開発環境を作成したい人
  • Dockerについてあまり理解していない初学者

筆者の環境

技術等バージョン
使用パソコンMacBook Pro (CPU:Intel)
OSmacOS Monterey
ruby2.7.4

Dockerの準備

この章ではDockerの簡単な概要とインストールを説明します。
ある程度理解している人は次の章までスキップして下さい🙇‍♂️

なんでDockerなの?

概要でもお話しした理由から、MacBookに直接rubyRailsを入れるのはナンセンスです。
そこで、よく使用されていたのがVMwareVirtualBoxをはじめとした仮想環境でした。

ツキヤ

これらの技術をかなり簡単に説明すると、パソコンの中に更に独立したパソコンを作る技術です!
パソコンの仮想環境

この技術を使うことで色々な環境を簡単に行き来することができます。
ただ、この仮想環境の技術でも解消されていない問題がありました。

仮想環境の問題
  • 仮想環境自体がかなりデータ量が大きい
  • チーム開発の際に手作業で全て導入する必要がある

上記問題を解消したのがDockerです🥳

Dockerは仮想環境の代わりにかなり軽量なコンテナと呼ばれるものを立ち上げることで必要なデータ量は大幅に削減されました。
また、コンテナ等の作成のためにファイルを用意する必要があるのですが、逆にこれが環境の手順書や説明書のような役割を果たすのでチーム内での開発環境の共有も劇的にラクになりました💪
更に、コマンドを少し叩くだけで本番環境へのデプロイ(リリース)も完了してしまいます!

なので、今後は仮想環境の代わりにどんどん普及していくことが予想されます。この記事をキッカケにDockerをぜひ使ってみましょう!!

Dockerのインストール

まずはDockerのインストールをしましょう!
下記のリンクをクリックして「Docker Desktop」の項目の方の自分のパソコンに適したファイルをインストールして下さい!
参考 Get Started with Dockerdocker


ツキヤ

僕はIntelのMacBookなので上のスクリーンショットのような状態でダウンロードしました!

あとはダウンロードしたファイルを開いて、画面の指示に従ってアプリケーションとしてインストールしてください。
以上でインストール自体は終了です!

動作確認

次に、ちゃんと使用できるかの確認をしてみましょう!

まず、インストールしたDockerを起動させてください
クリックしたら起動までに時間が少しかかります。
メニューバーのクジラの動きが止まったら準備が完了です😎

次に、画面に下の画像のようなDockerのウィンドウが表示されていると思います

この中に書いてあるコマンドをターミナルで打ってみましょう!(下にコマンドを書いているのでこちらからコピペしてもらっても大丈夫です)

$ docker run -d -p 80:80 docker/getting-started

すると、ターミナルでは下の画像のようになにやら色々ダウンロードして終了しました🙄

この状態で、localhost:80とブラウザのURL欄に打ち込んで見てください!
エラー無くDockerのチュートリアルページが表示されたら成功です😎

MEMO
URLはリダイレクトされてlocalhost/tutorialになっています

これでDockerの確認が終了です!

ツキヤ

もしローカルの80番ポートを使ってると起動の際にエラーが起きるので、他の80番ポートを使用しているアプリを停止させてから実行しましょう!

また、最後にコンテナを停止、削除までしておきましょう💪

$ docker container stop brave_knuth
$ docker container rm brave_knuth

上記2行のコマンドで先程立ち上げたコンテナが停止、削除されました(URL localhost/tutorialが見れなくなっていることを確認してみてください)

実装

注意
今回は起動を目標にしておりますので、ファイルの1行ごとに細かく説明していません。
一旦の雰囲気を掴んでもらうためですので、、必要に応じて各行の内容をご自身で調べてみてください🙇‍♂️

初期ファイル、コマンド

それでは、いよいよファイルを作りながら環境を作成していきます!
まずはディレクトリとファイルの雛形をサクッと作ります!

$ mkdir issen
$ cd ./issen

今回はissenというディレクトリ内で作業をするので、ディレクトリを作成及び移動をしておきます
次に必要なファイルを空の状態で作ります!

$ touch Dockerfile
$ touch docker-compose.yml
$ touch entrypoint.sh
$ touch Gemfile
$ touch Gemfile.lock
$ touch my.cnf

これでissenディレクトリ配下に6つのファイルが作成されました!

次に、これらのファイルの中身をどんどん書き込みます!

Dockerfile

FROM ruby:2.7.4
ENV TZ Asia/Tokyo

RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \
    && apt-get update -qq \
    && apt-get install -y nodejs \
    && npm install -g yarn

WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

ざっくり説明すると、1行目のFROM ruby:2.7.4でベースとなるイメージを設定します。
今回はrubyのバージョン2.7.4が予め入っているものにしました

そして、2行目以降でそのベースイメージを加工していきます!
4行目では、一括でRails6を動かすために必要なyarnに関するパッケージ群をインストールしています。
9行目以降では先程の作成したファイルをイメージ内に適宜コピーして形成していきます。

注意
ある程度理解している方のために補足をしておきますと、今回のイメージはやや冗長でイメージサイズも重めです。ですが、今回は簡単化のためにこのようなファイル内容にしています

docker-compose.yml

version: '3'
services:
  app:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp:delegated
    ports:
      - "3000:3000"
    depends_on:
      - db
    tty: true
    stdin_open: true

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3306:3306'
    volumes:
      - ./tmp/db:/var/lib/mysql:delegated
      - ./my.cnf:/etc/mysql/conf.d/my.cnf
    cap_add:
      - SYS_NICE

ここでは、先程のDockerfileとMySQLを同時に起動させるような記述をしています!
3行目のappと15行目のdbという2つのコンテナが立ち上がることになります。
また、18行目のMYSQL_ROOT_PASSWORDは、MySQLのrootユーザーのパスワードになりますので、適宜修正してもらっても構いません。

entrypoint.sh

#!/bin/bash
set -e

rm -f /myapp/tmp/pids/server.pid

exec "$@"

これはシェルスクリプトと言って、ターミナルのコマンドをまとめて実行するようなバッチファイルです。
注意してほしいのが、1行目です。これはコメントアウトではないのでしっかり記述して下さい!!

Gemfile

source 'https://rubygems.org'
gem 'rails', '~>6.1.4'

Gemfileには一旦railsのみの記述をしておきます。

Gemfile.lock

Gemfile.lockは用意するのみで何も書きません!

my.cnf

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
default-authentication-plugin=mysql_native_password
[client]
default-character-set=utf8mb4 

このファイルはMysSQLの設定のためのファイルです。
今回は文字化け対策等最低限の設定をしています。

ここからはいよいよDockerのコマンドを打ち込んで行きます。
カレントディレクトリがissenであることを確認して下記コマンドを実行して下さい!
かなり長いコマンドで、完了までの時間もかかりますが様子を見てあげて下さい😎

$ docker-compose run --no-deps app rails new . --force --database=mysql --skip-test --skip-spring

いつも、rails newでプロジェクトを作成することで色々なファイルがカレントディレクトリにできると思います。
上記コマンドでその作業を行っています。

ツキヤ

–skip系は自分のプロジェクトに応じてアレンジしてください!
追記(2022/12/30)

Rails7からは、デフォルトでspringがインストールされなくなったので、–skip-springは入力しなくて良くなりました。

ここまで行うと、GemfileGemfile.lockに記述が追加され、ディレクトリやファイルもいつものRailsのものが作成されているかと思います🥳
あともう少しだけ設定を行って完了です、頑張ってついてきて下さい!

ファイル追記、追加コマンド

出来上がったconfigディレクトリ内のdatabase.ymlを修正します!

## 中略

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db

## 以下略

8行目のパスワード部分は、docker-compose.yml内のMYSQL_ROOT_PASSWORDで指定したものに、
9行目はホスト名をdbに変更して下さい!

MEMO
9行目のこのdbとい名称は、docker-compose.ymlの15行目でで指定したコンテナ名です

これでappdbの接続が完了しましたので、データベースを作成します!

$ docker-compose run app rails db:create

最後に、サーバーをたちあげます!

$ docker-compose up
railsの初期画面

このコマンドで、いつもの$ rails sのようなコンソールになると思います。
ブラウザでlocalhost:3000と打っていつもの下記画像のような画面が表示されたら成功です、お疲れ様でした🎉

よく使うコマンド

ここまでで開発環境を立ち上げることは可能となりましたが、実際に開発する際にどうすればいいか分からないと思います🙄
なのでここからは、開発時に僕がよく使うコマンド等を紹介します!

開発を初める時

$ docker-compose up

このコマンドは$ rails sのように使います。
また、止めたい時はctrl + cのコマンドで止まります。

開発を終わる時

$ docker-compose down

ctrl + cをしてから、上記コマンドを打つことで立ち上がっているコマンドが削除されます。
現在のコンテナ状況を知りたい時は、

$ docker container ls

で、確認できます。何も表示されていないときはコンテナが何も立ち上がっていないことになります。

作業を再度開始したいときは先程と同様に

$ docker-compose up

でOKです😎

gemを追加した時

gemを追加したときだけ注意が必要です。
一度$ docker-compose downでコンテナを削除してもらってから、

$ docker-compose build

で、再度イメージを作成してもらう必要があります。
これは、作成したイメージ内には新しく追加したgemが存在していないからです。

終わりに

今回は、ざっくりとDockerでRailsの6の開発環境を作成しました。
Dockerの公式サイトでもRailsの開発環境作成手順は載っているのですが、バージョンが5ですので、注意して下さい!
Dockerの説明自体はほとんどしていないので、要望がありそうでしたらまた記事にしようと思います🙇‍♂️
Docker + Railsの勉強をしたい方はこの本が参考になるかと思いますので興味がある方は是非読んで見て下さい🙇‍♂️

かなり省略したので、もし分からないことがあったら下のプロフィールのtwiiterリンクからDMしていただければ喜んでお答えします!