LoginSignup
16
20

More than 3 years have passed since last update.

【最速】RailsにDockerを導入する方法

Posted at

背景

自分的に、公式は英語ばかりで読みづらく、qiita等の記事も少し抜けていたりしたので、自分なりに手順をまとめてみようと思いました。
Dockerとはなに?という人は、最後に参考記事をいくつか貼ってあるので参照ください。
万が一のエラー発生時の対策が書いてある記事も最後に貼ってあるので詰まったら確認してみてください!

手順

1.公式サイトでアカウント作成後、Dockerをインストールする。

2.まず、適当なディレクトリを作成する。

$ mkdir docker-sample 

3.作成したディレクトリに移動する。

$ cd docker-sample

4.Dockerfileを作成し、以下を記述する。


FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

※それぞれどのようなものか簡単に説明すると、、
[FROM] 使用するイメージとバージョン
[RUN] コマンドの実行。railsに必要な必要なnodejsとpostgeqsqlをインストールしている
[WORKDIR] そのままの意味。作業ディレクトリを設定します。
[COPY] ローカルのファイルをコンテナへコピーする
[ENTRYPOINT] 一番最初に実行するコマンド
[EXPOSE] コンテナがリッスンするport番号
[CMD] イメージ内部のソフトウェア実行

5.Gemfileを作成し、以下を記述する。
※rails newした後にGemfileは上書きされるので、現段階ではこれだけで良いです。


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

6.中身は空の状態のGemfile.lockを作成する。

$ touch Gemfile.lock

7.entrypoint.shというファイルを作成し、以下を記述する。

entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

8.docker-compose.ymlというファイルを作成し、以下を記述する。

docker-compose.yml
version: '3'
services:
  db:
    image: postgres
    ports: 
        - "5432"
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

※こちらもそれぞれを簡単に説明すると、、
[version] docker-composeのバージョンです。
[services] この下のハッシュにサービスを作ります。
[image] 使用するimage
[volumes] ディレクトリのマウント設定
[build] Dockerfiletなどがあるパス
[command] コマンド
[ports] ポート番号。[ホスト:コンテナ]で設定。
[depends_on] 依存関係を示していて、起動順を制御できます。ここではdb→webへと起動します。

9.rails newしてアプリの雛形を作成する。

$ docker-compose run web rails new . --force --no-deps --database=postgresql --skip-bundle

10.Gemfileが更新されたのでbundle installする。

$ docker-compose build

11.config/database.ymlの中身を一旦削除し、以下の記述をする。

config/database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: postgres
  pool: 5
development:
  <<: *default
  database: myapp_development
test:
  <<: *default
  database: myapp_test

12.コンテナを起動する。(処理が止まっているように見えますが、正常なので次のステップを実行してください)

$ docker-compose up

13.別ターミナルを開いてDBを作成する。

$ docker-compose run web rake db:create

14.localhost:3000/でしっかりRailsの画面が表示されればOKです!お疲れ様でした!

最後に

ここまでで導入は完了していると思いますが、細かいところの解説はあまりしていないので詳しく知りたい人はご自身で調べていただいて理解を深めていってください!参考記事を見てみるとより理解が深まると思います。

参考記事

Dockerをよく知りたい人は↓↓

Docker入門

【図解】Dockerの全体像を理解する -前編-

【図解】Dockerの全体像を理解する -中編-

【図解】Dockerの全体像を理解する -後編-

上記の手順でもエラーが出ちゃったよという人は↓↓

rails×Docker導入でのエラー①[docker-compose: command not found]

rails×Docker導入でのエラー②「django.db.utils.OperationalError: could not translate host name "db" to address: Name or service not known」

rails×Docker導入でのエラー③「PG::ConnectionBad: fe_sendauth: no password supplied」

rails×Docker導入でのエラー④FATAL: database "myapp_development" does not exist

16
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
20