Edited at

DockerによるMySQL構築


この記事何?



  • Docker Official Imageの補足的な記事

  • DockerでMySQL構築を初めてやってみたので、色々と調べてみました。

  • 一度理解してしまえば、MySQLのインストールもバージョン変更も数分で終わってしまうので非常に便利だなーと感じました。


Dockerのダウンロード

Docker Desktop (Mac)をここからインストールする

https://docs.docker.com/docker-for-mac/install/


config-file.cnfの作成

config-file.cnfに設定を記載しておくことで、コンテナの起動時にこの設定通りに起動してくれます。


config-file.cnf

$ mkdir -p ~/docker/mysql/custom

$ mkdir ~/docker/mysql/data
$ vi ~/docker/mysql/custom/config-file.cnf
[mysqld]
sql_mode= STRICT_TRANS_TABLES
character_set_server=utf8mb4
collation_server=utf8mb4_bin
table_open_cache=400
skip_character_set_client_handshake

[client]
default_character_set=utf8mb4



  • sql_mode=STRICT_TRANS_TABLES


    • この設定は厳密モードとも呼ばれInsertやUpdateをした値がテーブルの指定に従っていない場合に,SQLの実行を中止します。MySQL5.6からはdefault設定とのことですが明示しておきます



  • 文字コードをutf8mb4で統一しておきます。


コンテナの起動


起動コマンド

$ docker run --name test_mysql -v ~/docker/mysql/custom:/etc/mysql/conf.d -v ~/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=test -e MYSQL_PASSWORD=test -e MYSQL_DATABASE=test -d -p 3306:3306 mysql:8.0.14


runコマンドのリファレンスはこちら



  • --name: コンテナ名称(test_mysql)


  • -v:


    • conf.d指定(~/docker/mysql/custom/config-file.cnf)

    • データ格納ディレクトリ指定(~/docker/mysql/data:/var/lib/mysql)




  • -e: 環境変数


    • MYSQL_ROOT_PASSWORD: rootユーザーのパスワード

    • MYSQL_USER: 初期ユーザー

    • MYSQL_PASSWORD: 初期ユーザーのパスワード

    • MYSQL_DATABASE: 初期DB




  • -d: バックグラウンドでコンテナを起動


  • -p: ポートフォワード(ホスト側ポート:コンテナ側ポート)




コンテナ内のbashに接続する

コンテナの起動が終わったら、コンテナ内のbashに接続して正しく起動できたか確認します。

-it test_mysql bashは、test_mysqlのコンテナでbashプロセスを新規で立ち上げ、それをホスト側から操作するという意味


環境変数の確認

$ docker exec -it test_mysql bash

# env
MYSQL_PASSWORD=test
HOSTNAME=af03bdcbfba9
MYSQL_DATABASE=test
MYSQL_ROOT_PASSWORD=root
PWD=/
HOME=/root
MYSQL_MAJOR=8.0
GOSU_VERSION=1.7
MYSQL_USER=test
MYSQL_VERSION=8.0.14-1debian9
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env


文字コードの確認

# mysql -u root -p

mysql> show variables like '%char%';
+--------------------------+--------------------------------+
| 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-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.00 sec)

mysql> show variables like '%coll%';
+-------------------------------+--------------------+
| Variable_name | Value |
+-------------------------------+--------------------+
| collation_connection | utf8mb4_bin |
| collation_database | utf8mb4_bin |
| collation_server | utf8mb4_bin |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
+-------------------------------+--------------------+
4 rows in set (0.00 sec)

mysql> exit
Bye
# exit



疎通確認

-p 3306:3306 の通りにコンテナへアクセスできるか確認します。

ここまで出来てれば、MySQLの準備完了です。

$ nc 127.0.0.1 -z 3306

Connection to 127.0.0.1 port 3306 [tcp/mysql] succeeded!


MySQL接続する方法

-h 127.0.0.1 を付ける必要があるので注意

$ mysql -u root -p -h 127.0.0.1

$ mysql -u test -p -h 127.0.0.1


MySQLコンテナの停止

$ docker stop test_mysql

起動するときは、startコマンドで起動します

$ docker start test_mysql


参考