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

    DockerでRails環境を構築してみた

    くじらさんマークで有名な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を活用されてみてはいかがでしょうか?

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background