MySQLの公式Dockerイメージを使おうとしたときのメモ



(追記) MySQL界が誇る優秀な外部APIによってご指摘いただけたのでパスワード周りを訂正

MySQLサーバーのコミュニティ版バイナリが含まれる公式Dockerイメージのマニュアルはこちら。

https://hub.docker.com/r/mysql/mysql-server/

マニュアルに書いてある基本の起動するコマンド

docker run --name my-container-name -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql/mysql-server:tag
オプション 設定項目
--name my-container-nameは任意の名称
-d 対象イメージ タグでMySQLのバージョン等を指定
-e 環境変数 マニュアル中段のEnvironment Variables
-p ポートフォワーディング設定 ホスト側:コンテナ側
-v ディレクトリのマッピング ホスト側:コンテナ側

バージョン等を指定するためのタグの一覧

5.5から8.0のマイナーバージョンを指定可能(全てではない)
https://hub.docker.com/r/mysql/mysql-server/tags/

起動コマンド例

docker run --name my80 -d mysql/mysql-server:8.0 -e MYSQL_ROOT_PASSWORD=mysql -p 6603:3306 -v /Users/mysql/mysql-docker/data:/var/lib/mysql

ちょっとしたハマりどころ

MySQLサーバーのパスワード設定は必須必須ではない、けどオプション必須

初期化オプション --initialize-insecure に該当する設定はなさそうあるけどオプションの指定が必要。パスワード関連の環境変数が設定がされていないとコンテナが起動しない。MYSQL_RANDOM_ROOT_PASSWORDとMYSQL_ONETIME_PASSWORDを設定すると --initialize と同様の動きになる模様。MYSQL_ALLOW_EMPTY_PASSWORDを使うと --initialize-insecure と同様に。

MYSQL_ROOT_PASSWORD 明示的にパスワードを設定
MYSQL_RANDOM_ROOT_PASSWORD ランダムパスワードを設定
MYSQL_ONETIME_PASSWORD 初回ログイン時にパスワードの変更を強制
MYSQL_ALLOW_EMPTY_PASSWORD --initialize-insecureと同様にパスワード無しを許容

ランダムパスワードは下記コマンドで表示されるログにて確認可能

docker logs my-container-name
一瞬では起動しない(いつ起動が完了したか分からない)

コンテナの起動コマンドを打つと一瞬で応答が返ってきて出力もきわめてシンプル。MySQLサーバーがすでに起動しているのかと思ったらまだだったりする。
docker psのSTATUS表示がhealth: startingなら起動中、healthyなら起動済み。
(docker runコマンドのオプションでログをコンソールに出すようにすればよさげな話だけど)

ポートフォワーディング設定時、ホスト側からの接続のためにはユーザー必要

MySQLサーバー側でユーザーを作ってない段階でホスト側のmysqlから接続しに行くと以下のエラー。エラーに出力されるIPアドレス172.17.0.1はDockerコンテナのネットワークのもの。

ERROR 1130 (HY000): Host '172.17.0.1' is not allowed to connect to this MySQL server