はじめに
既存のRailsプロジェクトをDockerに乗せていきます。
初学者による記事なので間違い等ございましたらご指摘いただけると幸いです。
※本記事は開発環境のみの導入を対象としています。
参考
Dockerが何なのか全く分からない!という方はまずは下記の記事を参考にDockerを触ってみてください。
DockerをMacにインストールする
こちらの記事も手っ取り早くDockerをふんわり理解するのにオススメです。
Dockerについてなるべくわかりやすく説明する
環境
- macOS Catalina 10.15.7
- Ruby 2.6.5
- Rails 6.0.3.3
- Docker 19.03.13
- docker-compose 1.27.4
- MySQL 5.6.47
目次
- 必要ファイルの作成
- ファイル構成
- 作成したファイルの編集
- コンテナの起動
必要ファイルの作成
必要ファイルは以下の5つです。rails newをした際に自動生成されるファイルもあるので必要なもののみ作成していきましょう。
- Dockerfile
- docker-compose.yml
- Gemfile
- Gemfile.lock
- database.yml
ファイル構成
既存のアプリケーション名
└── app
├── Dockerfile # 作成
├── docker-compose.yml # 作成
├── Gemfile
├── Gemfile.lock
├── config
└──database.yml
作成したファイルの編集
Dockerfile
FROM ruby:2.6.5 #自身のrubyバージョンを指定 (ruby -v)
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
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 && apt-get install -y --no-install-recommends\
nodejs \
yarn \
mariadb-client \
build-essential \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /myproject
COPY Gemfile /myproject/Gemfile
COPY Gemfile.lock /myproject/Gemfile.lock
RUN gem install bundler
RUN bundle install
RUN yarn install --check-files
COPY . /myproject
Rails6でwebpackerが標準になったことでyarnのインストールが必要になってきます。
Docker Hubで確認するとrubyのイメージはDebian系となっているので、yarnの公式ドキュメントに記載されているOS毎のインストール方法を参考に記述していきます。
ちなみに、yarnの公式ドキュメントは日本語表示のままだとなぜかOSの選択肢の中にMacとWindowsしか表示してくれないので英語表示に切り替えて確認しましょう。
docker-compose.yml
version: '3'
services:
db: #データベースのコンテナ作成
image: mysql:5.7 #自身のmysqlバージョンを指定 (mysql --version)
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
ports:
- '3306:3306'
volumes:
- mysql-data:/var/lib/mysql
environment:
MYSQL_DATABASE: myapp_development #プロジェクト名_development
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: root
MYSQL_PASSWORD: password
web: #アプリケーションのコンテナ作成
build:
context: .
dockerfile: Dockerfile
command: bundle exec rails s -p 3000 -b '0.0.0.0'
tty: true
stdin_open: true
depends_on:
- db
ports:
- "3000:3000"
volumes:
- .:/myproject
volumes: #dbを永続化するための記述
mysql-data:
Gemfile
source 'https://rubygems.org'
gem 'rails', '~>6.0.0'
既存アプリケーションの場合この記述はすでにあるはずですが念のため確認しておきましょう。
database.yml
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root #docker-compose.ymlで指定したユーザー名
password: password #docker-compose.ymlで指定したパスワード
development:
<<: *default
database: myapp_development #プロジェクト名_development
host: db #docker-compose.ymlでデータベースのコンテナ作成部分で指定したservice名
test:
<<: *default
database: myapp_test #プロジェクト名_test
host: db #docker-compose.ymlでデータベースのコンテナ作成部分で指定したservice名
アプリケーションのコンテナからデータベースのコンテナに接続するための設定を記述していきます。
セキュリティ面を気にする場合はusernameとpasswordに環境変数を設定しましょう。今回は開発環境のみということもあり設定していません。
コンテナの起動
cd myapp
docker-compose build #コンテナを建てる
docker-compose up -d #コンテナ起動(-dオプションをつけることでバックグラウンドで実行)
これで localhost:3000 にアクセスするとページが表示されます◎
- エラーが発生した場合は
docker-compose logs -f
でリアルタイムでログの確認ができるのでエラー原因を探して解決しましょう。
- サーバーを停止させたいときは以下のコマンドを実行してください。
docker-compose down
最後に
実装に思いの外手間取ったので備忘録的に記事にしてみました。
どなたかの参考になれば幸いです。