MySQLをDockerコンテナで用意する方法

MySQLをDockerコンテナで用意する方法について調べていたところ、「Dockerの公式MySQLイメージの使い方を徹底的に解説するよ · DQNEO起業日記:」が参考になりました。自分用にまとめなおしてみました。ここにある内容で、ホストマシンへ直接MySQLをインストールしなくてもDockerコンテナに用意する方法の基本がわかるはずです。ただし、Dockerの基本知識はすでにあるものとして記述してあります。

イメージの取得とコンテナの起動
公式のイメージはdocker pullコマンドで入手できます。

$ docker pull mysql

イメージ取得で時間がかかりますが、入手できたらコンテナの起動はすぐです。例えば、mysqld001という名前で起動するには次のようにします。「-e」オプションでMySQLのrootパスワードを指定している点に注意してください。

$ docker run \
 --name mysqld000 \
 -e MYSQL_ROOT_PASSWORD=secret \
 -d mysql

コンテナが起動していることの確認はdocker psを使います。起動時にdocker-entrypoint.shを使っていることがわかります。「mysql/docker-entrypoint.sh at master · docker-library/mysql · GitHub」などで公開されているので、ソースコードを見ると勉強になります。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
52d5838f776d        mysql               "docker-entrypoint.sh"   21 seconds ago      Up 19 seconds       3306/tcp            mysqld000

起動したMySQLサーバーへ接続するにはdocker execを使います。docker psで確認したCONTAINER IDをdocker execへ指定してアタッチできますが、grepとawkを組み合わせるとコマンドで取得できるので、そうしています。アタッチしたらmysqlコマンドで普通にMySQLサーバーへ接続できます。

$ docker exec \
 -it `docker ps|grep mysqld000|awk '{print $1}'` \
 bash
root@52d5838f776d:/# mysql -u root -p
Enter password:  ← 文字は表示されませんがsecretと入力
(略)
mysql> ← mysqlプロンプトが表示されたらOK
(略)
mysql> quit
root@52d5838f776d:/# exit

quitでmysqlクライアント終了、exitでコンテナで動かしていたbashを終了するとホストへ戻れます。

起動したら片付け方も確認しておきましょう。コンテナの停止はdocker stopを使います。

$ docker stop mysqld000

stopではコンテナは削除されないのでdocker rm で削除します。

$ docker rm mysqld000

mysqlコマンドでの接続
 MySQLクライアント用コンテナをmysqlのDockerイメージから起動してbashを用意。そこからmysqlコマンドで接続します。

$ docker run \
 --link mysqld001:mysql \
 -it \
 --rm \
 mysql \
 bash

 ここで、「--link」は、「接続先コンテナ名」:「エイリアス名」という形式で指定します。mysqlとしておくと、接続先コンテナ名がなんであれ、MySQLクライアント用コンテナからはmysqlというコンテナ名で参照されることになります。
 $MYSQL_PORT_3306_TCP_ADDRにホストの情報が設定されているので、これを使うと接続できます。「MYSQL」は「エイリアス名」で指定した文字列を大文字にしたものになるようです。「エイリアス名」をmysql以外にすると変わるので注意してください。

root@52d5838f776d:/# mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P 3306 -u root -psecret
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.12 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.

mysql> 

 これでデータベースやテーブルを作成できます。ちなみに、接続するためのMySQLサーバの情報はmysqlコマンドを実行するbash上でenvコマンドを実行することで確認できます。

root@52d5838f776d:/# env
HOSTNAME=52d5838f776d
MYSQL_ENV_MYSQL_DATABASE=wp
MYSQL_ENV_MYSQL_ROOT_PASSWORD=mysqlpass
TERM=xterm
MYSQL_VERSION=5.7.12-1debian8
MYSQL_ENV_GOSU_VERSION=1.7
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_PORT_3306_TCP=tcp://172.17.0.2:3306
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MYSQL_ENV_MYSQL_USER=wpuser
PWD=/
MYSQL_ENV_MYSQL_PASSWORD=secret
MYSQL_ENV_MYSQL_VERSION=5.7.12-1debian8
HOME=/root
SHLVL=1
MYSQL_PORT_3306_TCP_PROTO=tcp
MYSQL_NAME=/grave_mccarthy/mysql
MYSQL_MAJOR=5.7
MYSQL_PORT_3306_TCP_ADDR=172.17.0.2
GOSU_VERSION=1.7
MYSQL_ENV_MYSQL_MAJOR=5.7
MYSQL_PORT=tcp://172.17.0.2:3306
_=/usr/bin/env

また、別のターミナルでdocker psで確認するとクライアント用のコンテナが起動していることがわかります。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
52d5838f776d        mysql               "docker-entrypoint.sh"   7 seconds ago       Up 5 seconds        3306/tcp            grave_mccarthy
0c627d38b6a9        mysql               "docker-entrypoint.sh"   2 minutes ago       Up 2 minutes        3306/tcp            mysqld002

なお、クライアント用のコンテナはexitすると削除されるので、docker rmで明示的に消す必要はありません。

ホストマシンでmysqlコマンドが使えるとき
 ホストマシンでmysqlコマンドが使えるときは、ホストから接続可能にするようポートを指定すると、MySQLクライアント用コンテナを用意しなくても使えます。次の例ではホストマシンの13306とコンテナマシンの3306をつなげています。

$ docker run \
 --name mysqld000 \
 -e MYSQL_ROOT_PASSWORD=secret \
 -d \
 -p 13306:3306 \
 mysql

 mysqlコマンドを実行するときに、-hでホスト、-Pでポート、-uでユーザ、-pでパスワードを指定して接続します。「-p」はパスワードを続けて指定する店に注意してください。コマンドラインで指定したくない時は「-p」だけにするとパスワード入力用プロンプトが表示されます。

$ mysql -h localhost -P 13306 -uroot -psecret

起動時にデータベース作成
 MySQLサーバを使ってみたいだけなら、ここまでの方法で良いのですが、もう少し高度な使い方をしたいときもあります。例えば、データベースを作成した状態で起動したいこともあるでしょう。そういうときは、次のようにします。

$ docker run \
 --name mysqld002 \
 -e MYSQL_DATABASE=wp \
 -e MYSQL_USER=wpuser \
 -e MYSQL_PASSWORD=secret \
 -e MYSQL_ROOT_PASSWORD=mysqlpass \
 -d mysql

mysqlプロンプトを直接開く
 クライアント用のコンテナを起動するときにbashを実行するのではなく、mysqlコマンドを直接実行する方法もあります。指定する文字列が多いので、シェルスクリプトにして用意しておくと手軽で便利でしょう。

$ docker run \
 --link mysqld002:mysql -it --rm \
 mysql \
 sh -c \
 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'

Dockerについては下記の資料も参考になります。

同じタグの記事: Docker
同じタグの記事: MySQL
同じカテゴリの記事: Linux