#はじめに
今回はタイトルにあるとおりDockerを使用したRails+Mysqlの開発環境構築をしたので記事にします。
###対象読者
既存のrailsプロジェクトの開発環境にdockerを利用したいかた。(今回はdbをMysqlとしています。)dockerはダウンロード済みとしています。
###参考
こちらの記事を参考にさせていただきました!
既存のrailsプロジェクトをDockerで開発する手順
既存のRailsアプリにDockerを導入する手順
###環境
Mac OS
docker -v
Docker version 19.03.8, build afacb8b
docker-compose -v
docker-compose version 1.25.4, build 8d51620a
#ファイル構成
既存プロジェクトの中にDockerfile,docker-compose.ymlを新たに作成して、database.yml内をdocker用に編集します。
testproject
└── test_app#既存プロジェクト
├── Dockerfile
├── docker-compose.yml
├── Gemfile
├── Gemfile.lock
├── config
└──database.yml
#1.Dockerfileの作成
まずはじめにdockerファイルを作成します。既存のrailsプロジェクトのディレクトリに追加してください。(ファイル構成参照)
#既存のプロジェクトのrubyのバージョンを指定
FROM ruby:2.6.3
#パッケージの取得
RUN apt-get update
&& apt-get install -y --no-install-recommends\
nodejs \
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
#既存railsプロジェクトをコンテナ内にコピー
COPY . /myproject
各動作について
FROM:イメージの取得
RUN:コマンドの実行。パッケージインストールの為に主に使用。
railsで必要になる、nodejs,mysql,build-essentialをインストール。
apt-get update && apt-get install -y
とすることで最新版のパッケージを取得しインストールする。
--no-install-recommends && rm -rf /var/lib/apt/lists/*
とすることで無駄なもののインストールとaptのインストール時のキャシュを削除。
WORKDIR:作業ディレクトリの指定。WORKDIR以下の命令を実施する場所を決める。
指定したディレクトリがない場合は作成するので「RUN mkdir」は必要なし。
COPY:ホストマシンのファイルをコピーする。この場合はホストマシンのGemfile等をコピーする。
#2.docker-compose.ymlの作成
続いてdocker-compose.ymlを用意します。
version: '3'
services:
db:
image: mysql:5.7
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
ports:
- '3306:3306' # ホストからゲストへポートフォワード
environment:
MYSQL_DATABASE: docker_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'
# pry-byebugを使えるようにする
tty: true
stdin_open: true
depends_on:
- db # DB側のコンテナが出来上がってからwebを実行する
ports:
- "3000:3000" # ホストからゲストへポートフォワード
volumes:
- .:/myproject # ソースコード変更したらDocker側も即反映されるように
docker-composeにはMysqlとrails用コンテナを立ち上げる為の動作を記載しています。各動作の意味は
MySQL
image: 元となるmysqlのイメージを指定。
command: 文字コードをutf8に設定。
ports: ポートフォワードの設定
environment: datebase.ymlで使用する環境変数を設定。
build: rails用のイメージは先ほど作成したDcokerfileを利用。
web(rails)
build: 作成済みのDockerfileを元にコンテンなを作成。
context: . dockerfile:Dockerfileでファイルの読み込み先を指定。
command: railsサーバー起動
tty: stdin_open: コンテナでbyebugを使用できる用にする。
depends_on: コンテナの立ち上げ順と依存関係を指定。dbコンテナが立ち上がってからwebコンテナが立ち上がるようにする。
volumes:データの永続化の為に使用。ホスト側でソースコードを変更してもコンテナがホスト側を参照しているので変更が反映される。
#3.datebase.ymlの設定
既存railsのファイルをdockerコンテナのmysqlにつなげるように設定します。
default: &default
adapter: mysql2
encoding: utf8
pool: 5
username: root#docker-composeに記載したユーザー名
password: password#docker-composeに記載したパスワード
development:
<<: *default
host: db
database: docker_development#docker-composeに記載したデータベース名
#4.コンテナの立ち上げよう!!
既存プロジェクトのディレクトリまで移動して下記コマンドを実行してください。
cd test_app
#imageの作成
docker-compose build
#コンテナの立上げ
dokcer-compose up -d
#コンテナ内で
docker-compose exec web bundle exec rails db:migrate
これでhttp://localhost:3000にアクセスすればページが表示されます。
###最後に
ここまでお読みいただきありがとうございます。間違い等あればコメントお願いします。
よく使うコマンド等はこちらを参考にしてます。
docker-compose コマンドまとめ
それではありがとうございました。