Railsの開発環境にDockerを導入する
はじめに
今まではAWSのcloud9でrailsアプリを開発していましたが、実際の開発現場で使われているというDockerを開発環境に導入しようと思います。
※導入する際には、以下の記事を参考にさせていただきました。
丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac)
Quickstart: Compose and Rails (docker公式ドキュメント)
環境
Ruby 2.5.3
Rails 5.2.4
MySQL 5.7
MacBook Pro
1 自分のアプリのディレクトリ直下にDockerfileを作成する
FROM ruby:2.5.3
RUN apt-get update -qq && apt-get install -y vim nodejs default-mysql-client
COPY . /fishingshares
ENV APP_HOME /fishingshares
WORKDIR $APP_HOME
RUN bundle install
ADD . $APP_HOME
2 docker-compose.ymlを作成する
version: '3'
services:
db:
image: mysql:5.7
volumes:
- ./db/mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: root
ports:
- "3306:3306"
web:
build: .
command: rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/fishingshares
ports:
- "3000:3000"
depends_on:
- db
links:
- db
3 database.ymlを修正する
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password
socket: /var/lib/mysql/mysql.sock
host: db
4 dockerコンテナを起動
$ docker-compose build #コンテナを立ち上げる(立ち上げるのに少し時間かかります)
$ docker-compose up #コンテナを起動する
コンテナを起動して、ターミナルにこんなログが出てきたらうまくいってます。
5 データベースを構築する
$ docker-compose run web rails db:create #コンテナ上にDBを作成する
$ docker-compose run web rails db:migrate # コンテナ上のDBにマイグレーションファイルを反映させる
6 ブラウザでlocalhost:3000にアクセスする
アプリケーションが無事に表示されました!
メモ1
コンテナを立ち上げた後に、以下のコマンドできちんとコンテナを止める必要があるみたいです。
$ docker-compose down
このコマンドでコンテナを止めないと、次にコンテナを起動したときに、ブラウザでうまく表示されません。
コンテナを起動してから、ブラウザに表示されない時は、以下のコマンドを実施してください。
$ rm tmp/pids/server.pid
このコマンドを実施してから、もう一度コンテナを起動すると、ブラウザにうまく表示されると思います。
メモ2
ローカルからMySQLコンテナに接続するコマンド
$ mysql -u root -p -h localhost -P 3306 --protocol=tcp
webコンテナからdbコンテナへの接続方法
version: '3'
services:
db:
container_name: local-mysql
image: mysql:5.7
volumes:
- ./db/mysql_data:/var/lib/mysql
environment:
MYSQL_DATABASE: 'local-mysql-db'
MYSQL_PASSWORD: password
MYSQL_USER: root
ports:
- "3306:3306"
networks:
- app-net
web:
container_name: "local-application"
build: .
command: rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/fishingshares
ports:
- "3000:3000"
depends_on:
- db
links:
- db
networks:
- app-net
networks:
app-net:
driver: bridge
$ mysql -h local-mysql -u root -D fishingshares_db_1 -p
詳しく解説すると、
mysql -h [host名] -u [ユーザ名] -D [database名] -p
ということになる。
以上のコマンドをwebコンテナ内で実行すると、mysqlに接続できる。
コンテナ内で日本語を入力可能にするためのDockerfile記述方法
Dockerコンテナ内でrails c
からデータベースにレコードを追加しようとした時に、日本語を入力できなかったので、Dockerコンテナを立ち上げた時に、日本語対応がなされるようにDockerifleを書き換えた。
以下の記事を参考にした。
【Docker】MySQLの日本語化
内容
FROM ruby:2.5.3
RUN apt-get update -qq && apt-get install -y vim nodejs default-mysql-client \
locales locales-all && \ #追加
echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen && \ #追加
locale-gen && \ # 追加
update-locale LANG=ja_JP.UTF-8 #追加
COPY . /fishingshares
ENV LANG="ja_JP.UTF-8" \ #追加
TZ="Asia/Tokyo" \ #追加
APP_HOME="/fishingshares"
WORKDIR $APP_HOME
RUN bundle install
ADD . $APP_HOME
コメントを書いているところが追記した箇所である。
以上のDockerfileを基に、コンテナを立ち上げて起動すると、コンテナ内で日本語が入力できるようになる。
頻繁に利用するDockerコマンドのまとめ
build
buildコマンドはimageを構築するのみ。コンテナ作成はしない。
$ docker-compose build
up
upコマンドでは、キャッシュがある場合はそれを使って一発でイメージの構築から、コンテナの構築・起動までします。
$ docker-compose up
start
startコマンドは既存のコンテナを起動します。
$ cocker-compose start
run
runコマンドはimageの構築から、コンテナの構築・起動までする。引数でサービスを指定する必要あり。
$ docker-compose run web
exec
コンテナの中に移動できる
$ docker-compose exec web bash
bash ashの違いは、ashの方が軽量なコマンドらしい。
新たなrailsプロジェクトを立ち上げるコマンド
docker-compose run web rails new . --force --database=mysql
rails newの . は現在いるディレクトリにそのままプロジェクトを作成するというもの)だそうです。
Vue.jsを導入する
サンプルアプリのディレクトリ作成
任意のワークスペースでディレクトリを作成します。
mkdir sample_app
cd sample_app
Dockerの設定ファイルを作成
FROM ruby:2.5.3
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - && apt-get update && \
apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
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 && \
apt-get update && apt-get install -y yarn
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && \
apt-get install nodejs
RUN yarn add node-sass
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app
version: '3'
services:
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/app
ports:
- 3000:3000
depends_on:
- db
tty: true
stdin_open: true
db:
image: mysql:5.7
volumes:
- db-volume:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
db-volume:
source 'https://rubygems.org'
gem 'rails', '5.2.3'
あとは、Gemfile.lockの空ファイルを作成。
Railsプロジェクトを作成する
$ docker-compose run web rails new . --force --database=mysql
※rails newの . は現在いるディレクトリにそのままプロジェクトを作成するというもの)だそうです。
database.ymlを編集
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password
host: db
hostの部分をdbに変更する。
vue.jsの導入
gem 'webpacker', github: 'rails/webpacker'
その後、
$ docker-compose exec web bash
でwebコンテナに入る。
コンテナ内でコマンドを以下のコマンドを実行
$ rails webpacker:install
$ rails webpacker:install:vue
$ bin/webpack
Railsのviewファイルに以下を記述する
<%=javascript_pack_tag 'hello_vue'%>
こんな画面が出てきたら成功です。
Discussion