
【Rails6】Dockerを用いたRails6の開発環境構築【コピペでOK】
はじめに
この記事の概要
皆さん、Railsの開発環境はどのようにしていますか?
もちろん、ホストに直接RubyやRailsをインストールしてませんよね?🥺
ホストにインストールしてしまうと、下記のようなデメリットが考えられます
- 本番環境へのデプロイが大変
- チーム開発の際に環境構築でつまづく
- 違うプロジェクトを行き来する際にRubyのバージョンを毎回変えなければならない
他には、今どきの開発者はDockerを使っているところが多いというのも大きいですね!
そこで、今回はDockerを使ってRails6でいつもの画面が表示されるところまでを説明します!
なるべくコピペだけで動くようにコード等も載せますのでぜひ最後までお付き合いください🙏
(今回はMacBookでの説明となります)
対象読者
- DockerでRails6の開発環境を作成したい人
- Dockerについてあまり理解していない初学者
筆者の環境
| 技術等 | バージョン |
|---|---|
| 使用パソコン | MacBook Pro (CPU: Intel) |
| OS | macOS Monterey |
| Ruby | 2.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
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このファイルはMySQLの設定のためのファイルです。
今回は文字化け対策等最低限の設定をしています。
ここからはいよいよDockerのコマンドを打ち込んでいきます。
カレントディレクトリがissenであることを確認して下記コマンドを実行してください!
かなり長いコマンドで、完了までに時間もかかりますが様子を見てあげてください😎
$ docker-compose run --no-deps app rails new . --force --database=mysql --skip-test --skip-springいつも、rails newでプロジェクトを作成することで色々なファイルがカレントディレクトリにできると思います。
上記コマンドでその作業を行っています。
--skip系は自分のプロジェクトに応じてアレンジしてください!
ここまで行うと、GemfileやGemfile.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に変更してください!
これでappとdbの接続が完了しましたので、データベースを作成します!
$ docker-compose run app rails db:create最後に、サーバーを立ち上げます!
$ docker-compose upこのコマンドで、いつもの$ rails sのようなコンソールになると思います。
ブラウザでlocalhost:3000と打っていつもの下記画像のような画面が表示されたら成功です。お疲れ様でした🎉
よく使うコマンド
ここまでで開発環境を立ち上げることは可能となりましたが、実際に開発する際にどうすればいいか分からないと思います🙄
なのでここからは、開発時に僕がよく使うコマンド等を紹介します!
開発を始める時
$ docker-compose upこのコマンドは$ rails sのように使います。
また、止めたい時はCtrl + Cのコマンドで止まります。
開発を終わる時
$ docker-compose downctrl + 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等していただければ喜んでお答えします!


