旧ブログ(ISSEN)から移行しました

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

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

西原月熙
西原月熙11分で読めます

はじめに

この記事の概要

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

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

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

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

対象読者

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

筆者の環境

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

Dockerの準備

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

なんでDockerなの?

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

ツキヤツキヤ

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

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

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

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

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

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

Dockerのインストール

まずはDockerのインストールをしましょう!
下記のリンクをクリックして「Docker Desktop」の項目にて、自分のパソコンに適したファイルをインストールしてください!

Get Started | Docker

Get started with Docker Desktop and join millions of developers in faster, more secure app development using containers and beyond.

www.docker.com

ツキヤツキヤ

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

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

動作確認

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

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

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

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

ターミナル
$ docker run -d -p 80:80 docker/getting-started

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

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

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

ツキヤツキヤ

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

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

$ docker container stop brave_knuth
$ docker container rm brave_knuth

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

実装

初期ファイル、コマンド

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

ターミナル
$ 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

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

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

entrypoint.sh
#!/bin/bash
set -e
 
rm -f /myapp/tmp/pids/server.pid
 
exec "$@"

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

Gemfile

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

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

Gemfile.lock

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

my.cnf

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

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

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

ターミナル
$ docker-compose run --no-deps app rails new . --force --database=mysql --skip-test --skip-spring

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

ツキヤツキヤ

--skip系は自分のプロジェクトに応じてアレンジしてください!

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

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

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

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に変更してください!

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

ターミナル
$ docker-compose run app rails db:create

最後に、サーバーを立ち上げます!

ターミナル
$ docker-compose up

このコマンドで、いつもの$ 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でRails6の開発環境を作成しました。
Dockerの公式サイトでもRailsの開発環境作成手順は載っているのですが、バージョンが5ですので、注意してください!
Dockerの説明自体はほとんどしていないので、要望がありそうでしたらまた記事にしようと思います🙇‍♂️
Docker + Railsの勉強をしたい方はこの本が参考になるかと思いますので興味がある方はぜひ読んで見てください🙇‍♂️

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

この記事を書いた人

西原月熙
西原月熙

TOKOSのテックリード。上流工程からコーディング、インフラ系まで色々やっている器用貧乏です。最近は特にフロントエンドのキャッチアップに力を入れています💪 好きな音楽はボーカロイドです🤖