読者です 読者をやめる 読者になる 読者になる

毎日Learning

学んだことを共有します

MacでDocker上にMySQLを開発環境用に構築したった

MacでHomebrewを使ってMySQLをインストールすると、デフォで入るのが、MySQL 5.7だったり、brew uninstallしても、たまに設定ファイルとか残って嫌なときってあるじゃないですかー。

そんなとき、Docker上にMySQLを構築して、開発環境として出来ると便利じゃないかなーって思ったので、やってみた。

DockerにMySQL5.6のイメージを取得

取得は https://hub.docker.com/_/mysql/ から出来る。

$ docker pull mysql:5.6

5.6 と指定しているところをいい感じに用意したいMySQLのバージョンを指定すると、そのバージョンにできるっていうのが魅力的すぎる。

ちゃんとpullできたかは、 docker images で確認。

$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
mysql                   5.6                 xxxxxxxxxxxx        5 weeks ago         324.6 MB

MySQLの設定ファイルをローカルで作成しておく

このあと、MySQLを起動するんだけど、その前に、Dockerコンテナ上で起動するMySQLのコンフィグファイルを前もって作成しておく。

MySQLって基本、utf8とかutf8mb4で使ったりすることあると思うので、結構、大事これ。

今回は、 ~/tmp/mysql/my.cnf に作って置いておくぞ。

[client]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
innodb-file-format=barracuda
innodb_file_format_max=barracuda
innodb-file-per-table=1
innodb_large_prefix=1

こんな感じで。

DockerでMySQL5.6を起動する

Imageから起動するぞ。

$ docker run --name hoge -e MYSQL_ROOT_PASSWORD=hogehoge -v ~/tmp/mysql:/etc/mysql/conf.d -d -p 3306:3306 mysql:5.6

って感じで実行する。

--name hoge

hogeのところは、好きに名前をつけてあげると良い。 ここの名前でこのあと、Dockerコンテナを停止したり削除したりできるし、同じ名前で無駄にコンテナを作ったりにならないから名前つけておくと便利。

-e MYSQL_ROOT_PASSWORD=hogehoge

hogehogeのところは、コンテナ上のMySQLのrootパスワードを外から指定する。 これを良い感じに指定しておくと、あとあと、何かと使える。

-v ~/tmp/mysql:/etc/mysql/conf.d

こうやって指定しておくと、ローカルの ~/tmp/mysql ディレクトリが、 コンテナ上の /etc/mysql/conf.d ディレクトリにマウントされる。 そったら、さっき作った my.cnfMySQL起動時に読み込まれて、こっちの思い通りに設定できちゃうのさ。

-p 3306:3306

ここは、コンテナ内のポートをローカルのポートにマッピングする。 地味に、既にMySQLがローカルで動いていて、3306ポートつかえないって感じでハマったりするぞ。

MySQLの起動を確認してみる

まずは、コンテナちゃんと起動してるか確認しよう。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
xxxxxxxxxxxx        mysql:5.6           "docker-entrypoint.sh"   5 minutes ago       Up 5 minutes        0.0.0.0:3306->3306/tcp   hoge

ほっほーいけてる。

これであかんときは、 docker ps -a を実行してみると、起動に失敗しているコンテナが見つかる。 あかん理由は色々あるやろけど、よくあるのが、ポートとかmy.cnfの記述が間違ってるからMySQL起動できへんかったとか、そんなんやと思う。

あと、再度、 docker run を実行するときは、 --name hogehoge部を名前変えておくか、削除しておくかせんといかんぞ。

Dockerコンテナにアクセスしてmysqlコマンドを実行してみる

ほったら、mysql確認するべさ。

$ docker exec -it polarisweb bash
root@xxxxxxxxxxxx:/#

って感じ。

あとは、コンテナ上で、

root@xxxxxxxxxxxx:/# mysql -u root -phogehoge
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.30 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

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.

my.cnfの設定がいけてるか文字コードを確認しときましょう。

mysql > show variables like "chara%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

ってなってたら、勝ったも同然。

ローカルからコンテナのMySQLに接続する

MySQLはコンテナ上で動いているので、Dockerをどーゆー環境で構築しているかによって、ローカルからの宛先が変わることになるが、ぼくは docker-machineを使っているので、以下の感じで宛先を見つける。

docker-machine ls
NAME       ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
docker-m   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.11.1

そったらローカルからは、たとえばmysqlクライアントを使うと以下みたいな感じでアクセスする。

$ mysql -h 192.168.99.100 -u root -phogehoge

これで、jdbcなりなんなりで、MySQLに接続できるはず!!

まとめ

Dockerでmiddleware系を開発環境用途で準備すると、ローカルが汚れないし、起動は速いし、ヤヴァイ。

この調子で増やしていこうって思った。

以上です。