2020年3月16日月曜日

MySQL&Dockers ...簡単なセットアップ

MySQL&Dockers ...は新しい概念ではなく、人々はしばらくの間Dockersに移行しています。 開発のためにこれに移行しようとしている人にとっては、いくつかのハードルがあります。

MySQLはローカルで正常に動作しますが、MySQLの異なるバージョン間でコードをテストする場合は、いくつかのバージョンを簡単に入手できると便利です。

長年の選択肢の1つは、もちろんGiuseppe Maxiaによるhttps://mysqlsandbox.net/です。 これは、複数のインスタンスを起動し、レプリケーションなどをテストできる非常に有効なソリューションです。

ドッカーは、MySQLのさまざまなバージョンでのテストに関して、よく使用される別のシナリオにもなりました。 以下は、いくつかのバージョンを簡単にインストールするためのいくつかのステップについて説明します。 私はOSXを使用しているため、これらの例はOSX用です。

起動するにはDockerが必要です。もちろんDocker Desktopは、簡単にアクセスできる便利なツールです。

Dockerをセットアップしたら、MySQLの環境を整えることができます。

ここでは、MySQLデータディレクトリ、構成ファイル、および必要に応じてmysql-filesディレクトリを含むDockerフォルダーを作成しました。

mkdir ~/Docker ;

mkdir ~/Docker/mysql_data;
mkdir ~/Docker/mysql-files;
mkdir ~/Docker/cnf;

今mysql_data内


cd ~/Docker/mysql_data;
mkdir 8.0;
mkdir 5.7;
mkdir 5.6;
mkdir 5.5;


次に、この例の簡単なcnfファイルを設定します。 主な注意事項は、バインドアドレスです。 これは、Dockerの外部でMySQLにアクセスできるようにするために設定されています。 また、これらのファイルを使用して、MySQL Dockerインスタンスごとに適切な追加の構成情報を設定できることにも気付くことができます。



cd ~/Docker/cnf;

cat my.8.0.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= /var/lib/mysql-files
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
bind-address = 0.0.0.0
port=3306
server-id=80


# Custom config should go here
!includedir /etc/mysql/conf.d/

cat my.5.7.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=57
max_allowed_packet=32M

$ cat my.5.6.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=56

$ cat my.5.5.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=55


設定ファイルがセットアップされたので、ドッカーを構築する必要があります。 ビルドコマンドに関して注意すべきいくつかの点。

--nameドッカーの名前付き参照を設定します。

ここでは、構成ファイル、データディレクトリ、およびmysql-filesディレクトリをdockerにマッピングしています。 これにより、my.cnfファイルなどを簡単に調整できます。
-v〜/ Docker / cnf / my.8.0.cnf:/etc/mysql/my.cnf
-v〜/ Docker / mysql_data / 8.0:/ var / lib / mysql
-v〜/ Docker / mysql-files:/ var / lib / mysql-files

Dockerの外部でこれらのMySQLインスタンスに到達できるようにしたいので、それに応じてポートを公開およびマップする必要があります。
-p 3306:3306これは、ドッカー内の3306に対して3306ローカル
-p 3307:3306これは、ドッカー内の3306に対してローカルな3307を意味します。
-p 3308:3306これは、ドッカー内の3306にローカルな3308を意味します。
-p 3309:3306これは、3309がdocker内部の3306に対してローカルであることを意味します。

次に、いくつかの環境変数も渡します。
-e MYSQL_ROOT_HOST =%-e MYSQL_ROOT_PASSWORD = <ここにパスワードを設定>

まとめて...


docker run --restart always --name mysql8.0 -v ~/Docker/cnf/my.8.0.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/8.0:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3306:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:8.0

docker run --restart always --name mysql5.7 -v ~/Docker/cnf/my.5.7.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/5.7:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3307:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:5.7

docker run --restart always --name mysql5.6 -v ~/Docker/cnf/my.5.6.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/5.6:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3308:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:5.6

docker run --restart always --name mysql5.5 -v ~/Docker/cnf/my.5.5.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/5.5:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3309:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:5.5

上記のコマンドを実行するたびに、IDが返されます。
例:3cb07d7c21476fbf298648986208f3429ec664167d8eef7fed17bf9ee3ce6316

Docker Desktopを使用して各Dockerターミナルを簡単に起動/再起動してアクセスするか、関連するIDをメモしてターミナルから実行できます。

Docker Desktopには、渡したすべての変数も表示されるため、検証できます。
もちろん、ここからCLIにアクセスして、簡単に停止および開始または破棄することもできます。


$ docker exec -it 3cb07d7c21476fbf298648986208f3429ec664167d8eef7fed17bf9ee3ce6316 /bin/sh; exit
# mysql -p

Dockerコンテナーが既に実行されている場合は、ローカルホスト端末経由でMySQLにアクセスできます。

$ mysql --host=localhost --protocol=tcp --port=3306 -p -u root

アクセスの問題がある場合は、MySQLアカウントが正しいこと、ポートとマッピングが正しいことを確認してください。
  • 「初期通信パケットの読み取り」でMySQLサーバーへの接続が失われました
  • エラー1045(28000):ユーザー 'root'@'192.168.0.5'のアクセスが拒否されました(パスワードを使用:YES)

これで、すべてが稼働しており、サーバーIDがcnfファイル初期化機能ごとに設定したものと一致していることがわかります。

$ mysql --host=localhost --protocol=tcp --port=3306 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| 58e9663afe8d | 8.0.19 | 80 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3307 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| b240917f051a | 5.7.29 | 57 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3308 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| b4653850cfe9 | 5.6.47 | 56 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3309 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| 22e169004583 | 5.5.62 | 55 |
+--------------+-----------+-------------+