はじめに
この記事の概要
皆さん、Railsの開発環境はどのようにしていますか?
もちろん、ホストに直接rubyやRailsをインストールしてませんよね?🥺
ホストにインストールしてしまうと、下記のようなデメリットが考えられます
- 本番環境へのデプロイが大変
- チーム開発の際に環境構築でつまづく
- 違うプロジェクトを行き来する際にRailsのバージョンを毎回変えなければならない
ツキヤ
そこで、今回は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 with Dockerdocker
ツキヤ
あとはダウンロードしたファイルを開いて、画面の指示に従ってアプリケーションとしてインストールしてください。
以上でインストール自体は終了です!
動作確認
次に、ちゃんと使用できるかの確認をしてみましょう!
まず、インストールしたDockerを起動させてください
クリックしたら起動までに時間が少しかかります。
メニューバーのクジラの動きが止まったら準備が完了です😎
次に、画面に下の画像のようなDockerのウィンドウが表示されていると思います
この中に書いてあるコマンドをターミナルで打ってみましょう!(下にコマンドを書いているのでこちらからコピペしてもらっても大丈夫です)
$ docker run -d -p 80:80 docker/getting-started
すると、ターミナルでは下の画像のようになにやら色々ダウンロードして終了しました🙄
この状態で、localhost:80とブラウザのURL欄に打ち込んで見てください!
エラー無くDockerのチュートリアルページが表示されたら成功です😎
これでDockerの確認が終了です!
ツキヤ
また、最後にコンテナを停止、削除までしておきましょう💪
$ 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つのファイルが作成されました!
次に、これらのファイルの中身をどんどん書き込みます!
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行目以降では先程の作成したファイルをイメージ内に適宜コピーして形成していきます。
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ユーザーのパスワードになりますので、適宜修正してもらっても構いません。
#!/bin/bash
set -e
rm -f /myapp/tmp/pids/server.pid
exec "$@"
これはシェルスクリプトと言って、ターミナルのコマンドをまとめて実行するようなバッチファイルです。
注意してほしいのが、1行目です。これはコメントアウトではないのでしっかり記述して下さい!!
source 'https://rubygems.org'
gem 'rails', '~>6.1.4'
Gemfileには一旦railsのみの記述をしておきます。
Gemfile.lockは用意するのみで何も書きません!
[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でプロジェクトを作成することで色々なファイルがカレントディレクトリにできると思います。
上記コマンドでその作業を行っています。
ツキヤ
ここまで行うと、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 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していただければ喜んでお答えします!