はじめに
新しいwebサービスを開発することになり、Dockerを利用してrailsの開発環境を構築したので、Qiitaに残しておこうと思います。
対象
Dockerを使ってみたい人。Dockerでrailsの開発環境を構築してみたい人。
環境
ruby:2.6.2
mysql:5.7
手順
- Githubでリポジトリを作成して、クローンする
- Rails環境テンプレートの内容()をクローンしたフォルダにコピー
- docker-compose.ymlファイルを修正する(Dockerfile) 3-1. %%project_name%%をプロジェクト名称(英語)に書き換える 3-2. contariner_nameをプロジェクト名称を含んだ形に変更 (_は使わない) 3-3. mysqlの@の後ろを3-2で変更した内容に揃える
- docker-compose run の rails new を実行してRailsをインストール docker-compose run --rm rails rails new . --force --database=mysql --skip-bundle
- dockerフォルダの中のGemfile, Gemfile.lockをapplication配下にコピー
- dockerフォルダの中のunicorn.rbをapplication/config配下にコピー
- docker-compose build --no-cache
- docker-compose up ※ ここでエラーがでていなければ成功
実践
1:Githubでリポジトリを作成して、クローンする
Github( https://github.com )で新しくリポジトリを作る。
コピーして、ターミナル上で作りたいフォルダに移動し以下のコマンドを打つ。
$ git clone https://github.com/horikazu0715/kikasetene.git
2:クローンしたフォルダにRails環境テンプレートの内容をコピー
ここで、Rails環境テンプレートの内容とは、
のようなものになる。
dockerファルダ、docker-compose.yml、README.mdをクローンしたフォルダにコピーする。
3: docker-compose.yml、Dockerfileファイルを修正する
未編集のdocker-compose.yml、Dockerfileファイルは以下の通り。
docker-compose.yml
version: '3'
services:
rails:
container_name: rails
build:
context: ./
dockerfile: ./docker/containers/rails/Dockerfile
command: bundle exec unicorn -p 80 -c /var/project/%%project_name%%/config/unicorn.rb
ports:
- '80:80'
environment:
RAILS_ENV: development
MYSQL_ROOT_PASSWORD: 'root'
DATABASE_URL: 'mysql2://root:root@mysql:3306'
depends_on:
- db
volumes:
- ./application:/var/project/%%project_name%%
links:
- db
db:
container_name: mysql
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 'root'
ports:
- '3306:3306'
volumes:
- ./docker/containers_data/mysql:/var/lib/mysql
docker/containers/rails/Dockerfile
FROM ruby:2.6.2
RUN apt-get update && \
apt-get install -y nodejs \
mysql-client \
--no-install-recommends && \
rm -rf /var/lib/apt/lists/*
RUN mkdir /var/lib/mysql && touch /var/lib/mysql/mysql.sock
ADD ./docker/containers/mysql/my.cnf /etc/
RUN mkdir /var/project
RUN mkdir /var/project/%%project_name%%
WORKDIR /var/project/%%project_name%%
COPY ./docker/containers/rails/Gemfile /var/project/%%project_name%%/Gemfile
COPY ./docker/containers/rails/Gemfile.lock /var/project/%%project_name%%/Gemfile.lock
RUN bundle install
COPY ./application /var/project/%%project_name%%
COPY ./docker/containers/rails/unicorn.rb /var/project/%%project_name%%/config/unicorn.rb
EXPOSE 80
上記のコードの %%project_name%%
といくつかの箇所を修正する。
docker-compose.yml
version: '3'
services:
rails:
#rails→rails-kikasetene.ここで.や_を使用するとエラーになる。使える記号は-のみ。
container_name: rails-kikasetene
build:
context: ./
dockerfile: ./docker/containers/rails/Dockerfile
command: bundle exec unicorn -p 80 -c /var/project/kikasetene/config/unicorn.rb
ports:
- '80:80'
environment:
RAILS_ENV: development
MYSQL_ROOT_PASSWORD: 'root'
#@mysql→@mysql-kikasetene
DATABASE_URL: 'mysql2://root:root@mysql-kikasetene:3306'
depends_on:
- db
volumes:
- ./application:/var/project/kikasetene
links:
- db
db:
#mysql→mysql-kikasetene
container_name: mysql-kikasetene
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 'root'
ports:
- '3306:3306'
volumes:
- ./docker/containers_data/mysql:/var/lib/mysql
docker/containers/rails/Dockerfile
%%project_name%%
を編集
FROM ruby:2.6.2
RUN apt-get update && \
apt-get install -y nodejs \
mysql-client \
--no-install-recommends && \
rm -rf /var/lib/apt/lists/*
RUN mkdir /var/lib/mysql && touch /var/lib/mysql/mysql.sock
ADD ./docker/containers/mysql/my.cnf /etc/
RUN mkdir /var/project
RUN mkdir /var/project/kikasetene
WORKDIR /var/project/kikasetene
COPY ./docker/containers/rails/Gemfile /var/project/kikasetene/Gemfile
COPY ./docker/containers/rails/Gemfile.lock /var/project/kikasetene/Gemfile.lock
RUN bundle install
COPY ./application /var/project/kikasetene
COPY ./docker/containers/rails/unicorn.rb /var/project/kikasetene/config/unicorn.rb
EXPOSE 80
4:docker-compose run の rails new を実行してRailsをインストール
3の編集が終われば、クローンしたフォルダ下にapplicationフォルダを作成する。
$ mkdir application
次に、rails newをターミナル上で実行する。
$ docker-compose run --rm rails rails new . --force --database=mysql --skip-bundle
5:dockerフォルダの中のGemfile, Gemfile.lockをapplication配下にコピー
2の手順でクローンしたフォルダ配下にコピーしたGemfile, Gemfile.lockをコピーする。
application配下にはすでにGemfileがあるはずなので、Gemfileはdockerフォルダ内の内容を上書きコピーし、Gemfile.lockはapplicationに存在しないため、コピーしそのまま貼り付ける。
(今回はすでに用意しているdockerフォルダ内のGemfileを利用したが、そのまま使用、または自分でカスタマイズでもいい)
6:dockerフォルダの中のunicorn.rbをapplication/config配下にコピー
今回はunicornを使用するので、あらかじめ用意しておいたunicorn.rb
をapplication/config配下にコピーする。
rails_root = ENV['RAILS_ROOT']
worker_processes Integer(ENV['WEB_CONCURRENCY'] || 1)
timeout 300 # タイムアウト
preload_app true # 更新時ダウンタイム無し
# listen 8080
listen "#{rails_root}/tmp/unicorn.sock"
pid "#{rails_root}/tmp/unicorn.pid"
# ログの出力
stderr_path File.expand_path('log/unicorn.log', rails_root)
stdout_path File.expand_path('log/unicorn.log', rails_root)
7:docker-compose build --no-cache
ここまで完了すれば、buildする。
末に、--no-cache
をつけることで以前のbuildの影響なしに0の状態からbuildする。
docker-compose build --no-cache
上のように、Successfully builtと出れば成功。
8:docker-compose up
次にdocker-compose up
でコンテナを起動する。
$ docker-compose up
ターミナルが上のような表示になれば成功。
ちなみにdocker-compose ps
というコマンドでコンテナの起動状態を確認することができる。
ここまでエラーが出ずに進めることができれば、開発環境構築は完了となる。
ブラウザでlocalhostとうち、以下の画面になればok!!
localhostを開き、データベースがないというエラーが出る場合がある。
Sequel Proでkikasetene_development
というデータベースを作成するとエラーが消え、上のような画面に変わった。
Sequel Pro(https://www.sequelpro.com/)
さいごに
Dockerでrailsの開発環境構築するということで、エラーなくスムーズにいけば15分ほどで上記の全ての工程をクリアできますが、僕の場合は少し手こずりました。
この作業はサービス開発するたびに必要になるので、なれておきたいところですね〜。