Help us understand the problem. What is going on with this article?

DockerでMySQL複数バージョンを共存させる

More than 1 year has passed since last update.

MacローカルでMySQL5.6.xとMySQL5.7.xを同時に起動して、アプリケーション毎に接続するバージョンのすみ分けができるようにする。

Multiple MySQL Versions with HomebrewとかでHomebrewで両バージョンをインストールして brew switch で切り替える方法でも運用してたが、切り替えやログファイル削除が面倒だったり、Rails -> MySQLのアクセスで不具合が発生したりと面倒だった。

それとDockerを使いたかったので今回はDockerでやってみた。

前提条件

  • macOS Sierra 10.12.6
  • Docker Toolboxがインストールされていること
  • Macローカルで, mysql がインストールされていること (ローカルMacからコマンドから接続するのに必要)

Dockerセットアップ

Dockerホスト作成

$ docker-machine create --driver virtualbox dev

起動確認

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

MySQLセットアップ

Docker公式のMySQLイメージを使用

バージョンを指定せずに docker pull mysql だと最新版が自動的に選ばれる。

$ docker pull mysql:5.7
$ docker pull mysql:5.6

イメージ確認

$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
mysql                           5.7                 sha256:2fd13        2 weeks ago         378.4 MB
mysql                           5.6                 sha256:2c096        2 weeks ago         329 MB

コンテナを起動する

バージョン毎にHost OS ↔ Container 間のポートを変更して起動する。

$ docker run --name mysql5.6 -p 3307:3306 -e MYSQL_DATABASE=test -e MYSQL_USER=root -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
$ docker run --name mysql5.7 -p 3308:3306 -e MYSQL_DATABASE=test -e MYSQL_USER=root -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

追記: docker run するときに,文字セットを指定した方がよい

image.png
Docker公式イメージのMySQLで文字コードを指定する

デフォルトだと latin1 が設定されてしまい,意図しないところで文字化けが発生したりする可能性がある.
例えば mysqldump で作成したダンプに日本語が含まれていると ???? に変換されてしまう.
その場合は --default-character-set=utf8 をつけて実行すれば回避できるが,コンテナ実行時に指定しておく方がよいだろう.

mysql> status
--------------
mysql  Ver 8.0.11 for osx10.13 on x86_64 (Homebrew)

Connection id:      2
Current database:
Current user:       root@192.168.99.1
SSL:            Cipher in use is DHE-RSA-AES256-SHA
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.22 MySQL Community Server (GPL)
Protocol version:   10
Connection:     192.168.99.100 via TCP/IP
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb4
Conn.  characterset:    utf8mb4
TCP port:       3307
Uptime:         14 sec

Threads: 1  Questions: 5  Slow queries: 0  Opens: 105  Flush tables: 1  Open tables: 98  Queries per second avg: 0.357
--------------

コンテナの起動・接続確認

各バージョンのコンテナが起動していればOK

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
caf0cf83cf42        mysql:5.7           "docker-entrypoint.sh"   26 hours ago        Up 5 hours          0.0.0.0:3308->3306/tcp   mysql5.7
dada0336b90a        mysql:5.6           "docker-entrypoint.sh"   27 hours ago        Up 6 hours          0.0.0.0:3307->3306/tcp   mysql5.6

Macから各コンテナ毎に接続できることを確認する。
docker-machine ip dev はDockerホストのIPアドレスを返す。

$ mysql -h$(docker-machine ip dev) -P3307 -uroot -p123456
$ mysql -h$(docker-machine ip dev) -P3308 -uroot -p123456

MySQLコンソールが立ち上がるのでDB/Table/Userの作成なども普通にできる。

コンテナ内のDBに対してSQLファイルを実行する

コンテナIPやポートを指定して .sql ファイルを実行することもできる。

$ mysql -u root -p <DATABASE_NAME> -P <PORT> -h$(docker-machine ip dev) < ~/path/to/file.sql
tanakaworld
A Software Engineer. Creator of proff.io
https://tanaka.world
mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。
https://tech.mercari.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away