dockerとdocker composeでwebアプリをdocker化する方法

初めに!

Dockerは軽量で高速に動作するコンテナ型仮想環境用ツールです。
従来の開発ではアプケーション開発と並行して環境構築を1から行う必要がありました。
しかしDockerを利用することで環境の一括管理することができ、大幅な効率化が図れます。
さらにDockerを利用することで他の開発者と環境を共有やバージョン管理を行うことで開発環境の標準化が行えるようになります。
よってDockerは現代の開発環境に必要不可欠な存在となっているのです。

目的

  • dockerとdocker-composeを使用してRailsアプリケーションとPostgressを簡単にセットアップし、実行していきます。

前提条件

  • まずはDockerとDocker Hubがインストールされていることが前提で進めていきます。
    まだの方は公式サイトインストールを行なってください。

大まかな方針

  1. Railsで記述したファイルを自分の環境に用意する。
  2. Dockerfileとdocker-compose.ymlの準備。
  3. database.ymlの追記。
  4. アプリケーションの実行。

手順

Railsで記述したファイルを自分の環境に用意する。

  • docker化するアプケーションを用意していきましょう!

  • 私は以下のものcloneしてwebアプリを用意しました。

$ git clone https://github.com/ihatov08/rails7_docker_template

Dockerfileとdocker-compose.ymlの準備。

  • 今回はRailsとPostgresSQLの2つのコンテナを使用するので
    docker-compose.ymlを使用します。

Dockerfile

FROM ruby:3.2.2
RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev \ 
    nodejs \
    postgresql-client \
    yarn
WORKDIR /workdir
ADD Gemfile Gemfile.lock /workdir/Gemfile
RUN bundle install
ADD . /workdir/

docker-compose.yml

version: '12'
services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: trust
  web:
    build: .
    command: /bin/sh -c "rm -f tmp/pids/server.pid && rails db:migrate && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/workdir
    ports:
      - "3000:3000"
    depends_on:
      - db
  tty: true
    stdin_open: true
  • 今回はPOSTGRES_PASSWORD:trustにしているが本来はPOSTGRES_PASSWORD:値にはきちんとパスワードを入力した方が良い。

テータベースに接続

  • docker-compose.ymlのサービスの定義を合わせるためにconfig/database.ymlを変更していきます。

  • config/database.ymlはデータベース設定についての詳細が記載されているファイル。

config/database.yml

default: &default
  adapter: postgresql
  encoding: unicode 
  host: db
  username: postgres
  password:
  pool: 5

データベースを作成する。

  • 初回のみ実行する。
$ docker-compose run web rake db:create
  • dbの中に新たなデータベースが作成される。

アプリケーションの起動

$ docker-compose up 
  • ブラウザにてhttp://localhost:3000/を入力するとアプリケーションが立ち上がります。

結語

  • 複数のコンテナを利用してアプリケーションを立ち上げる場合はdocker-composeを利用する。

  • docker-compose.ymlにはサービス定義部分に必要な数のコンテナ名を記述する。

  • アプリケーションとデータベースを接続を行うためにconfig/database.ymlを変更する。