はじめに
環境構築目標
今回構築するDocker環境の目標は以下の通りです。
- railsとnodeをマルチステージビルドでインストールする
- docker-composeを使ってrailsとPostgreSQLを起動する
- http://localhost:3000 にアクセスするとアプリが表示される
各種バージョン
- ruby: 3.0.2
- rails: 6.0.3
- node: 16.13
- postgresql: 12.0
開発環境
- CPU: Apple M1
- OS: MacOS Ventura バージョン13.3.1
Window等のOSや他CPUでの動作確認は行なっていませんので、予めご了承ください。
※追記
環境構築にあたり、yarn installで発生したエラーについて
下記記事にてまとめておりますので、よろしければご参照ください。
(本記事では下記エラーが発生しないよう対応済みですのでご安心ください!)
Docker化手順
概要
大まかな手順は以下の通りです。
- Dockerfileを作成
- docker-compose.ymlを作成
- Gemfileを編集
- database.ymlを編集
- Docker Composeを使用してコンテナを作成・実行
- localhost:3000にアクセス
詳細
1. Dockerfileを作成
Dockerfileを用いてイメージを作成します。
Dockerfileには以下の内容を記述します。
# ベースとなるイメージを指定する
FROM node:16.13 as node
FROM ruby:3.0.2
# nodeイメージからyarn,nodeをコピーする
COPY --from=node /opt/yarn-* /opt/yarn
COPY --from=node /usr/local/bin/node /usr/local/bin/
COPY --from=node /usr/local/lib/node_modules/ /usr/local/lib/node_modules/
RUN ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
&& ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npx \
&& ln -fs /usr/local/lib/node /usr/local/bin/nodejs \
&& ln -fs /opt/yarn/bin/yarn /usr/local/bin/yarn \
&& ln -fs /opt/yarn/bin/yarn /usr/local/bin/yarnpkg
# aptを更新し、postgresql等の必要なパッケージをインストールする
RUN apt-get update && apt-get install -y \
build-essential \
libpq-dev \
postgresql-client
# myappというフォルダを作成し、myappをワークディレクトリとする
RUN mkdir /myapp
WORKDIR /myapp
# yarnを更新する
COPY package.json /myapp/package.json
COPY yarn.lock /myapp/yarn.lock
RUN yarn install
# Gemをインストールする
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
# カレントディレクトリをmyappにコピーする
COPY . /myapp
ベースとなるイメージを指定する
FROM node:16.13 as node
FROM ruby:3.0.2
rubyとnodeのイメージを使用します。
asを使用することでイメージ名を指定することが可能です。
nodeイメージからyarn,nodeをコピーする
COPY命令でyarnとnodeをコピーします。
COPY --from=node /opt/yarn-* /opt/yarn
COPY --from=node /usr/local/bin/node /usr/local/bin/
COPY --from=node /usr/local/lib/node_modules/ /usr/local/lib/node_modules/
lnコマンドを用いて、シンボリックリンクを生成します。
オプションに-fを指定することで同じファイルがあった場合に上書きを、
-sでシンボリックリンクを生成する命令となります。
RUN ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
&& ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npx \
&& ln -fs /usr/local/lib/node /usr/local/bin/nodejs \
&& ln -fs /opt/yarn/bin/yarn /usr/local/bin/yarn \
&& ln -fs /opt/yarn/bin/yarn /usr/local/bin/yarnpkg
myappというフォルダを作成し、myappをワークディレクトリとする
今回の例では、ルートディレクトリにmyappというフォルダを作成し、
myappフォルダをワークディレクトリとして設定しています。
RUN mkdir /myapp
WORKDIR /myapp
aptを更新し、postgresql等の必要なパッケージをインストールする
apt-get updateでaptを更新し、apt-get installで必要なパッケージをインストールします。
-yオプションを指定することで、インストール時に質問される内容をyesとして、
スキップすることができます。
今回はデータベースにPostgreSQLを使用します。
RUN apt-get update && apt-get install -y \
build-essential \
libpq-dev \
postgresql-client
yarnを更新する
package.jsonとyarn.lockをmyappディレクトリにコピーし、
yarn installを実行することで、package.jsonの内容をもとにパッケージがインストールされます。
COPY package.json /myapp/package.json
COPY yarn.lock /myapp/yarn.lock
RUN yarn install
Gemをインストールする
GemfileとGemfile.lockをmyappディレクトリにコピーし、
bundle installを実行することで、Gemfileの内容をもとにパッケージがインストールされます。
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
カレントディレクトリをmyappにコピーする
カレントディレクトリのファイル・フォルダをmyappにコピーします。
COPY . /myapp
2. docker-compose.ymlを作成
Docker Composeを使用するため、docker-compose.ymlを作成します。
Docker Composeを使用することで、複数のコンテナの管理を効率的に行うことができます。
Dockerfileと同じディレクトリ内にdocker-compose.ymlを作成し、
以下の内容を記述します。
# Docker Composeのバージョンを指定する
version: '3'
# serviece以下に各コンテナの設定を記述する
services:
# webコンテナの設定
web:
# カレントディレクトリのDockerfileでビルドする
build: .
# railsサーバーの起動時の設定を行う
command: bundle exec rails s -p 3000 -b '0.0.0.0' &&
# ポートの設定を行う(ホストの3000ポートとコンテナの3000ポートを紐付け)
ports:
- '3000:3000'
# マウントの設定を行う(カレントディレクトリのファイル・フォルダをmyappにマウントする)
volumes:
- .:/myapp
# 環境変数の設定を行う
environment:
- 'DATABASE_PASSWORD=postgres'
# 擬似端末(キーボードによる入力)をコンテナに結びつける
tty: true
# 標準入出力とエラー出力をコンテナと結びつける
stdin_open: true
# コンテナの依存関係を指定する
depends_on:
- 'db'
# データベースコンテナの設定
db:
# postgresの12.0を指定する
image: postgres:12.0
# 環境変数の設定を行う
environment:
- POSTGRES_PASSWORD=password
3. Gemfileを編集
今回データベースにはPostgreSQLを使用するため、Gemfileに以下の内容を追記する。
gem 'pg'
4. database.ymlを編集
configフォルダ内にrailsのデータベース設定を行うdatabase.ymlファイルが存在します。
デフォルトではSQLiteの設定となっているため、PostgreSQLの設定に変更します。
以下の内容をdatabase.ymlに記述します。
default: &default
adapter: postgresql
encodeing: unicode
host: db
user: postgres
port: 5432
password: password
pool: 5
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
production:
<<: *default
database: myapp_prodection
5. Docker Composeを使用してコンテナを作成・実行
ここからは、Docker Composeを使用してコンテナの作成・実行していきます。
イメージをビルドする
ターミナルを開いて以下のコマンドを実行し、イメージをビルドします。
$ docker-compose build
データベースの作成を行う
続いて、railsアプリのデータベースの作成を行います。
以下のコマンドを実行します。
$ docker-compose run web rails db:create db:migrate
web以下のrails db:create db:migrateで、データベースの作成と反映を行っています。
コンテナの作成・起動を行う
最後に、コンテナの作成・起動を行います。
以下のコマンドを実行します。
$ docker-compose up
6. localhost:3000にアクセス
localhost:3000にアクセスできれば成功です。