※ 本講座は、動画コンテンツが未作成です。

はじめに

今回のレッスンでは、DB(データベース)を Docker という仮想環境を作るためのツールを使って構築していきます。

  • Docker とは何か
  • Docker の導入
  • データベースについて解説
  • Docker の設定ファイルについて解説
  • Sequel Pro の導入
  • Rails 側の設定
  • docker コマンド解説

あたりを扱っていきます!盛りだくさんですが、やること自体はシンプルです。ひとつずつ、着実に進んでいきましょう。

Docker とは何か

Docker は「コンテナ」と呼ばれる箱のようなものです。この箱の中身は、これから説明する Docker の設定ファイルによって自動的に作成されます。

つまり、Docker の設定ファイルさえ同じにしておけば、誰が使っても全く同じ環境がワンコマンドで作れる。 そういったツールなんです。

ちょっと図をみてみましょう。

ホストOS というのは、要するにあなたが今動かしている手元のPCのことです。その PC に Docker Engine を入れて、これが、それぞれのコンテナ(箱)を動かします。

今回は、Docker を使ってデータベースを動かすので、コンテナには、「データベース」だけ入るわけです。上図では、データベースと直接書かれてはいないですが、データベースは、大きいくくりでミドルウェアと呼ばれます。

ミドルウェアについて詳しく説明はしませんが、意味をしっかり知っておきたい方は、以下の記事あたりで勉強しておきましょう。

ともかく、ここで伝えたいのは、

Docker を使えば、誰でも簡単に、全く同じ環境の構築ができるようになる!

ということです。

Docker の導入

導入自体はそこまで難しくないのでパパッと終わらせてしまいましょう。

インストール済みか確認

$ docker -v
Docker version 18.09.2, build 6247962

上記コマンドを入力し、バージョン情報が表示されれば、導入は完了しています。

docker command not found

と表示されるようであれば、以下の手順で導入してください。

Docker の導入

公式サイトからブラウザ経由でダウンロードすることもできるのですが、ユーザー登録する必要があり少し面倒なので、Homebrew でインストールします。

$ brew install docker
$ brew cask install docker

これだけです。

Docker 自体、かなりデータ量が多いので、ダウンロードとインストールに結構時間がかかります。気長に待ちましょう。

すべて完了したら、以下のコマンドでバージョンを確認し、表示されれば OK です!

$ docker -v

データベースの種類

さて、ここで一旦 Docker から離れ、データベースについて解説していきます。

前回のレッスンでは、Rails では RDB(リレーショナルデータベース)を使うと解説しましたね。

この RDB でもいくつか種類があります。有名どころをいくつかあげておくと、

  1. Oracle Database
  2. MySQL
  3. PostgreSQL
  4. SQLite

などがあります。

Oracle Database はシェア1位のデータベースです。(参考: マイナビニュース
ただし有料。

MySQL は、シェア2位のデータベースで、Take off Rails ではこちらを採用します。採用理由としては、実際僕が関わってきたプロジェクトでも数多く採用されているのを見てきたという単純な理由です。無料です。

PostgreSQL も無料で人気のデータベースです。Rails アプリを簡単に公開できる Heroku というサービスでは、PostgreSQL を利用しているので、Heroku を触ったことがある方は見覚えがあるかもしれません。

SQLite は Rails のデフォルトのデータベースとして採用されているのですが、どちらかというとモバイルアプリで採用されていることの方が多いですね。

MySQL の導入

Docker に MySQL を導入する場合、特にローカルに MySQL を入れる必要はないのですが、ローカルのターミナルで mysql のコマンドを使えるようにする意味で、一応 mysql を入れておきます。

MySQL プロセスの確認とストップ

とその前に、もしすでに MySQL を導入し、動かしている場合邪魔になるので、動いているものがいないか一旦確認しましょう。以下のコマンドを実行してください。

$ ps aux |grep mysql

chinju           91064   0.0  0.0  4258656    248 s000  R+    4:44PM   0:00.00 grep mysql

このように grep mysql のプロセス1つだけ表示されれば、特に動いていない証拠です。このまま次に行きましょう。もしこれ以外にもいくつか表示された場合は、全部消す必要があります。

mysql は Homebrew で入れる方が多いので、一旦以下のコマンドを実行しましょう。

$ sudo mysql.server stop

そしてもう一度プロセスを確認してください。いなくなっていれば OK です。

これでも消えなければ、続きは Slack で!

MySQL の導入

では入れていきます。最新版の MySQL 8.x 系は、セキュリティに更新が入ったために、色々と面倒なので、1つ古い 5.7 系のものをいれましょう。

$ brew install mysql@5.7
$ brew link --overwrite mysql@5.7 --force
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.25, for osx10.14 (x86_64) using  EditLine wrapper

このように、 mysql のバージョンが 5.7 系に切り替わっていることが確認できたら OK です!

Docker の設定ファイル類

さて、ここから本格的に Docker を扱っていきます。まずは、Docker を動かすための2つの設定ファイル

  1. Dockerfile
  2. docker-compose.yml

について学んでいきましょう。

Dockerfile

Dockerfile は Docker のコンテナを作成するための設定ファイルです。

  • どの OS をもとにコンテナを作るか
  • どんな環境変数を設定するか
  • どんなコマンドを実行するか

といった、コンテナ自体をどういった構成にするかを設定するためのものになります。

なんですが、

実はこのファイルは特に準備しなくても Docker は使えます

どういうことかというと、Dockerfile が指定されていない場合は、Docker Hub と呼ばれる Docker の共通イメージが置かれた場所から、よしなにダウンロードして動くようになっているんです。

今回は、特別な設定を加える必要がないので、ここは省きます。

docker-compose.yml

Docker は基本的に1サービスにつき1コンテナが起動されます。

$ docker-compose

コマンドは、複数の Docker イメージを一気に起動するためのコマンドで、このコマンドでどのミドルウェアを、どんな設定で起動するのかを書くのが、docker-compose.yml になります。

Rails アプリケーション直下(Gemfile とかと同じ階層)に docker-compose.yml というファイルを作成し、以下のように修正してください。

version: '3.2'

services:
  database:
    restart: always
    image: mysql:latest
    ports:
      - 3306:3306
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-datavolume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root

volumes:
  mysql-datavolume:
    driver: local

ここでは、MySQL の最新版を、ログインパスワードは root で導入するように設定しています。

ファイルを作ったら、以下のコマンドを実行してください。

$ docker-compose build

上記コマンドを、初めて実行した場合、docker-compose.yml の設定をもとに必要なデータのダウンロードと構築が行われます。

このコマンドを実行するのが 2 回目以降の場合

database uses an image, skipping

と表示されますが、これはすでに build が終わっている証拠です。

完了したら、docker を立ち上げて、mysql で接続できるか確認してみます。まずは、docker を -d オプションを渡してバックグラウンドで起動しましょう。

$ docker-compose up -d
Creating network "hello_world_rails_default" with the default driver
Creating hello_world_rails_database_1 ... done

こんな感じのログが表示されれば OK。

あとは、mysql での接続を試みます。パスワードは、docker-compose.yml で設定した通り root です。

$ mysql -u root -p -h 127.0.0.1

中略

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql >

 

このように、MySQL が立ち上がれば OK です。exit; で、抜けましょう。(セミコロンをお忘れなく。)

Sequel Pro の導入

次に、Sequel Pro という MySQL を操作しやすくするためのアプリを導入します。

ねこくん
すでに入ってるぜ!

 

という方も、もしかしたらいらっしゃるかもしれませんが、最新版の MySQL を使っている場合、Homebrew 経由でインストールした Sequel Pro でないとDocker の MySQL にアクセスができません。

なので、すでにインストール済みの方は Sequel Pro をゴミ箱に捨てていただいたのち、以下のコマンドを叩いて nightly バージョンの Sequel Pro を導入します。

$ brew cask install homebrew/cask-versions/sequel-pro-nightly

こんなアイコンのアプリが導入されたと思います。立ち上げてみましょう。

以下の画像に倣って、項目を入力し、設定を保存します。

入力が一通り完了したら、Connect ボタンを押してみましょう。

右上に Choose Database のセレクトボックスが表示されたら、ローカルマシンの MySQL に接続できています!

うまくできていない場合は、パスワードの入力ミスや、設定ミスが考えられるので、Slack で質問してください。

Rails 側の設定を修正

さて、無事に Docker で MySQL を立ち上げることができましたね。次は、Rails アプリが、この MySQL に接続できるように調整を加えましょう。

database.yml の修正

adapter を mysql2に、host を 127.0.0.1 に、username と password を root に設定しています。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: 127.0.0.1
  username: root
  password: root

development:
  <<: *default
  database: hello_world_rails_development

test:
  <<: *default
  database: hello_world_rails_test

production:
  <<: *default
  database: hello_world_rails_production

 

Gemfile の修正

Rails は、デフォルトでは SQLite を使うようになっています。

なので、Gemfile.rb の sqlite の部分をコメントアウトし、代わりに mysql を記述します。なお、Gem 名は mysql2 です。該当箇所の差分を表示すると以下になります。

# Use sqlite3 as the database for Active Record
- gem 'sqlite3'
+ # gem 'sqlite3'
+ gem 'mysql2'

修正し終わったら保存し、bundle install しましょう。

$ bundle install

無事にインストールできたら OK です!

bundle install で mysql2 のインストールに失敗したら

以下のコマンドを実行してから、bundle install をするとうまくいくようです。

$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"

参考 URL: bundle install 時、mysql2でエラー

この設定を、bundle コマンド全体に設定したいときは、 --local を --global に変更すればOKです。

※ 本当は、このあたりのハマりポイントも考えると Rails 自体も Docker に入れてしまう、という選択肢もあるのですが、MySQL と違い、Rails server は頻繁に再起動するので、ローカルで動かすようにしています。

docker のコマンド解説

さて、ここまでで Docker を使った MySQL の導入が一通り完了しました。

ただ、docker のよく使うコマンドがわからないと困ることが多いと思うので、厳選して紹介します。

docker-compose build

docker-compose.yml に記載されているサービスのコンテナを作成するコマンド。ダウンロードとインストールを行うため、少し時間がかかる。基本的に初回に1度走らせるだけでよい。

docker-compose up -d

docker compose をバックグラウンドで動かすためのコマンド。一番よく使う。

docker-compose down

docker-compose up で起動したコンテナを落とすコマンド。使わないときは基本落としておきましょう。

docker ps

docker で動かしているコンテナを確認するコマンド。

docker の CONTAINER_ID を確認するのに使うことが多い。

-a オプションを渡すと、停止しているコンテナの情報も確認できる。

docker stop <CONTAINER_ID>

docker ps で確認した CONTAINER_ID を指定して、docker のコンテナをストップするときに使う。

docker rm <CONTAINER_ID>

docker のコンテナを削除するコマンド。

まとめ

今回のレッスンでは、Rails で MySQL を使うための初期設定を、仮想環境構築ツール「Docker」を用いて行いました。

全体のイメージはこんな感じです。

次回はいよいよ、Rails で DB にテーブルを作成するために、migration (マイグレーション)という機能を触っていきます。

毎回のレッスンで学んだことは、すべて繋がっています。MVC のまとめの図を確認しながら、「今どこの学習を進めているか」を意識しつつ、進めていきましょう!

では、お疲れ様でした!

おまけ

データベースの環境構築をローカルマシンですべて済ませてしまうことももちろんでき、その解説も実はしています。

ただ、個々人の環境によって色々とエラーが出てしまい、対応が煩雑になってしまったので、今回の記事を執筆しました。一応、公開自体は引き続き行いますが、基本的に Docker を使って進めるようにお願いします。

 

前の記事 / 次の記事