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.cnf
がMySQL起動時に読み込まれて、こっちの思い通りに設定できちゃうのさ。
-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 hoge
のhoge部を名前変えておくか、削除しておくかせんといかんぞ。
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系を開発環境用途で準備すると、ローカルが汚れないし、起動は速いし、ヤヴァイ。
この調子で増やしていこうって思った。
以上です。