【保存版】DockerでRailsを立ち上げてみよう
今回はこちらのブログに沿って、DockerでRailsの開発環境を作ってみたいと思います。
1 必要なファイルを用意する
今回必要なファイルは次の4つです。
まずは、上のように準備しました。
touch {docker-compose.yml,Dockerfile,Gemfile,Gemfile.lock}
2 Dockerfile
では、Dockerfileに以下をコピペしましょう。
FROM ruby:2.5
RUN apt-get update && apt-get install -y \
build-essential \
libpq-dev \
nodejs \
default-mysql-client \
yarn
WORKDIR /RailsMySQLSample
COPY Gemfile Gemfile.lock /RailsMySQLSample/
RUN bundle install
一つ一つ見ていきましょう。
2ー1 環境の指定(From)
まずは、どの環境を使うのかを指定します。
今回はRubyを使うので下のように指定します。
なお、「2.5」はバージョンの指定です。
指定しなければ、最新になります。
2ー2 インストール
では、次にインストールを見ていきましょう。
2ー2ー1 RUN
「RUN」の後に実行するコマンドを書きます。
「RUN」は他の箇所でも使われます。
つまり、今回は、次の2つを実行しています。
2ー2ー2 apt-getとは?
「apt-get update」でインストール可能なパッケージの一覧を更新します。
なお、「apt-get update」だけではインストールが行われないのため、その後にインストールを行っています。
2ー2ー3 小まとめ
つまり、インストールの箇所でやっていたのは、下の5つを更新して、インストールしていたのですね。
2ー3 作業場所の指定(WORKDIR)
どこで作業が行われるのかを指定します。
「/」はルート(一番上のディレクトリ)です。
その直下の「RailsMySQLSample」が作業場になるようです。
2ー4 Docker内にファイルを作る(COPY)
ローカル環境で作ったファイルをどのようにしてDocker内に持っていくでしょう。
それが「COPY」です。
上のように、ローカルで作る「Gemfile」「Gemfile.lock」の2つを「RailsMySQLSample」内に持っていきます。
2ー5 依存関係のインストール(RUN bundle install)
最後に、「bundle install」で「Gemfile」に書かれているものをインストールします。
ちなみに、bundle installの詳細はこちらを参考にどうぞ。
「Gemfile.lock」にないものをインストールします。
3 Gemfileについて
次はGemfileについてです。
ここに書かれているものが「bundle install」によってインストールされます。
source 'https://rubygems.org'
gem 'rails', '~>5.2'
4 docker-compose.yml
4ー1 どんなコンテナを作るの?
「services:」の下の階層に作りたいコンテナ名を書きます。
今回は「web」というコンテナを作ります。
version: '3'
services:
web:
build: .
ports:
- '3000:3000'
volumes:
- '.:/RailsMySQLSample'
tty: true
stdin_open: true
4ー2 どこのファイルをもとに作られるの?(build)
コンテナは第2章の「Dockerfile」をもとに作られます。
その「Dockerfile」の場所を指定しているのが「build」です。
「.」で同じフォルダ内であることを示しています。
4ー3 どこのポートで接続するの?(ports)
作るコンテナをどこの出入り口で接続するのかを指定します。
Railsはデフォルトで3000番なのでその番号に接続します。
4ー4 データの参照先を設定(volumes)
コンテナには基本的にはデータは保管しません。
なぜならコンテナは作って壊すというサイクルを前提としているためです。
コンテナ内にデータがあったら、壊す過程でなくなってしまいますね。
そのため、データの参照先を設定します。(マウントと呼ばれます。)
上のようにすることで、コンテナ内の「/RailsMySQLSample」にアクセスすればホスト側のカレントディレクトリの中を参照できます。
4ー5 その他の設定(tty,stdiin_open)
その他の設定として、次の2つを行います。
5 imageを作る(docker-compose build)
次のコマンドでコンテナ用のimageを作ります。
docker-compose build
下のように「Building web」で「web」コンテナの作成が始まります。
具体的には「Dockerfile」が読み込まれて作られています。
6 コンテナの作成・起動(docker-compose up)
「docker-compose up -d」でコンテナの作成・起動を行います。
コンテナの一覧を出してくれる「docker ps」で見てみると、コンテナが立ち上がっていることがわかります。
7 起動したコンテナに入る
で、コマンドを実行することができます。
ここではwebコンテナでbashを起動しています。
これにより、コンテナ内のworkdirに入ることができました。
8 Railsのアプリケーションを作る
では、「Rails new」でアプリケーションを作っていきましょう。
rails new . --force -d mysql --skip-bundle
ちなみに今回は「Rails new .」で同じ階層に作っています。
今回使ったオプションは次のとおりです。
データベースの設定やGemfileの上書きを行っています。
ちなみにGemfileの中身はこのように変わっていました。
9 docker-compose.ymlの修正
9ー1 dbの追加
dbを下のように追加します。
マウント先の「data」はdocker内に作成しています。
imageは既にあるものを使用しています。
version: '3'
volumes:
data:
services:
web:
build: .
ports:
- '3000:3000'
volumes:
- '.:/RailsMySQLSample'
tty: true
stdin_open: true
environment:
- 'DATABASE_PASSWORD=password'
depends_on:
- db
links:
- db
db:
image: mysql:5.7
ports:
- '3306:3306'
volumes:
- 'data:/var/lib/mysql'
environment:
MYSQL_ROOT_PASSWORD: password
また、「environment」を用いて環境変数の設定も行っています。
9ー2 コンテナの接続(webとdb)
次に、webとdbのコンテナを結びつけています。
10 データベースの設定(database.yml)
自動で作られた「database.yml」を下のように修正します。
「host」を今回新しく作ったコンテナの「db」にしています。
password: <%= ENV.fetch("DATABASE_PASSWORD") %>
host: db
port: 3306
その他、passwordも「docker-compose.yml」で設定した環境変数を取得しています。
ENV.fetch()で取得し、変数展開していますね。
11 dockerコンテナの再起動
11ー1 現在のコンテナの削除
まずは現在のコンテナを削除します。
既に立ち上げているコンテナにはdbとの接続などが設定されていないためです。
上のように「docker-compose down」でstop→removeが行われます。
11ー2 新しいコンテナの起動
docker-compose buildでimageを作成し、docker-compose upでコンテナを起動します。
今回はそれらを同時に行う「docker-compose up -d --build」で行いました。
「docker ps」で上のように確認ができました。
また、dbのイメージは「docker-compose.yml」で指定した「mysql:5.7」が適切に使われていました。
12 Webコンテナに入る
「docker-compose exec コンテナ名 コマンド名」を使います。
下のようにbashが起動しています。
また、上のように、今回のwebのコンテナIDの「a573e00461a0」に入り、WorkDirとして設定した「/RailsMySQLSample」にいることも確認できます。
13 DBを作成する
「database.yml」で自動で命名された、下の2つのDBを作りましょう。
既にbashを起動しているので、「rails db:create」で作りましょう。
14 rails g scaffoldでサンプルを作る
rails g scaffoldでサンプルアプリを作ってみましょう。
rails g scaffold Member Name:string Sex:string
14ー2 テーブルの反映
rails g scaffoldでできた、マイグレーションファイルを反映させましょう。
rails db:migrate
14ー3 rails cでレコードの作成
テーブルができたので、レコードも試しに作成してみます。
「rails c」でコンソールに行き、新しいレコードを作成します。
Member.create(Name:"Hanako", Sex:"women")
上のようにレコードが作成されていました。
15 アプリを確認する
15ー1 サーバーを起動する
「rails s -b 0.0.0.0」でサーバーを起動します。
localhost:3000に行くと、下のように接続ができました。
localhost:3000/membersに行くと、先ほど作成したデータも無事に表示されました。
その他
1 docker-compose ~ で「Can't find a ~」となった時
docker compose 〜を行うのに「docker-compose.yml」がないと言われています。
docker-compose.ymlがある階層に移動しましょう。
ちなみにこのファイルを「configuration file」というようですね。
2 localhost:3000にうまく繋げないとき
下のエラーが発生しました。
development.rbにホワイトリストを追加することで対応しました。
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊