※ 本講座は、動画コンテンツが未作成です。
Contents
はじめに
今回のレッスンでは、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 でもいくつか種類があります。有名どころをいくつかあげておくと、
- Oracle Database
- MySQL
- PostgreSQL
- 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つの設定ファイル
- Dockerfile
- 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"
この設定を、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 を使って進めるようにお願いします。