🚢

WindowsでDocker + Rails + Postgresqlの環境構築をやってみる

2023/12/09に公開

概要

ゼロからRailsの開発環境をDockerを使って構築します。
データベースはPostgresqlを想定しています。
gitなどからアプリのリポジトリをクローンしてこなくても、"rails new"で新しいプロジェクトを作ることができます。

対象者

  • Railsの開発用環境を作りたい方。
  • VSCodeを使っているDocker初心者の方。
  • RailsとPostgresqlの環境を作りたい方。

準備

  • Windows10またはWindows11が入ったPC。
  • WSL2 (Ubuntu 20.04)がインストールされていること。
  • docker, docker-composeがインストールされていること。

dockerのインストールについては、いろいろ分かりやすい記事があるのでググってみるといいかもしれない。
自分の知るところでは、方法は大きく3つあって、Docker Desktopを使う方法、Rancher Desktopを使う方法、wslに直接dockerエンジンをインストールする方法があげられる。
ここでの作業では、どの方法でも支障はないので、各々の環境や好みに合わせて選ぶとよいだろう。

各種ファイルの用意

作業ディレクトリtest_railsを作成し、以下のようなディレクトリ構成にする。

  • test_rails
    • build
      • init
        • Gemfile
        • Gemfile.lock
      • compose.yml
      • Dockerfile
    • test_app

Gemfile、Gemfile.lockの用意

Gemfileの中身は以下のように書いておく。

source "https://rubygems.org"
gem 'rails'

Gemfile.lockは空のファイルでOK!

Dockerの確認

dockerが入っているかどうかを確認しておく。

docker -v
docker compose -v

バージョン情報が表示されればOK!

Dockerfileの作成

Dockerfileとcompose.yamlを以下のように書く。

Dockerfile
# Rubyのイメージをとってくる
FROM ruby:3.1
# 必要なパッケージのインストール
RUN apt update -qq && apt install -y postgresql-client nano vim iputils-ping net-tools

# いったん適当なところでbundle installしておく。
WORKDIR /tmp
# Gemfileのコピー
COPY ./init/Gemfile /tmp/Gemfile
COPY ./init/Gemfile.lock /tmp/Gemfile.lock
# Railsのインストール
RUN bundle install

# server.pidを削除しておく(残っているとエラーになるため)
RUN rm -f tmp/pids/server.pid
# コンテナが使用するポート
EXPOSE 3000

# 作業ディレクトリへ移動(なければ自動で作る)
WORKDIR /test_app

よくある記事だと、ホストに"git clone"などでアプリのディレクトリを用意し、それをコンテナ内にコピーして持ってくるように書いてある。
ここではゼロから作るのでアプリのディレクトリは空で用意している。
アプリのデータはボリュームマウントでコンテの中のものを持ってくる形でから永続化するので、後から作られる。
また、後でコンテナ内に入って"rails new"コマンドを打ちたいので、あらかじめRailsをbundleを使ってインストールしている。

compose.yml
# 各サービス名
services:
  db:
    # DBコンテナ名
    container_name: postgres_db
    # イメージ名(Pullしてくる)
    image: postgres
    # ボリュームのマウント
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    # 環境変数の設定
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
  rails-web:
    # Railsコンテナ名
    container_name: rails_web_test
    # Dockerfileへのパス
    build: .
    # ビルドされたイメージのタグ
    image: test_app/rails-web:1.0.0
    # ボリュームマウント
    volumes:
      - ../test_app:/test_app
    # 環境変数の設定
    environment:
      POSTGRES_HOST: db
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    # ポートフォワード(ホストのポート:コンテナのポート)
    ports:
      - "3000:3000"
    # プロセスがなくてもコンテナを起動させ続ける
    tty: true
    # dbを作ってからRailsコンテナを立ち上げる
    depends_on:
      - db

serviceのrails-webがRailsコンテナ、dbがpostgresqlサーバーのコンテナになっている。
開発がしやすいようにアプリのディレクトリをホストにマウントしている。

検証用Railsアプリ作成

確認用にRailsアプリを立ち上げる。
まずイメージを作る。

docker compose build

イメージの確認をする。

無事に確認出来たらイメージを使ってビルドする。

docker compose up -d

コンテナが動いていることを確認する。

docker compose ps

表示されればOK!

VSCodeの左下のタブからAttache to Running Containerを選択して、rails-webのコンテナに接続する。
新しくターミナルを開く。

以下のコマンドで新しいプロジェクトを作る。

rails new myapp -d postgres

myapp/config/database.yamlのdefault部分を編集する。
以下にファイルの一部抜粋を示す。

database.yml
default: &default
  adapter: postgresql
  encoding: utf-8
  host: <%= ENV["POSTGRES_HOST"] %>
  username: <%= ENV["POSTGRES_USER"] %>
  password: <%= ENV["POSTGRES_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 } %>

編集して保存ができたらターミナルで以下を実行する。

rails db:create
bundle install
rails s -b 0.0.0.0

localhost:3000へアクセスしてデフォルト画面が表示されればOK!

所感

Docker周りのエラーは最初はとっつきにくいですが、だんだん慣れてきます。
エラー分を見ても見当がつかなければ、いったんChatGPTに聞いたりググってみましょう。
自分も勉強しながら書いているので、まずいところがあればご指摘いただけますと幸いです。

Discussion