🐳

RailsのDocker化しよう!

2023/08/14に公開

はじめに

どうも、どすこいです。
文系大学生をしております。日々のプログラミングの勉強をアウトプットするために書いております。
今回は、ローカルで作ったRailsのアプリをDocker化してデプロイしたいと思いこの記事を作成しております。
今回の記事では、データベースにpostgresqlを使用しております。

対象読者

  • dockerを学びたての方
  • 自作したRailsアプリをDocker化したい人

環境

  • M2 Macbook Air
  • Railsアプリを作成済み

やらないこと

今回は、Dockerの細かな解説はしませんの予めご了承ください。

Dockerの環境構築

まずは、ディレクトリのrootにDockerfileとdocker-compose.ymlを作成します。

terminal
touch Dockerfile docker-compose.yml

続いて、Dockerfileを記述します。

Dockerfile
FROM ruby:3.2.2

RUN apt-get update && apt-get install -y build-essential \
    libpq-dev \
    nodejs \
    postgresql-client
RUN mkdir myapp
WORKDIR /myapp
COPY Gemfile Gemfile.lock /myapp/
RUN bundle install

続いて、docker-compose.ymlを書いていきます。

docker-compose.yml
version: '3.0'

volumes:
  db-data:

services:
  web:
    build: .
    ports:
      - '3000:3000'
    environment:
      - 'DATABASE_PASSWORD=postgres'
    volumes:
      - .:/myapp
    tty: true
    stdin_open: true
    depends_on:
      - db
    links:
      - db
  db:
    image: postgres:12
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    environment:
      - 'POSTGRES_PASSWORD=postgres'
      - 'POSTGRES_USER=postgres'

docker-compose.ymlにpostgresqlの設定を行ったので、railsのconfig/database.ymlを編集する必要があります。

database.yml
(中略)

default: &default
  adapter: postgresql
  encoding: unicode
  host: db //追加
  user: postgres //追加
  port: 5432 //追加
  password: <%= ENV.fetch("DATABASE_PASSWORD") %> //追加
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

(中略)

これで準備完了です。以下のコマンドを実行してください。

terminal
$ docker compose build //buildする
$ docker-compose run web rake db:create db:migrate
$ docker-compose up

localhost:3000でサーバーが起動していれば完了です。

おわりに

今回は、既存のRailsアプリをDocker化する方法についての記事でした。
意外に簡単だったと思います。
dockerは便利ですよね。

参考にしたサイト・記事

https://docs.docker.jp/compose/rails.html

https://qiita.com/kenz-dev/items/b9e716204e0cd0cea447

https://www.udemy.com/course/aidocker/

Discussion