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については下記の資料も参考になります。