1
1

More than 1 year has passed since last update.

docker-composeで開発環境を構築するやり方

Posted at

本記事ではrails+postgreSQLを使用したアプリケーションをdocker-composeを使用してdocker化するやり方を記載する。

  • 使用ファイル構成
    スクリーンショット 2023-09-18 20.21.08.png
    このRailsのアプリケーションをdocker化する

  • 作成するファイル

Dockerfile
FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile Gemfile.lock /myapp/
RUN bundle install

apt-get updateでパッケージリストを更新してその後に必要なパッケージをapt-get installでインストールします。
-yオプションをオプションを指定して確認プロンプトを自動でスキップする。

docker-compose.yml
version: '3'

volumes:
  db-data:

services:
  db:
    image: postgres:12
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    environment:
      - 'POSTGRES_USER=postgres'
      - 'POSTGRES_PASSWORD=postgres'
  web:
    build: .
    command: >
      bash -c "rm -f tmp/pids/server.pid && rails db:create && rails db:migrate && rails s -b 0.0.0.0"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    environment:
      - 'DATABASE_PASSWORD=postgres'
    depends_on:
      - db
    tty: true
    stdin_open: true
    links:
      - db

volumes:
  db-data:

コンテナを終了or削除してもデータを保持できるようデータベースの中身をホストへ同期します。

まずはwebコンテナについてです。webコンテナは名前の通りwebサーバーとなるコンテナで、ここでrailsを実行しています。

WEB
  web:
    build: .
    command: >
      bash -c "rm -f tmp/pids/server.pid && rails db:create && rails db:migrate && rails s -b 0.0.0.0"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    environment:
      - 'DATABASE_PASSWORD=postgres'
    depends_on:
      - db
    tty: true
    stdin_open: true
    links:
      - db
command: >
      bash -c "rm -f tmp/pids/server.pid && rails db:create && rails db:migrate && rails s -b 0.0.0.0"

commandではコンテナ起動時に実行するコマンドを指定できます。以下のコマンドが順番に実行されます。

bash -c
以降の文字列をシェルで実行する

rm -f tmp/pids/server.pid
前回のサーバーのプロセスID(PID)ファイルを強制的に削除します。これは、アプリケーションサーバーが以前のセッションからクリーンアップされなかった場合の問題を防ぐためのものです。server.pidが存在すると、WEBサーバが起動中(プロセスがある)と判断され、下記のエラーが発生します。
A server is already running. Check /tmp/pids/server.pid. Exiting

rails db:create
Railsのデータベースを作成します。

rails db:migrate
データベースのマイグレーションを実行します。

rails s -b 0.0.0.0
Railsのサーバーを起動します。

    volumes:
      - .:/myapp

ホストPCとコンテナ内のファイルを同期します。ホストPCのカレントディレクトリとコンテナ内の/myapp配下を同期しています。

environment:
      - 'DATABASE_PASSWORD=postgres'

コンテナ内で扱う環境変数を設定します。データベースのパスワードとして'postgres'を設定しています。

tty: true
stdin_open: true

docker run -itと同義

depends_on:
  - db

コンテナ間の依存関係を設定しています。dbコンテナが起動した後webコンテナを起動します
"webコンテナはdbコンテナが必要なのでdbコンテナから立ち上げてね”という意味になります。

links:
  - db

webコンテナとdbサービスが通信できるようにリンクします。

db
 db:
    image: postgres:12
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    environment:
      - 'POSTGRES_USER=postgres'
      - 'POSTGRES_PASSWORD=postgres'
volumes:
      - 'db-data:/var/lib/postgresql/data'

前述のdb-dataボリュームをPostgresのデータディレクトリにマウントします。

config/database.yml

database.yaml
.
.
.
# 開発環境
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 } %>
.
.
.

adapterにはRailsアプリケーションが使用するデータベースの種類を設定します。今回はpostgresを使用するので'postgresql'としています。
ちなみにmysqlの場合は'mysql12'、sqliteの場合は'sqlite3'のようにデータベースの種類によって値が決まっています。

portは'5432'とします。これはPostgreSQLデータベースのデフォルトのTCPポート番号です。postgresを使用する場合'5432'を使用するのが一般的なようです。

passwordはdocker-compose.ymlのdbコンテナ部分で指定した'POSTGRES_PASSWORD=postgres'とリンクしています。

アプリケーションの立ち上げ

ここまで完了すればあとはdocker-compose up -dでコンテナを起動しlacalhost:3000でアプリケーションにアクセスできるようになります。
-dオプション:コンテナをバックグランドで動作させる

以上がWebアプリケーション(Ruby on Rails7.6 × postgres12)をdocker化する手順となります。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1