見出し画像

【保存版】DockerでRailsを立ち上げてみよう

今回はこちらのブログに沿って、DockerRailsの開発環境を作ってみたいと思います。

1 必要なファイルを用意する

今回必要なファイルは次の4つです。

① docker-compose.yml
② Dockerfile
③ Gemfile
④ Gemfile.lock

まずは、上のように準備しました。

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つを実行しています。

①apt-get update
②apt-get install

2ー2ー2 apt-getとは?

「apt-get update」でインストール可能なパッケージの一覧を更新します。

https://qiita.com/YumaInaura/items/dd50ba59c245a0a5f3f1

なお、「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の詳細はこちらを参考にどうぞ。

https://pikawaka.com/rails/bundler

「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つを行います。

①出力表示を見やすく(ttyをtrueに)
②入力可能に(stdin_openをtrueに)

5 imageを作る(docker-compose build)

次のコマンドでコンテナ用のimageを作ります。

docker-compose build

下のように「Building web」「web」コンテナの作成が始まります。

具体的には「Dockerfile」が読み込まれて作られています。

6 コンテナの作成・起動(docker-compose up)

「docker-compose up -d」コンテナの作成・起動を行います。

コンテナの一覧を出してくれる「docker ps」で見てみると、コンテナが立ち上がっていることがわかります。

7 起動したコンテナに入る

docker-compose exec コンテナ名 実行コマンド

で、コマンドを実行することができます。

ここでは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のコンテナを結びつけています。

①結びつけ ⇨ links:
②順番 ⇨ depends_on:

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」stopremoveが行われます。

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にホワイトリストを追加することで対応しました。


サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊