プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Ruby on Rails
  • 【Docker】Ruby on Railsのコンテナを作成して起動するまで。
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Docker】Ruby on Railsのコンテナを作成して起動するまで。

12.23

  • miyabisan2
  • コメントを書く

この記事は4分で読めます

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とかの意味については下記の記事で解説しています。

【ネットワーク】「bindアドレス」や「0.0.0.0」とは?

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番ポートを使用しているアプリがある場合はポートフォワーディングされず表示されませんのでポートを開放してから実行するようにしましょう。

スポンサーリンク
  • 2019 12.23
  • miyabisan2
  • コメントを書く
  • Docker, Ruby on Rails
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2020 07.18

    【Ruby on Rails】環境変数に関する知識、direnv

  2. 2019 12.02

    【Ruby on Rails】ログ出力の記述法や様々な設定方法、設計方針

  3. 2019 12.16

    【Docker】コンテナの分割単位

  4. 2020 11.02

    【Docker】基本、「マウント(Volumes、bind mounts、tmpfs mounts)」の種類

  5. 2019 12.01

    【Rspec】System Spec(システムスペック)の基本

  6. 2020 09.16

    【Ruby on Rails】ビューヘルパー(エスケープ関連、タグ関連など)

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Ruby】REPL(IRB、pry)について

【ネットワーク】「bindアドレス」や「0.0.0.0…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー