Dockerにはローカルのディレクトリの一部をボリューム(外部記憶装置)としてコンテナ内にマウントする(組み込む)機能があります。これを使ってSQLファイルをローカルで編集してDockerコンテナのMySQLサーバーで実行できるようにしてみましょう。
DockerコンテナでMySQLサーバーを作ればMySQLクライアントからSQLを直接実行して使うことはできます。
しかしDockerのディレクトリ同期機能を使えば、予めSQLを別のファイルとして用意しておき、ローカルで好きなエディタを使って作成・編集したうえで手軽に実行することができます。
また、作ったファイルをローカルにも保存しておけるので、コンテナを削除してもSQLファイルは残しておくことができます。
目次
ディレクトリ同期したコンテナの作成
Dockerコンテナを作成する際に -v オプションを使うことにより、指定したディレクトリをローカルディレクトリと同期したコンテナを作成することができます。
コマンドプロンプトを開き次のコマンドを実行します。
docker run -d --name mysql_practice -e MYSQL_ROOT_PASSWORD=pass -v %CD%/db:/var/lib/mysql mysql
-v のあとの %CD%/db は同期するローカル側のディレクトリを指定しています。今回は現在のディレクトリの直下に db というフォルダを作成して同期するよう指定しています。
※ %CD% はワーキングディレクトリを指定しています。Macの方は代わりに $(pwd) として下さい。
その後に続く : のあとの /var/lib/mysql は同期させるコンテナ側のディレクトリを指定しています。
このコードを実行すると、mysqlサーバーのコンテナが作成されるとともに、コンテナ内の/var/lib/mysql mysql ディレクトリの内容と同期したdbフォルダが、ローカル側のユーザーフォルダ直下に作成されます。
ローカルのユーザーフォルダを確認し、dbディレクトリが作成されていることも確認しておきましょう。
テスト用のSQLファイルを作成
今回は test.sql という名前で次の内容を記述したSQLファイルを用意しました。
DROP TABLE IF EXISTS titles; CREATE TABLE titles ( author_id INT, post_title VARCHAR(50) ); DESC titles; SHOW TABLES; INSERT INTO titles (author_id, post_title) VALUES (1, 'MySQLとは'), (2, 'SQLとはなにか'); SELECT * FROM titles;
titles テーブルを作成し、テーブルの構造とテーブルの一覧を確認、その後レコードを挿入し、titlesテーブルの全てのレコードを取得するSQLです。
これを先ほど作成されたdbディレクトリに配置します。
データベースの作成
SQLファイルを実行するためのデータベースを作成しておきましょう。
次のコマンドで先ほど作成したDockerコンテナのシェルに入り
docker exec -it mysql_practice bash
次のコマンドでMySQLクライアントを機動
mysql -uroot -p
今回は test という名前のデータベースを作成します。
CREATE DATABASE test;
データベースが作成できたことを確認しておきましょう。
SHOW DATABASES;
これでMySQLサーバー内に、今回作成したSQLファイルを実行するための testデータベースが用意できました。
DockerコンテナのMySQLサーバーでテスト用のSQLファイルを実行してみる
では、先ほど用意した test.sql を実行してみましょう。
exit でMySQLクライアントから抜けて、Dockerコンテナのシェルで
cd /var/lib/mysql
で同期させたコンテナ側のディレクトリに移動します。
次のコマンドで用意したSQLファイルを実行します。
mysql -u root -p test< test.sql
用意した testデータベースの中にtitlesテーブルが作成され、レコードが挿入されているのが確認できます。
実行した test.sql のあるコンテナ内のディレクトリ(cd /var/lib/mysql)はローカルのディレクトリ(C:\Users\User\db)と同期しているため、ローカル側で test.sql を編集すればコンテナ側にも反映され、もう一度実行してあげればデータベースを書き換えたりすることができます。