2021/05/29

MySQL Dockerコンテナの作成

アプリケーションがデータベースを必要とする場合、どこにデータベースを持ちましょうか。結合・総合環境ならネットワーク上に配置してもよいかもしれませんが、開発・単体テストやお客様向けのデモなどで個別またはポータブルな環境が必要な場合は、やはり自分の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コンテナを起動し、バックグラウンドで実行中となっていることを確認します。

  1. コマンドプロンプトを起動します。
  2. MySQLコンテナ用フォルダのパスへカレントディレクトリを移動します。
    > cd C:\Work\docker\mysql
  3. 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
  4. MySQLコンテナを起動します。
    環境変数MYSQL_ROOT_PASSWORDとしてMySQLルートパスワードを指定し、バックグラウンドプロセスとして起動するように指定しています。
    > docker container run --rm --name mysql-local -e MYSQL_ROOT_PASSWORD=mysql -p 3306:3306 -d mysql
    23e0bc5c4d1904b8d23f1ef058bde246a7f3f33e4cbd2b4d22f5b5bb67f43efa
  5. 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データベースを作成します。

  1. MySQLコンテナにログインします。
    > docker exec -it mysql-local /bin/bash
    root@23e0bc5c4d19:/#
    
  2. 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>
  3. mysqldbというデータベース名でDBを作成します。
    mysql> CREATE DATABASE if not exists mysqldb;
    Query OK, 1 row affected (0.00 sec)
    
  4. 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)
    
  5. DB接続を終了して、MySQLコンテナからログアウトします。
    mysql> exit
    Bye
    root@23e0bc5c4d19:/# exit
    exit
    


おわりに

MySQLコンテナを作成でき、コンテナに直接ログインし、DBおよびテーブルの作成ができました。今回は外部からの3306/tcp経由での接続テストを行いませんでしたので、次回MySQLワークベンチというツールからアクセスできるかを確認してみたいと思います。

このMySQLコンテナの活用によって、自分のPC環境を汚さない、もしくは他へ同じ環境を簡単に持っていく/コピーできるようになりました。Dockerコンテナは本当に便利ですね。