アプリケーションがデータベースを必要とする場合、どこにデータベースを持ちましょうか。結合・総合環境ならネットワーク上に配置してもよいかもしれませんが、開発・単体テストやお客様向けのデモなどで個別またはポータブルな環境が必要な場合は、やはり自分のPC上にデータベースが欲しいですね。しかしながら、データベースソフトウェア(DBMS)を自分のPCに直接インストールするのは、少し気が引けます。他のプロジェクトと競合するかもしれません。デモの時だけデータベースがあればいいので、普段はPCを汚さない(必要なら完全にクリーンナップできる)ようにし、必要な時だけ起動できればよいと思ったりします。
そんなときに有用なのがやはりDockerコンテナです。今回は、MySQLをPC上でDockerコンテナとして起動する方法について説明します。
本家のサイトはこちらです。
Dockerの勉強の観点でいえば、以下の点にも注目したいと思います。
- 設定ファイルをPC上で管理し、Docker起動時にコンテナにコピー(必要に応じてPC上で設定ファイルを変更できる)
- 3306/tcp経由でMySQLコンテナにPCから接続
- Dockerコンテナに直接シェルでログインして設定(例:DBの作成)
目次[非表示]
事前準備
DBルートパスワード
MySQLのコンテナを起動するには、コンテナ起動時にDBのルートパスワードを渡す必要があります。事前にパスワードを決めておきましょう。ここでは「mysql」として説明します。
MySQLコンテナ用フォルダ
MySQLコンテナ用のフォルダを作成します。この記事では、フォルダのパスを「C:\Work\docker\mysql」とします。
MySQL設定ファイル
MySQLコンテナ用のフォルダに「my.cnf」というファイル名で、以下の内容のファイルを作成します。DBの文字コードをUTF-8にする、という設定情報を含んでいます。
※自身の環境に合わせて変更・カスタマイズしてください。
[mysqld] character-set-server=utf8 [mysql] default-character-set=utf8 [client] default-character-set=utf8
Dockerfile
MySQLコンテナ用のフォルダに以下の内容のDockerfileを作成します。
FROM mysql:latest EXPOSE 3306 ADD ./my.cnf /etc/mysql/conf.d/my.cnf CMD ["mysqld"]
mysqlイメージの最新版を元にコンテナを作成し、3306/tcpでサービスへ接続できるようにしています。その後、PC上のMySQL設定ファイルをMySQLコンテナ内にコピーし、mysqlデーモンを起動します。
MySQLコンテナの起動
以下の手順でMySQLコンテナを起動し、バックグラウンドで実行中となっていることを確認します。
- コマンドプロンプトを起動します。
-
MySQLコンテナ用フォルダのパスへカレントディレクトリを移動します。
> cd C:\Work\docker\mysql
-
Dockerfileとmy.cnfが存在することを確認します。
> dir Directory of C:\Work\docker\mysql 05/04/2021 08:51 PM 87 Dockerfile 05/04/2021 08:52 PM 114 my.cnf
-
MySQLコンテナを起動します。
環境変数MYSQL_ROOT_PASSWORDとしてMySQLルートパスワードを指定し、バックグラウンドプロセスとして起動するように指定しています。> docker container run --rm --name mysql-local -e MYSQL_ROOT_PASSWORD=mysql -p 3306:3306 -d mysql 23e0bc5c4d1904b8d23f1ef058bde246a7f3f33e4cbd2b4d22f5b5bb67f43efa
-
MySQLコンテナが実行中であることを確認します。
> docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 23e0bc5c4d19 mysql "docker-entrypoint.s…" 2 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql-local
MySQLコンテナにログイン&DB操作
バックグラウンドで実行中のMySQLコンテナにログインし、MySQLデータベースを作成します。
-
MySQLコンテナにログインします。
> docker exec -it mysql-local /bin/bash root@23e0bc5c4d19:/#
-
MySQLルートパスワードを指定して、MySQLサービスに接続します。
mysql -h 127.0.0.1 --port 3306 -u root -p mysql Enter password: Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.0.24 MySQL Community Server - GPL Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
-
mysqldbというデータベース名でDBを作成します。
mysql> CREATE DATABASE if not exists mysqldb; Query OK, 1 row affected (0.00 sec)
-
productというテーブルを作成してみましょう。
mysql> CREATE TABLE `mysqldb`.`product` ( -> `id` INT NOT NULL AUTO_INCREMENT, -> `name` VARCHAR(45) NOT NULL, -> `brand` VARCHAR(45) NOT NULL, -> `madein` VARCHAR(45) NOT NULL, -> `price` FLOAT NOT NULL, -> PRIMARY KEY (`id`)); Query OK, 0 rows affected (0.01 sec)
-
DB接続を終了して、MySQLコンテナからログアウトします。
mysql> exit Bye root@23e0bc5c4d19:/# exit exit
おわりに
MySQLコンテナを作成でき、コンテナに直接ログインし、DBおよびテーブルの作成ができました。今回は外部からの3306/tcp経由での接続テストを行いませんでしたので、次回MySQLワークベンチというツールからアクセスできるかを確認してみたいと思います。
このMySQLコンテナの活用によって、自分のPC環境を汚さない、もしくは他へ同じ環境を簡単に持っていく/コピーできるようになりました。Dockerコンテナは本当に便利ですね。