Rails 環境で SQL サーバーを用意する場合、標準だと SQLite になっています。
開発環境として、MySQL を使用することもできますが、システムにインストールするとそのうち DB 名がぶつかる可能性も考えられます。
なので、今回は Docker で MySQL を準備してみます。
参考
実行環境
- macOS Mojave 10.14.4
そもそも Rails から Mysql への接続の仕方
Rails から、MySQL に接続するには方法が 2 つある。
それぞれで、config/database.yml の書き方が異なる。
TCP(ローカルインストール MySQL)
IP とポートを指定して接続するパターン。
host と port を指定する。
1 | default: |
UNIX ドメインソケット(ローカルインストール MySQL)
UNIX ドメインソケットを使用して接続するパターン。
socket を指定する。
1 | default: |
以上で mysql の接続の方法を確認できました。
これを踏まえて、Docker で MySQL を用意します。
作成する Docker コンテナの元イメージはmysql Docker Official Imagesを使用します。
Docker イメージ入手
以下コマンドで docker イメージを入手します。
1 | docker pull mysql |
Docker で MySQL を用意してみる
今回も、TCP と UNIX ドメインソケットそれぞれを試します。
TCP(Docker 構築 MySQL)
以下コマンドで Docker コンテナ作成と起動をします。
1 | # コンテナの作成 |
これでコンテナが起動する。
ここで TCP 用の設定を config/database.yml に以下の通り入力する。
1 | default: |
以下の通り、入力して rails アプリを起動します。
1 | # DB作成 |
これでコンテナ上の MySQL に TCP で接続して Rails アプリが起動します。
UNIX ドメインソケット(ローカルインストール MySQL) できなかった
コンテナ上の MySQL が作成している mysql.sock の作成先を調べます。
一旦 TCP 接続のために作ったコンテナを使って確認します。
1 | # dockerコンテナの中に入る。 |
mysql.sock は、mysql コンテナ上で mysqld.sock という名称だと確認できました。
パスは/var/run/mysqld/mysqld.sock なので、/var/run/mysqld ディレクトリをローカルにマウントさせればよさそうです。
以下のコマンドで、コンテナを作成と起動します。
1 | # コンテナの作成 |
ここで、/tmp を確認すると、mysqld.sock 他があることを確認できます。docker stop mysql_sock
すると、mysqld.sock 他が消えます。
ここで UNIX ドメインソケット用の設定を config/database.yml に以下の通り入力する。
1 | default: |
以下の通り、入力して rails アプリを起動します。
1 | # DB作成=>失敗 |
ここまでやってみましたが、.sock ファイルをローカルにマウントさせる方法はできませんでした。
うーん残念。
どうにも納得できなくて、再度 UNIX ドメインソケットについて調べ直しました。
「単一オペレーションシステム内で~」というのが見落としポイントでした。
確かに MySQL はコンテナ上に立ち上がっているので、確かに単一オペレーションシステム内ではないです。
だから、.sock ファイルをローカル側から見えるようにしてもダメでした。
この点については納得しました。
番外:docker 上の MySQL にローカルから直接接続
TCP 接続用の MySQL コンテナに、ローカルの mysql クライアントで接続できます。
一々コンテナの中に入って mysql クライアントを起動するよりも楽です。
1 | mysql -u root -p -h 127.0.0.1 --protocol=TCP |
今回は Rails 開発環境用に MySQL を Docker で用意してみました。
結果として UNIX ドメインソケットを学ぶきっかけになったのがよかったです。
今後はケースバイケースで、docker で DB の用意します。
ではでは。