【Windows10】Dockerコンテナ内とローカルのディレクトリを同期する方法

【Windows10】Dockerコンテナ内とローカルのディレクトリを同期する方法

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フォルダが、ローカル側のユーザーフォルダ直下に作成されます。

-v オプション付きコマンドの実行結果

ローカルのユーザーフォルダを確認し、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ファイルをdbディレクトリに配置

データベースの作成

SQLファイルを実行するためのデータベースを作成しておきましょう。

次のコマンドで先ほど作成したDockerコンテナのシェルに入り

docker exec -it mysql_practice bash

次のコマンドでMySQLクライアントを機動

mysql -uroot -p

今回は test という名前のデータベースを作成します。

CREATE DATABASE test;
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
テスト用のSQLファイルを実行

用意した testデータベースの中にtitlesテーブルが作成され、レコードが挿入されているのが確認できます。

実行した test.sql のあるコンテナ内のディレクトリ(cd /var/lib/mysql)はローカルのディレクトリ(C:\Users\User\db)と同期しているため、ローカル側で test.sql を編集すればコンテナ側にも反映され、もう一度実行してあげればデータベースを書き換えたりすることができます。

このエントリーをはてなブックマークに追加

コメントを残す

頂いたコメントは一読した後表示させて頂いております。
反映まで数日かかる場合もございますがご了承下さい。