【rails】Dockerで開発環境の構築。
参考:入門 Docker
【図解】Dockerの全体像を理解する -前編- - Qiita
いまさらDockerに入門したので分かりやすくまとめます - Qiita
そもそもdockerとは。
コンテナ型の仮想化技術である。
仮想化とはざっくりいうと、パソコンの中に(仮想)パソコンを作ること
コンテナ型はゲストOSを使用しないで動作できるらしい。
従来よりも軽量に動作するがデメリットとしてはホストOSに依存する点。
dockerを使う利点は開発環境を統一できる点らしいが、一人でポートフォリオを作っている時点てさっぱりですね。
実際に環境を作ってみる
参考:DockerでRailsの環境構築してHerokuへデプロイする - Qiita
Quickstart: Compose and Rails | Docker Documentation
丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac) - Qiita Docker Image・・・実行するアプリケーションや設定をまとめたファイル Dockerfile・・・Docker Imageを構築するための手順
まずは作成したいディレクトリに移動します(任意)
% cd /Users/works/myapp
Dockerfileを作成
% vim Dockerfile または % touch Dockerfile
私の場合はtouch Dockerfile
で作ってから普段使っているvscodeで中身を書きました。
#Dockerfile FROM ruby:2.5 RUN apt-get update -qq && apt-get install -y nodejs postgresql-client RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myapp # Add a script to be executed every time the container starts. COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # Start the main process. CMD ["rails", "server", "-b", "0.0.0.0"]
参考: Dockerfile のベストプラクティス — Docker-docs-ja 1.9.0b ドキュメント
FROM・・・Dockerイメージのベースとなるイメージの指定、「ベースイメージ」
RUN・・・Dockerイメージビルド時にDockerコンテナ内で実行するコマンド
WORKDIR・・・WORKDIR 命令セットは Dockerfile で RUN 、 CMD 、 ENTRYPOINT 、 COPY 、 ADD 命令実行時の作業ディレクトリ(working directory)を指定します。
COPY ・・・ホストマシン上のファイルをDockerコンテナ内にコピーさせる
ENTRYPOINT・・・コンテナが実行するファイルを設定
EXPOSE・・・特定のネットワーク・ポートをコンテナが実行時にリッスンすることを Docker に伝えます。
CMD・・・CMD 命令を一度だけ指定できます。複数の CMD がある場合、最も後ろの CMD のみ有効です。
GemfileとGemfile.lockを作成
Rails を読み込むだけのブートストラップ用の Gemfile を作成します
% touch Gemfile && touch Gemfile.lock
#Gemfile source 'https://rubygems.org' gem 'rails', '~>5'
docker-compose.ymlの作成
参考:【Docker入門】Docker composeでRuby on Rails開発環境を構築する | SPIN OFF(スピンオフ)
クイックスタート・ガイド:Docker Compose と Rails — Docker-docs-ja 17.06.Beta ドキュメント
Docker composeとは、複数のコンテナを協調して実行したい場合に、それらをまとめて管理するためのツールです。
docker-composeをつかって簡単にWebアプリケーションの3層構造を構築します。
% touch docker-compose.yml
で
#docker-compose.yml version: '3' services: db: image: postgres volumes: - ./tmp/db:/var/lib/postgresql/data web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/myapp ports: - "3000:3000" depends_on: - db
entrypoint.shを同ディレクトリに追加
% touch entrypoint.sh
#entrypoint.sh #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@"
docker-compose run
docker-compose run web rails new . --force --no-deps --database=postgresql
そして
docker-compose build
database.ymlを変更
default: &default adapter: postgresql encoding: unicode host: db username: postgres password: pool: 5
docker-compose up
docker-compose up
で立ち上がります rails s
とおんなじ見ないな感じです crl+c
で切れます。
docker-compose run web rake db:create
でデータベースを作成
docker-compose run web rails db:migrate
でmigrate実行
よく使うコマンド集
docker-compose run web rake db:create db:migrate
docker-compose run web bundle install
docker-compose run web rails dbconsole
とりあえずdocker-compose run web
をつけて、ローカル開発時のコマンドを打つ感じですかね。