DockerでRailsを使うためには下記のファイルを用意します。
- Dockerfile
- Gemfile
- Gemfile.lock
- docker-compose.yml
Dockerfile
Railsの実行環境用のイメージを作成するためのファイルです。
1 2 3 4 5 6 7 8 |
FROM ruby:バージョン(2.4.5等) RUN apt-get update -qq && apt-get install -y build-essential nodejs RUN mkdir /app WORKDIR /app COPY Gemfile /app/Gemfile COPY Gemfile.lock /app/Gemfile.lock RUN bundle install COPY . /app |
FROM ruby:バージョン(2.4.5等)
指定されたRubyバージョンをイメージとします。「ruby」はRubyリポジトリを指します。(他にも様々なタグがあります。)、この時点でコンテナは起動することになります。
RUN apt-get update -qq && apt-get install -y build-essential nodejs
コンテナ内で実行するコマンドです。build-essentialとNode.jsをインストールします。(Railsの動作に必要)
RUN mkdir /app 及び WORKDIR /app
コンテナに「/app」(Railsを構築するディレクトリ)というディレクトリを作り作業ディレクトリとしています。
COPY Gemfile /app/Gemfile 及び COPY Gemfile.lock /app/Gemfile.lock 及び RUN bundle install
GemfileとGemfile.lockを「/app」にコピーしてインストールします。
COPY . /app
Dockerfileが置いてあるディレクトリを「/app」にコピーします。Railsのアプリケーション実行に必要なファイルを全てコンテナの中に含めるために記載します。なので、Dockerfileが配置されているディレクトリには余計なファイルは配置しないようにしましょう。
Gemfile
1 2 |
source 'https://rubygems.org' gem 'rails', '5.0.0.1' |
source 'https://rubygems.org'
Gemのダウンロード元のURLを記載します。
gem 'rails', '5.0.0.1'
ダウンロードするRailsのバージョンを指定します。
Gemfile.lock
何も記述しなくても大丈夫です。
docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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: XXX(任意のパスワード) volumes: db-volume: |
各コンテナの通信
コンテナのサービス名(「web:」や「db:」で指定した名前)でコンテナ間通信を行うことが可能です。
web:
Railsのコンテナの定義になります。
build.
Dockerfileを読み込んでイメージを作成しています。
command: bundle exec rails s -p 3000 -b '0.0.0.0'
コンテナを起動した際にデフォルトで実行されるコマンドです。コマンド内容としてはRailsのWebサーバーを起動するコマンドになっています。「bundle exec rails」と指定することでGemfileでインストールしたRailsコマンドを実行することができます。
「-p」はポート番号、「-b」はbindするIPアドレスを示します。「0.0.0.0」と指定した場合はコンテナが持っている全てのネットワークインターフェイスに3000番ポートへの通信がきた場合はRailsサーバが応答します。bindとかの意味については下記の記事で解説しています。
volumes: - .:/app
PC上のdocker-compose.ymlが配置されているディレクトリをコンテナ上の「/app」ディレクトリに共有させます。この設定によりPC上で修正したソースコードがコンテナ上に反映させることができます。
ports: - 3000:3000
コンテナの外部に3000番ポートを公開するための設定です。コンテナで動作しているRailsに自端末のPCからアクセスするための設定です。
depends_on: - db
Railsが起動する前に「db(すなわちMySQL)」が起動するように設定します。
tty: true 及び stdin_open: true
Railsでprayを使用してデバッグする際の設定です。
db:
MySQLサーバのコンテナ定義になります。MySQLのホスト名にも「db」と記載しコンテナのサービス名が使われることになります。
「volumes: - db-volume:/var/lib/mysql」 及び 「volumes: db-volume:」
PC上に「db-volume」という名前でボリューム(データ保存領域)を作成し、これをコンテナ上の「/var/lib/mysql」というディレクトリにマウントしています。これによりコンテナ上にデータが保存されてしまうのを防ぎコンテナを削除した場合でもデータも合わせて削除されてしまうということを防ぎます。コンテナを作り直したとしてもデータが保持されることになります。
environment: MYSQL_ROOT_PASSWORD: password
コンテナ内の環境変数になります。MySQLのrootパスワードを設定するために使用しています。
Raisを新規作成するコマンド
Railsアプリの作成
下記コマンドを使用してRailsアプリを作成します。
1 |
docker-compose run web rails new . --force --database=mysql |
docker-compose run web
docker-compose.ymlファイルに記述したwebコンテナ上で後ろに続くRailsコマンドを実行するためのコマンドになります。
.
/appディレクトリにてRailsアプリを作成します。
--force
既存ファイルを上書きする設定です。GemfileやGemfile.lock等のファイルを上書きして使うために必要な設定になります。
--database=mysql
RailsアプリでMySQLを使うための設定です。
作成したRailsアプリをコンテナ内に取り込む
下記コマンドで再度Dockerfileからイメージをビルドします。
1 |
docker-compose build |
データベースの設定
「config/database.yml」を開き、rootのパスワードとホスト名を下記のように設定します。
1 2 3 4 5 6 7 |
default: &default adapter: mysql2 encoding: utf8 pool: 5 username: root password: docker-compose.ymlで決めた任意のパスワード ★ host: db ★ |
パスワードはDBコンテナの環境変数で指定した「MYSQL_ROOT_PASSWORD」に合わせる必要があります。
コンテナを起動する。
現在のディレクトリにあるdocker-compose.ymlに基づいてコンテナを作成します。webコンテナもdbコンテナもどちらも起動します。
1 |
docker-compose up -d |
下記コマンドでコンテナが正常に起動しているか確認できます。
1 |
docker-compose ps |
RailsのDBを作成
DBコンテナは作成されましたが、RailsのDBはまだ作成されていないので下記コマンドを実行して作成します。
1 |
docker-compose run web bundle exec rake db:create |
bundle exec rake db:create
Rails環境にインストールされているrakeコマンドを実行します。「rake db:create」にてRailsで使用するDBをMySQL上に作成します。
Webコンテナ上のRailsにアクセスする。
下記のように打てばWebコンテナ上に配置したRailsにアクセスすることが可能です。
1 |
http://localhost:3000/ |
なお、ローカルのホストPCですでに3000番ポートを使用しているアプリがある場合はポートフォワーディングされず表示されませんのでポートを開放してから実行するようにしましょう。
この記事へのコメントはありません。