はじめに
RailsのアプリをDockerで環境構築したのでその時のことを書いていきます。
今回は既に作ってある Rails アプリに Docker を導入していきます。
Rails + MySQLの構成を docker-compose で立ち上げるところまでしていきます
Docker導入の準備
1. Rails 用の Dockerfile を作成する
Rails アプリのディレクトリに Dockerfile を作ります。
プロジェクト名は sample_app としました。
sample_app user$ touch Dockerfile
Dockerfile に書き込んでいきます。
FROM ruby:3.0.0
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update -qq && apt-get install -y build-essential nodejs yarn
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN gem install bundler
RUN bundle install
COPY . /app
以下、ざっとこの Dockerfile の流れです
FROM ruby:3.0.0
→ 今回は Ruby の3.0.0のバージョンを使います。
これでコンテナ内で Ruby の3.0.0バージョンが使えるようになります。
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - ...(以下省略)
→ yarn(Rails6では必要)をインストールするための準備です。
RUN apt-get update -qq && apt-get install -y build-essential nodejs yarn
→ Railsを動かすために必要なものをコンテナ内にインストールします。
RUN mkdir /app
→ コンテナ内ににappという名前でディレクトリを作ります。
WORKDIR /app
→ WORKDIRコマンドでディレクトリを指定することで、それ以降の命令は全てそのフォルダ内で実行されることになります。
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
→ホストのGemfileとGemfile.lockをコンテナ内のappディレクトリにコピーします。
RUN gem install bundler
→コンテナに bundler をインストールします。
RUN bundle install
→コンテナ内で Gemfile に書かれた gem をインストールします。
COPY . /app
→ホストの Rails のフォルダをコンテナの app ディレクトリにコピーします。
2. docker-compose.ymlを作成する
docker-compose.yml を書いていきます。
version: '3'
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password #適宜自分のMySQLのパスワードにしてください
volumes:
- mysql-db:/var/lib/mysql
web:
build: .
command: bundle exec rails s -b 0.0.0.0
volumes:
- .:/app
ports:
- "3000:3000"
depends_on:
- db
volumes:
mysql-db:
driver: local
3. docker-compose でRailsを起動する。
docker-comoseコマンドでRailsを起動します。
以下を順に実行しましょう。
# Docker イメージをビルドします。
sample_app$ docker-compose build
# DBが作られていないので rails db:createが必要です
sample_app$ docker-compose run web rails db:create
# migrate もします。
sample_app$ docker-compose run web rails db:migrate
# 起動
sample_app$ docker-compose up
4. その他のコマンド
# -d をつけるとバックグラウンドで起動できる
sample_app$ docker-compose up -d
# アプリを止めるときは
sample_app$ docker-compose stop
# 再起動するとき
sample_app$ docker-compose start
# アプリの停止 + コンテナの削除
sample_app$ docker-compose down
# -v をつけると volume も削除できる(今回で言うとDB)
sample_app$ docker-compose down
# console を開きたいとき
sample_app$ docker-compose run web rails c
#おわりに
Dockerを使えると環境構築が楽で良いですね