👨‍🎓

Docker で Ruby on Rails の環境構築

2023/06/30に公開

○ はじめに

2 ヶ月の研修を振り返ってみると、Docker を用いた環境構築で毎回苦しんでいたなあと思います。「苦手意識は研修でおさらば!!」そんな気持ちでこの記事にアウトプットして、自分のモノにしていきたいと思います!

○ そもそも Docker ってなんだ?

Docker はアプリケーションを開発(developing)、移動(shipping)、実行(running)するためのオープンなプラットフォームです。

Docker を用いるメリットは以下

  • 他の環境への移行
    Docker コンテナは環境に依存しないため、異なる OS やクラウドでも動作することができます。これにより、アプリケーションを簡単に移植したり、異なる環境でテストしたりすることができます。
    → 開発者同士でバージョンの差異が生まれない!また、環境構築においてパッケージの依存関係を気にする必要がない!

  • セキュリティ
    Docker はコンテナごとに独立した環境を提供するため、アプリケーションのセキュリティを向上させることができます。コンテナ同士が隔離されており、リソースやネットワークへのアクセスが制限されます。また、Docker のイメージは再利用可能で、セキュリティパッチの適用や脆弱性の修正が容易です。


○ Docker Compose

Docker Compose とは、複数のコンテナを定義し実行する、Docker アプリケーションのためのツールです。Docker Compose は YAML ファイルを使い、アプリケーションのサービスを設定します。コマンドを1つ実行するだけで、設定内容に基づいた全てのサービスを生成・起動します。


○ Rails アプリケーション

じゃあやっていきましょう〜

環境

Ruby 3.1
Ruby on Rails 7.0.1
MySQL 5.7

作業ディレクトリの作成

$ mkdir app
$ cd app

必要なファイルを作成

$ touch {Dockerfile,docker-compose.yml,Gemfile,Gemfile.lock}

Dockerfile

FROM ruby:3.1

ARG RUBYGEMS_VERSION=3.3.20

WORKDIR /app

COPY Gemfile /app/Gemfile

COPY Gemfile.lock /app/Gemfile.lock

RUN gem update --system ${RUBYGEMS_VERSION} && \
        bundle install

COPY . /app

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3111

CMD ["rails", "server", "-b", "0.0.0.0"]

docker-compose.yml

version: "3"
services:
  web:
    build: .
    command: /bin/sh -c "bundle exec rails s -p 3111 -b '0.0.0.0'"
    volumes:
      - .:/app
    ports:
      - 3111:3111
    depends_on:
      - db
    tty: true
    stdin_open: true
  db:
    image: mysql:5.7
    platform: linux/amd64
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - db-volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      TZ: "Asia/Tokyo"
    ports:
      - "3306:3306"
volumes:
  db-volume:

Gemfile

source 'https://rubygems.org'
gem 'rails', '~>7.0.3'

entrypoint.sh

#!/bin/bash
# set -e は「エラーが発生するとスクリプトを終了する」オプション
set -e

# exec "$@"でCMDで渡されたコマンドを実行。(→rails s)
# コンテナのプロセスを実行する。(Dockerfile 内の CMD に設定されているもの。)
exec "$@"

Rails プロジェクトの生成

$ docker compose run web rails new . --force --database=mysql --api
$ docker compose build

MYSQL の設定と作成

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db
$ docker compose run web rails db:create

コンテナの起動

$ docker compose up -d


http://localhost:3111 にアクセスして終了!


○ おまけ

Dockerfile の CMD と docker-compose.yml の command の違い

docker-compose.yml の command キーと、Dockerfile の CMD ディレクティブは,
Docker コンテナの実行時にコマンドを指定するための方法ですが、用途の違いがあります。
docker-compose.yml の command キーは、services 内の特定のサービスに対して実行するコマンドを指定するために使用され、Dockerfile の CMD ディレクティブは、Docker イメージから生成したコンテナのデフォルトのコマンドを指定するために使用されます。
また、docker-compose.yml の command キーは Dockerfile の CMD ディレクティブを上書きをしています。


○ 参照


○ おわりに

「苦手意識は研修でおさらば!!」そんな気持ちでこの記事にアウトプットして、自分のモノにしていきたいと思います!

とか言っておきながら今回も苦戦しました、、、
やっぱり何でも学び続けることが大事だナ
Docker 使って簡単な CRUD 機能のあるアプリささっと作れるようになれるまで頑張ろう

Sun* Developers

Discussion