0
0

DockerでMySQLを始める

Last updated at Posted at 2024-06-23

はじめに

MySQLの勉強を始める時に環境構築が大変だったので、Dockerを使うことにしました。
Dockerを使うと、ホストの環境を汚すことなくMySQLの環境を作れるのでおすすめです。
本記事は、Docker Desktopがインストールされている前提で書いています。

MySQLイメージ

Dockerコンテナ上で作ったデータは、コンテナを削除するとなくなってしまいます。データを永続化させるため、ボリュームを使います。

docker volume create test_mysql

このボリュームをマウントして、コンテナを作ります。
以下のコマンドで、your-passwordのところには任意のパスワードを書いてください。MySQLサーバーへ接続するときに使います。
また、MySQLコンテナは通常、データを/var/lib/mysqlディレクトリに保存します。
target属性を他のディレクトリに変えると、データが永続化されないのでご注意ください。

docker run --name mysql1 --mount type=volume,source=test_mysql,target=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=your-password -d mysql:latest

コンテナが作られるので、コンテナの中に入ります。

docker exec -it mysql1 bash

コンテナ内で以下のコマンドを打つと、MySQLサーバーへ接続されます。
パスワードを要求されるので、コンテナを作ったときに設定したパスワードを入力します。

mysql -p

データベース、テーブルの作成

MySQLチュートリアルの中から、データベースとテーブルの作成部分だけ抜き出しています。
MySQLクライアントに入力してデータベースを作ります。
ちなみに、メナジェリー(menagerie)とは、展示目的で飼育されている動物のコレクションのことです。

mysql> CREATE DATABASE menagerie;
mysql> USE menagerie

USE menagerieでデータベースにアクセスできます。このとき、最後にセミコロンが要らないので注意してください。
データベースにアクセスできたら、petテーブルを作ります。

mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);

データのロード

petテーブルにデータをロードします。公式のチュートリアルにしたがって、以下のテキストファイルをロードすることにします。

pet.txt
Fluffy	Harold	cat	f	1993-02-04	\N
Claws	Gwen	cat	m	1994-03-17	\N
Buffy	Harold	dog	f	1989-05-13	\N
Fang	Benny	dog	m	1990-08-27	\N
Bowser	Diane	dog	m	1979-08-31	1995-07-29
Chirpy	Gwen	bird	f	1998-09-11	
Whistler	Gwen	bird	\N	1997-12-09	
Slim	Benny	snake	m	1996-04-29	

pet.txtをコンテナの中にコピーします。新しいターミナルを開いてください。
docker cpコマンドでコピーできますが、コピーするときにはコンテナIDが必要なので、docker psでコンテナIDを確認します。
ファイルをコピーする場所に特段の指定はありませんが、ここでは一時ディレクトリにコピーします。

docker ps
docker cp <path>/pet.txt <CONTAINER ID>:/tmp

MySQLではセキュリティ上の理由から、コンテナの中のローカルファイルをロードできないようになっています。以下の記事を参考にして、一時的にローカルファイルをロードできるように設定を変更します。

まずはMySQLのデータベースに接続しているターミナルに切り替えて、接続を切ります。

mysql> QUIT

もう一度MySQLに接続します。このときに、クライアント側の--local-infileをONにします。

mysql -p menagerie --local-infile=ON

上記のmenagerieはパスワードではなく、先ほど作ったデータベースの名前です。
続いて、一時的にlocal_infile変数をONにします。

mysql> SET GLOBAL local_infile=ON;

これでローカルファイルをロードできるようになります。ロードした後は変数の値を元に戻しておきます。

mysql> LOAD DATA LOCAL INFILE '/tmp/pet.txt' INTO TABLE pet SET death=NULLIF(death, 0);
mysql> SET GLOBAL local_infile=OFF;

ここで、日付型にNULLを入れるとき、上記のようにNULLIFが必要でした。
petテーブルの中身を確認すると、ロードできていることが確認できました。

mysql> SELECT * FROM pet;
実行結果
+----------+--------+---------+------+------------+------------+
| name     | owner  | species | sex  | birth      | death      |
+----------+--------+---------+------+------------+------------+
| Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL       |
| Claws    | Gwen   | cat     | m    | 1994-03-17 | NULL       |
| Buffy    | Harold | dog     | f    | 1989-05-13 | NULL       |
| Fang     | Benny  | dog     | m    | 1990-08-27 | NULL       |
| Bowser   | Diane  | dog     | m    | 1979-08-31 | 1995-07-29 |
| Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL       |
| Whistler | Gwen   | bird    | NULL | 1997-12-09 | NULL       |
| Slim     | Benny  | snake   | m    | 1996-04-29 | NULL       |
+----------+--------+---------+------+------------+------------+
8 rows in set (0.00 sec)

データが永続されているかの確認

前節まででテーブルの作成までできました。ここでは、コンテナを削除してもデータベースが残っているかを確認します。
まずはMySQLデータベースおよびコンテナとの接続を切ります。MySQLではQUIT、Dockerコンテナではexitコマンドで接続を切ることができます。

mysql> QUIT
bash-5.1# exit

docker psコマンドでコンテナIDを確認して、コンテナを削除してみましょう。

docker ps
docker stop <CONTAINER ID>
docker rm <CONTAINER ID>

もう一度docker psコマンドを打つと、コンテナが削除されていることが確認できます。さて、もう一度新しくコンテナを作ってみます。
わかりやすさのため、コンテナ名をmysql2に変えています。その他は同じです。

docker run --name mysql2 --mount type=volume,source=test_mysql,target=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=your-password -d mysql:latest
docker exec -it mysql2 bash

コンテナの中に入ったら、再びMySQLに接続します。

mysql -p

データベースの一覧を確認すると、menagerieが残っていることがわかります。

mysql> SHOW DATABASES;
実行結果
+--------------------+
| Database           |
+--------------------+
| information_schema |
| menagerie          |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

また、テーブルも残っています。

mysql> USE menagerie
mysql> SHOW TABLES;
実行結果
+---------------------+
| Tables_in_menagerie |
+---------------------+
| pet                 |
+---------------------+
1 row in set (0.00 sec)

おわりに

MySQLの勉強を始めようと思ったものの、最初のテーブル構築までで時間がかかったので、やり方をコマンドを省略せずにまとめました。
MySQLをこれから始める方の参考になれば幸いです。

参考

Docker Hub MySQL original image
MySQL Tutorial

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0