Help us understand the problem. What is going on with this article?

DockerでRailsの環境構築してHerokuへデプロイする

More than 1 year has passed since last update.

はじめに

3週間くらい前に初めてDockerに触れて、その時のメモを放置したままだったので、改めてまとめました。

Dockerに初めて触れた時に練習としてやった超簡単な環境構築の話なので、私のように、Docker触ったことない・これから触ってみたいという人を対象とした記事になっています。

また、Dockerへの理解はまだまだ浅いこともあるため、間違った部分があったり、非効率的な導入方法になっているかもしれない点はご了承ください!(アドバイス等あれば是非ご教示いただければ幸いです!)

前提

  • MacOS
  • Ruby, Rails, PostgreSQLなど、最新版を使用

Dockerとは?

詳細は割愛します。「Dockerとは」等でググったら出てくるので今回はそちらにお任せしたいと思います。

個人的には以下の記事が初心者的には分かりやすいと思いました。

DockerでRuby on Railsの開発をしよう

また、ドットインストールで概要だけでも知るのもいいかもしれません(少し公開日が古いです)。

ドットインストール Docker入門 (全11回)

個人的に感じたメリットとしては、Dockerで環境構築して設定すれば、PCが変わってもそのPCにDockerがあればすぐに同じ環境を用意できる点などで、一度用意しておけば環境構築に時間を取られなくなるのは魅力的だなと思いました。

DockerでRailsの環境構築してHerokuへデプロイするまでの流れ

Dockerのインストール

DockerHubに登録して、Macユーザーの場合はDocker for Macをインストールします。

これ以上特筆すべき点はないと思うので次に進みます。

Docker基本コマンド

Dockerコマンド一覧DockerでRuby on Railsの開発をしように載っているのでここでは割愛します。

DockerでRuby/Railsの環境構築

好きなディレクトリに移動して作業

% cd /Users/fuku_tech/works/myapp

Dockerfileを作成

% vim Dockerfile
または
% touch Dockerfile

Dockerfileの中を記述

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"]

次にGemfileとGemfile.lockを作成
初めて触る時は何でGemfileとかここで作るん?ってなりましたが、気にせず作って下さい。

% touch Gemfile && touch Gemfile.lock

そしてGemfileの中身を以下の通り記述

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

続いてdocker-compose.ymlを作成&中身を追加
こちらを参考に作りました。

docker-compose.yml
version: '3'
services:
  db:
    image: postgres
    ports:
      - '5432:5432'
    volumes:
      - postgresql-data:/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
volumes:
  postgresql-data:
    driver: local

公式に従ってentrypoint.shを同ディレクトリに追加

% touch entrypoint.sh

以下のシェルスクリプトを追加したら、server.pidファイルがあるときにサーバーが再起動するのを妨げてしまうというRails特有の問題を解消してくれるとのこと。

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 "$@"

そしてdocker上でrails newするために以下のコマンドを実行

% docker-compose run web rails new . --force --no-deps --database=postgresql

lsコマンドで確認したら沢山ファイルが生成されてます

% ls
Dockerfile              config/                 package.json
Gemfile                 config.ru               public/
Gemfile.lock            db/                     storage/
README.md               docker-compose.yml      test/
Rakefile                entrypoint.sh           tmp/
app/                    lib/                    vendor/
bin/                    log/

イメージをbuildして

% docker-compose build

database.ymlを設定

config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password:
  pool: 5

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>

コンテナを作成&起動でrailsサーバーが立ち上がります。

% docker-compose up

# psコマンドで起動確認
% docker-compose ps
   Name                  Command               State           Ports         
-----------------------------------------------------------------------------
myapp_db_1    docker-entrypoint.sh postgres    Up      0.0.0.0:5432->5432/tcp
myapp_web_1   entrypoint.sh bash -c rm - ...   Up      0.0.0.0:3000->3000/tcp

最後にローカル環境のDBを作成&migrate

# DB作成
% docker-compose run web rake db:create
# migrate実行
% docker-compose run web rails db:migrate

ブラウザでlocalhost:3000にアクセスするとrailsの初期画面が出現

image.png

Herokuへデプロイ

下記リンクを参考にしながら実施しました。

docker-composeでRailsを開発しCircleCI 2.0でテストしてHerokuにdeployする
Container Registry & Runtime (Docker Deploys)

# herokuのコンテナレジストリにログイン
heroku container:login

# 新しいappを作成
heroku create

# イメージを作成してコンテナレジストリにpush
heroku container:push web

# postgresqlアドオンの無料プランを追加
heroku addons:create heroku-postgresql:hobby-dev

# DBセットアップ
heroku run rails db:migrate

# イメージをherokuへデプロイ
heroku container:release web

# 実際にアクセスして/usersを確認してみる
heroku open

まとめ

  • 遂に、ずっと気になっていたDockerに着手できました。
  • 導入自体は滞りなくすることができましたが、今後、CircleCIを噛ませて自動テスト&デプロイできるような環境にするべく引き続き調査&実験を続けたいと思います。
  • また、ミドルウェアを入れたりとより本格的な環境構築にもチャレンジしていきDockerを上手く利用できるようになりたいと思います。

参考URL

fuku_tech
元化学系研究者/2019.3月にエンジニアへ転向/Ruby/Rails/GAS/GCP/BigQuery/自動化・ML・MLOps・DevOps・DataOpsなどにも興味あり/日々の学びをアウトプットしています
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした