Docker で Ruby on Rails の環境構築
○ はじめに
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}
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"]
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:
source 'https://rubygems.org'
gem 'rails', '~>7.0.3'
#!/bin/bash
# set -e は「エラーが発生するとスクリプトを終了する」オプション
set -e
# exec "$@"でCMDで渡されたコマンドを実行。(→rails s)
# コンテナのプロセスを実行する。(Dockerfile 内の CMD に設定されているもの。)
exec "$@"
$ docker compose run web rails new . --force --database=mysql --api
$ docker compose build
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 概要 — Docker-docs-ja 20.10 ドキュメント 著作者 : Docker-docs-ja
- Docker Compose 概要 — Docker-docs-ja 20.10 ドキュメント 著作者 : Docker-docs-ja
○ おわりに
「苦手意識は研修でおさらば!!」そんな気持ちでこの記事にアウトプットして、自分のモノにしていきたいと思います!
とか言っておきながら今回も苦戦しました、、、
やっぱり何でも学び続けることが大事だナ
Docker 使って簡単な CRUD 機能のあるアプリささっと作れるようになれるまで頑張ろう
Discussion