• トップ
  • ブログ一覧
  • DockerでRails環境を構築してみた
  • DockerでRails環境を構築してみた

    こやまん(エンジニア)こやまん(エンジニア)
    2022.05.12

    IT技術

    くじらさんマークで有名なDockerですが、仮想化をゴニョゴニョするんだなというふわふわした認識で、実際に自分自身で構築したことがなかったので、今回思い切って構築を試してみました。

    本記事は、2022年4月27日時点のものです。

    Dockerとは

    アプリケーションの構築、共有及び実行を効率的に行える、1300万人以上の開発者、700万以上のアプリケーションに利用されているソフトウェアです。

    コンテナを積んだクジラのロゴが有名で、コンピューターの資源を分離するコンテナ仮想化を表しているようです。

    Dockerを利用することで、従来は、時間を要していた環境構築がスムーズに進み、開発作業に専念することが出来ます。

    Docker

    実際にDockerを使ってみる

    前提

    1. Dockerを導入済みであること
    2. Macを利用していること(Windowsの場合、一部コマンドは変えないといけないのでご注意ください)

    今回は、RailsのTodoアプリをDocker環境で動かしてみたいと思います。

    ① ディレクトリを作成する($を外して、ターミナル等に入力してください)

    1$ mkdir Documents/Rails_Todo_Docker

    ② 作成したディレクトリに移動する

    1$ cd Documents/Rails_Todo_Docker

    ③ RailsのToDoアプリケーションをGithubからクローンする

    1$ git clone https://github.com/KonoLevel1/Rails_ToDo.git

    ④ クローンしたディレクトリに移動する

    1$ cd Rails_Todo

    ⑤ Dockerfileを作成する

    1$ touch Dockerfile

    Dockerfile

    Dockerイメージを作成する際に使用するファイルです。

    1# ベースとなるイメージの指定(rubyのバージョン3.0.3を指定)
    2FROM ruby:3.0.3
    3
    4# ビルド時に実行するコマンドの指定
    5# インストール可能なパッケージの一覧の更新
    6RUN apt-get update -qq \
    7# パッケージのインストール(nodejs、postgresql-client、npmを指定)
    8&& apt-get install -y nodejs postgresql-client npm \
    9&& rm -rf /var/lib/apt/lists/* \
    10&& npm install --global yarn
    11
    12# 作業ディレクトリの指定
    13WORKDIR /myapp
    14COPY Gemfile /myapp/Gemfile
    15COPY Gemfile.lock /myapp/Gemfile.lock
    16RUN bundle install
    17# Add a script to be executed every time the container starts.
    18COPY entrypoint.sh /usr/bin/
    19RUN chmod +x /usr/bin/entrypoint.sh
    20ENTRYPOINT ["entrypoint.sh"]
    21EXPOSE 3000
    22# Configure the main process to run when running the image
    23CMD ["rails", "server", "-b", "0.0.0.0"]

    ⑥ 作成したDockerfileに上記をまるごと貼り付ける

    ⑦ docker-compose.ymlを作成する

    1$ touch docker-compose.yml

    docker-compose.yml

    docker-compose.ymlでは、複数のコンテナ定義を記述し、複数のコンテナを管理するためのファイルです。

    2022年4月27日現在、最新のバージョンは、3.8となっています。

    1version: "3"
    2services:
    3  db:
    4    # コンテナ名の指定
    5    container_name: rails_todo_db
    6    # イメージの指定
    7    image: postgres:14.2-alpine
    8    # データの永続化(ホスト側のtmp/dbディレクトリにマウントする)
    9    volumes:
    10      - ./tmp/db:/var/lib/postgresql/data
    11    # 環境変数の指定(初期設定値)
    12    environment:
    13      POSTGRES_PASSWORD: password
    14  web:
    15    # コンテナ名の指定
    16    container_name: rails_todo_web
    17    # Dockerfile のあるディレクトリのパスを指定(imageかbuildを必ず指定する必要がある)
    18    build: .
    19    # デフォルトのコマンド指定(Rails特有の問題解消とRails立ち上げを指定している)
    20    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    21    # データの永続化(ホスト側のカレントディレクトリにマウントする)
    22    volumes:
    23      - .:/myapp
    24    # ポートの指定(外部からのアクセス時のポート:Dockerコンテナからアクセス時のポート)
    25    ports:
    26      - "3000:3000"
    27    # 依存関係の指定(dbが起動した後に、webが起動するようになる)
    28    depends_on:
    29      - db

    ⑧ 作成したdocker-compose.ymlに上記をまるごと貼り付ける

    entrypoint.shを作成する

    1$ touch entrypoint.sh

     

    entrypoint.sh

    Rails固有の問題を修正するためのファイルです。sarver.pidというファイルがネックになるため、毎回削除するようにします。

    1#!/bin/bash
    2set -e
    3
    4# Remove a potentially pre-existing server.pid for Rails.
    5rm -f /myapp/tmp/pids/server.pid
    6
    7# Then exec the container's main process (what's set as CMD in the Dockerfile).
    8exec "$@"

    ⑩ 作成したentrypoint.shに上記をまるごと貼り付ける

    ⑪ サービスを構築する

    1$ docker-compose build

    ⑫ 立ち上げ

    1$ docker-compose up -d

    ⑬ コンテナに入る

    1$ docker container exec -it rails_todo_web bash

    ⑭ マイグレーション

    1$ rails db:migrate

    ⑮ 下記にアクセスして動作することを確認

    http://localhost:3000

    これで、ローカル環境にDockerでRailsの環境構築を行うことができました。

    Dockerで環境構築を行っているので、例えローカルにRails環境がなくとも動作します。

    勿論、Dockerfileやdocker-compose.ymlの内容を変えることで、Rails以外にも様々な環境が構築できます。

    皆さんも、環境構築にDockerを活用されてみてはいかがでしょうか?

    こやまん(エンジニア)

    こやまん(エンジニア)

    おすすめ記事