はじめに
今回はdocker-composeで既存のrailsアプリをDocker化する方法をまとめました。
Dockerの学習がメインのためRubyやRailsに詳しくなくても実施できます!
docker-composeとは
複数のコンテナを組み合わせて1つのアプリケーションとして構成を定義するファイルです。
docker-compose
を使用ことで以下のメリットがあります。
- docker run コマンドを短くすることができる
- 複数のコンテナをまとめて起動できる
docker run
コマンドは複数のオプションを使用する場合があるためどうしても長くなってしまいます。それをdocker-composeが解消してくれます!
※docker-composeにはdocker-compose.yml
が必要です。
環境
以下の環境で構築してます。
Rails 7.0.6
ruby 3.2.2
postgres 12
手順
Docker化するのにRailsとpostgres2つのコンテナを立てるためdocker-composeを使用しています。
はじめに一通りの流れを説明します。
-
Dockerfile
の作成 -
docker-compose.yml
の作成 -
database.yml
の編集 - コンテナを起動
- ブラウザ上で動作確認を実施
事前準備
- 既存のrailsアプリの準備
- Dockerを起動させておく
Dockerfileの作成
Dockerfileとはアプリケーションのビルドに必要な設定(動作させるのに必要なサーバー等の)が書かれたファイルです。以下がファイルの中身です。
こちらの記事を元に作成しています。
# ベースイメージの指定
FROM ruby:3.2.2
# パッケージのインストールと更新
RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y postgresql-client --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
# 作業ディレクトリの指定
WORKDIR /myproject
# fileの追加
ADD Gemfile /myproject/Gemfile
ADD Gemfile.lock /myproject/Gemfile.lock
# gemをインストールする際のコマンド
RUN bundle install
ADD . /myproject
※Dockerfileで指定するベースイメージは、プロジェクトのRubyバージョンに合わせておく必要があるためGemfile
(Railsアプリで利用するgemの一覧を管理するファイル)を確認しましょう。
ruby "3.2.2"gem
"rails", "~> 7.0.6"
docker-compose.ymlの作成
次はdocker-composeを使用するためにdocker-compose.yml
を作成します。これはアプリケーションを構成するサービスを記載し、それらを一括で実行してくれるものです。
# バージョンを指定
version: '3'
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:
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
デフォルトではなかったhost
username
password
を今回追加しています。
usernameとpasswordは環境変数に置き換えています。
コンテナの作成と実行
ここまでできたらいよいよコンテナを立ち上げます。
以下の順でコマンドを実行してください。
イメージの作成
docker-compose build
コンテナの作成と起動
docker-compose up -d
コンテナの中に入る
docker-compose exec web bash
dbの作成
rails db:create
dbの更新
rails db:migrate
ブラウザ上でlacalhost:3000
にアクセス
ブラウザ上でアプリケーションが確認できれば完成です。
これでrailsアプリをDocker化する手順は以上です。
さいごに
最後まで読んでいただきありがとうございました。
自己学習用の記事ではありますが、同じくdockerやrailsを学習している方の参考になれれば幸いです。
以下、参考教材・記事になります。
Udemy「米国AI開発者がゼロから教えるDocker講座」
実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本
既存のRailsアプリにDockerを導入する手順