Dockerのインストール
RubyとMySQLのDockerイメージをダウンロード
$ docker pull mysql:タグ名
$ docker pull ruby:タグ名
- 完了したら
Status: Downloaded newer image for [ダウンロード対象]
というメッセージが表示 - ダウンロードされたか
docker images
で確認
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ruby タグ名 f28a9e1d0449 4 days ago 868MB
mysql タグ名 ba7a93aae2a8 2 weeks ago 372MB
- ダウンロードされていれば、上記内容が表示されるはず
Dockerfile作成
FROM ruby:2.6.0
ENV LANG C.UTF-8
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN gem install bundler
WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install
ENV APP_HOME /app_name
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
ADD . $APP_HOME
-
FROM
- 使用するイメージを指定。先ほどダウンロードしたRubyのイメージを指定。
-
ENV
- 環境設定。形式は、key-valueとなっている。
-
RUN
- 実行コマンド?ここに記載したコマンドは、ビルド時に実行される?
-
WORKDIR
- RUNやADDなどの命令実行対象ディレクトリを指定
-
ADD
- ファイルを追加する。形式は、ソース-送信先となっている
- ソース
- 追加したいファイルなどを指定
- 送信先
- どこにそのファイルなどを追加したいかを指定
- ソース
- ファイルを追加する。形式は、ソース-送信先となっている
-
apt-get update -qq
-
apt-get update
- パッケージリストの更新
-
-qq
- エラー以外は表示しない
-
apt-get update
-
apt-get install -y build-essential libpq-dev nodejs
-
apt-get install
パッケージをインストール -
-y
- 全ての問い合わせに Yes で答える
-
build-essential
- 基礎開発ツール一式が格納されたパッケージ
-
libpq-dev
- よくわからないが、何かしらが格納されたパッケージ
-
nodejs
- サーバーサイドのJavaScript
-
apt-get install
参考
- Dockerfile リファレンス
- apt-getコマンドを使う
- apt-get updateは何を行っているのか調べてみた〜パッケージインデックスファイルとは何か〜
- Bundlerとは?
- Dockerfileについて
Gemfile作成
source 'https://rubygems.org'
gem 'rails'
-
source
- gemが置いてある場所を指定
-
gem
- gemコマンドで使用するgemを指定
参考
空のGemfile.lock作成
$ touch Gemfile.lock
-
Gemfile.lock
- Gemfileを元に実際にインストールされたgemに加え、依存関係にあるgemが記述されたファイル
docker-compose.yml作成
version: '2'
services:
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/app_name
ports:
- "3000:3000"
depends_on:
- db
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=password
-
version
- 任意の値で定義なしはversion: '1'という扱いになる
-
services
- バージョン2を指定した場合セットで定義
- 以下にサービス内容を定義する
- バージョン2を指定した場合セットで定義
-
image
- 既存イメージを用いる場合指定
-
environment
- 環境変数などのexportをする
- MySQLを使用する場合必須
- 環境変数などのexportをする
-
command
- デフォルトコマンドの上書き
-
volumes
- マウント先指定
- 形式は、[ホスト名:コンテナ]
- 今回の場合だと、カレントディレクトリをapp_nameというディレクトリにマウントしている
- 形式は、[ホスト名:コンテナ]
- マウント先指定
-
ports
- ポートを指定
- 形式は、[ホスト:コンテナ]
- ポートを指定
-
depends_on
- コンテナの作成順序と依存関係を決める
参考
- Docker & Docker-Composeの基本的な使い方
- Docker Compose - docker-compose.yml リファレンス
- docker-compose depends_onとlinksの違い
Railsの雛形作成
$ docker-compose run web rails new . --force --database=mysql --skip-bundle
- webのコンテナに対して、rails newで雛形作成
-
--force
- 既存のGemfileを書き換える
- この後に再度ビルドし直す必要があるので、この時点では**--skip-bundle**でビルドをスキップする
- 既存のGemfileを書き換える
Gemfile編集
gem 'therubyracer', platforms: :ruby
- therubyracerのコメントアウトを外す
参考
ビルドする
$ docker-compose build
database.ymlの編集
- 編集点
-
password
- docker-compose.ymlのMYSQL_ROOT_PASSWORDと同じ値にする
-
host
- docker-compose.ymlのdepends_onと同じ値にする
-
password
※その他はRailsの雛形作成時に生成された内容で問題無いはず。
※編集後↓
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: password
host: db
コンテナの実行
$ docker-compose up -d
-
-d
- バックグラウンドで実行
- この後model作成がある為、バックグラウンドで実行
- バックグラウンドで実行
model作成
$ docker-compose run web rake db:create
You must use Bundler 2 or greater with this lockfile.が表示されたら…
- Bundlerのバージョン2.0.1が悪さをしている模様。根本原因は不明。
- 以下の手順で以前のバージョンを入れる
-
- gemfile.lockの中身全削除
-
- $ gem install bundler -v バージョン
- 古いバージョンのBundlerのGem取得
-
- $ bundler バージョン install
- Bundlerをインストール
-
- docker-compose build
- ビルドし直す
-
- $ docker-compose run web rake db:create
- 再度modelを作成する
-
参考
[https://qiita.com/yoshijbbsk1121/items/87250501b32c6433943e](You must use Bundler 2 or greater with this lockfile.)
ブラウザアクセス
- localhost:3000にアクセス
お疲れ様でした!!!
おまけ
Twitterやってます!外部のエンジニアの方ともどんどん繋がりたいと考えていますので、是非フォローして頂ければと思います!@Tatsuo96
ブログ始めました!
https://note.mu/tatsuo_iriyama