はじめに
Mac環境で、docker-composeを使い、既存のrailsアプリをDocker化する方法をまとめました。
今回はdocker-composeにふれるのがメインです。docker-composeは、複数のコンテナを組み合わせて1つのアプリケーションとして構成を定義するファイルです。今の主流になります。
1つだけコンテナをつくることももちろん可能です。
環境
以下の環境で構築しました。
macOS Sequoia 15.6.1
Rails 7.0.6
ruby 3.2.2
Postgres 12
手順
1. Macのターミナル(Terminal)を起動。
2. GitHub内で作成したrailsアプリをgit clone <リポジトリのURL>コマンドで、ローカル環境へ。(ディレクトリは任意の場所で問題なし)
- この記事ではDesktop内に
cloneしたリポジトリをおいて説明。 - この記事では、既存のrailsアプリを「https://github.com/ihatov08/rails7_docker_template」を使用しています。
-
Use this templateを選択し、自分のリポジトリ配下に置いてください。
-
3. 【下準備】Docker化するのにRailsとpostgreSQL2つのコンテナを立てる。
- ディレクトリ dockerの作成:
mkdir docker -
cd dockerでディレクトリ内に移動 - docker内にDockerfileの作成:
touch Dockerfile(以下のコードを入力vi/vim Dockerfileで編集)
# ベースイメージの指定
FROM ruby:3.2.2
# パッケージのインストールと更新
RUN apt-get update -qq && apt-get install -y --no-install-recommends nodejs postgresql-client build-essential libpq-dev && rm -rf /var/lib/apt/lists/*
# 作業ディレクトリの指定
WORKDIR /myapp
# fileの追加
COPY Gemfile Gemfile.lock ./
# gemをインストールする際のコマンド
RUN bundle install
COPY . /myapp
- docker-compose.ymlの作成:
touch docker-compose.yml(以下のコードを入力vi/vim docker-compose.ymlで編集)
services:
# dbコンテナの設置
db:
container_name: rails-docker-db
image: postgres:12
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
volumes:
- type: volume
source: rails-docker-db-volume
target: /var/lib/postgresql/data
# webコンテナの設置
web:
build:
context: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
volumes:
- type: bind
source: .
target: /myapp
ports:
- '3000:3000'
depends_on:
- db
volumes:
rails-docker-db-volume:
注意
バージョンを指定するversion: '3'をservices:前に記入していましたが、Docker Compose v2 以降では、version: 行が不要。
- gemfileを作成:
touch gemfile(以下のコードを入力vi/vim gemfileで編集)
ruby "3.2.2"gem
"rails", "~> 7.0.6"
4. config/database.ymlの編集
postgreSQLの設定を行います。以下のコードを入力(vi/vim config/database.ymlと入力)。
default: &default
adapter: postgresql
encoding: unicode
host: db
username: <%= ENV['POSTGRES_USER'] %>
password: <%= ENV['POSTGRES_PASSWORD'] %>
port: 5432 # For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: myapp_development
5.Docker化するのにRailsとpostgreSQL2つのコンテナを立てる。docker-compose buildでイメージの作成。
5. docker-compose up -dでコンテナの作成と起動。
-dはデタッチドモード(バックグラウンド実行)
6. docker-compose exec web bashでコンテナの中に入る。
ここでコンテナに入るので、ユーザ名がroot等に変更します。
7. rails db:createでデータベースを作成。
すでにあっても問題ありません。
8. rails db:migrateでデータベースの更新。
9. 最終確認
ブラウザ上でhttp://localhost:3000にアクセス。ブラウザ上でアプリケーションが確認できれば完成です。
これでrailsアプリをDocker化する手順は以上です。お疲れ様でした。
ブランチを別にし、mainにpull&mergeするやり方もできます。
よくあるエラー
Dockerfile や docker-compose.yml にて、Rubyやrailsのバージョン同士に適正があるので、組み合わせとして相応のものを記述してください。詳しくは下のサイトにあります。