2020/02/05DockerでのMySQLの設定Dockerを利用することで異なるバージョンのMySQL開発環境を構築することができます。作成したDocker上のMySQLはDocker上の他のコンテナから利用できるだけではなくDocker上にないローカル環境のアプリケーション(本文書ではLaravel)からも利用することができます。ローカルに直接MySQLをインストールしたくない場合やバージョンをすぐに切り替えたい場合、バージョン毎に動作検証を行いたい場合に利用することができます。本文書の動作確認はMacを利用して行っています。Laravelからの接続DockerのインストールDockerを利用するためにはDockerのインストールを行う必要があります。DockerのインストールはHomebrewを利用して行います。Macをダウンロードしてインストールすることができますが、その際はDockerのアカウントが必要になるためアカウントを作成が必須となります。Homebrewではアカウントの作成を行う必要はありません。dockerインストールする時はcaskのdockerをインストールしてください。brewコマンド実行後アプリケーションフォルダにDockerのアイコンが作成されているのでダブルクリックを行ってください。Macのインストールが開始し、ユーザのパスワードの確認画面が表示されるのでパスワードを入力してください。-vコマンドを実行しバージョン情報が表示されるか確認してください。633a0eaMySQLのコンテナの作成Dockerのインストールが完了したので早速MySQLのコンテナの作成を行います。Dockerでコンテナを作成するためにはコンテナの元になるimageが必要になりますが、下記のコマンドを実行するとimageをダウンロードした後にコンテナの作成まで行ってくれます。mysql:tag-nameの後には任意のコンテナ名をつけることができコンテナの起動・停止・削除に利用することができます。MYSQL_ROOT_PASSWORDにはMySQLのrootのパスワードを設定します。-pはポートの設定を行います。mysql:tagのタグにはMySQLのバージョンを指定します。latestを設定すると最新版、5.7を指定するバージョン5.7をインストールすることができます。-dをつけるとバックグランドで起動し、つけない場合はフォアグランドで起動し起動メッセージがコンソールに表示されます。-eで設定しているのは環境変数でMYSQL_ROOT_PASSWORD以外にもMYSQL_DATABASE、MYSQL_USER、MYSQL_PASSWORDがあります。実際に5.7のバージョンを設定してコンテナを作成します。コンテナ名はmysql5.7、ルートのパスワードはpassword、バージョンは5.7、ポートは3306を設定しています。locally)のでダウンロード(Pull)を行います。そのため初回の起動には時間がかかります。バージョン5.7のMySQLを再度別のコンテナ名で作成したり、再作成する場合はイメージのダウンロードは行われないため起動時間も短くなります。作成したコンテナを確認します。-aでは設定したポートやコンテナの名前、起動状態を確認することができます。psコマンドを頻繁に使います。snapshotの略です。MySQLコンテナへの接続Docker上のMySQLコンテナへの接続は以下のコマンドで行うことができます。ログイン後は、mysqlコマンドを使ってMySQLに接続することも可能です。コンテナのベースはLinuxなのでlsやcd等のコマンドを実行することができますがviなどのファイルを編集するコマンドはインストールされていません。foundMySQLへの接続Docker上のコンテナにあるMySQLにはコマンドを利用して直接接続することもできます。パスワードを聞かれるので作成時に指定したMYSQL_ROOT_PASSWORDの設定値を指定します。・ログインのメッセージからMySQLのバージョンは5.7.29であることが確認できます。データベースの作成MySQLへのログインができればデータベースの作成も行うことができます。作成したtestデータベースにusersテーブルを作成してデータが挿入できることを確認します。sec)日本語対応ここまでの設定で、データベース、テーブルの作成、行の挿入(アルファベットの文字列)を行うことができますが、日本語を入力しようとするとエラーが発生し挿入することができません。reverted).が表示され挿入できません。理由はMySQLの文字コードのデフォルトがlatin1に設定されているためです。文字コードはMySQLに接続して下記のコマンドで確認することができます。utf8mb4を追加するとテーブルへの日本語挿入を行うことができます。Proなどのソフトウェアを利用するとデーターベース作成時に文字コードの選択画面が表示されます。日本語の設定(コマンド編)データベースのテーブルに日本語を挿入するためにはコンテナを作成時のコマンドに文字コードに関連するオプションを追加することで実現できます。作成したコンテナを再作成するために一度作成したMySQLのコンテナを削除します。rmで削除することができます。mysql5.7mysql5.7文字コードを作成して再作成します。–collation-server=utf8mb4_unicode_ciを追加します。-aコマンドで作成したコンテナが起動していることを確認してください。mysql5.7起動していない場合はコマンドやオプションの入力ミスの可能性があります。mysql5.7を実行して原因を確認してください。コンテナに接続し、再度文字コードを確認します。character_set_databaseやcharacter_set_serverの文字コードはlatin1から設定したutf8mb4に変更されていることが確認できます。character_set_clientとcharacter_set_connectionはlatin1のままです。runを実行時に–character_set_client等があるか確認したのですが、そのようなパラメータはないとエラーになりコンテナを起動することができませんでした。–helpコマンドで確認することができます。runコマンド時に指定することで実現することができます。任意の場所にフォルダを作成し、そのフォルダの中にmysql5.7.cnfという名前のファイルを作成し以下の設定を記述します。本環境ではユーザのホームディレクトリの下にmysql_confフォルダを作成していします。ファイル名も拡張子にcnfが付けば名前は任意です。その他のMySQLに関する設定もこのファイルで行うことができます。runコマンドを実行する際はファイルではなく保存したフォルダを指定して以下のように実行します。mysql:5.7-vオプションを使うとローカルフォルトとコンテナ上のフォルダのリンクを貼ることができます。ローカルのパス:コンテナ上のパスMySQLコンテナに接続して文字コードを確認します。文字コードが指定した通りに設定されていることが確認できます。sec)データの保存先MySQLのデータはコンテナ上の/var/lib/mysqlに保存されます。そのためコンテナの再作成を行うと再作成前に追加したデータはすべて削除されてしまいます。データを保持したい場合は、コンテナの外にフォルダを作成しコンテナ上の/var/lib/mysqlとリンクを貼ることで実現することができます。データが保持できないとはデータが保持できることを確認する前に保持でないとはどういうことか確認しておきます。mysql:5.7mysqlに接続します。-pデータベースを作成し、テーブルにデータを挿入します。sec)コンテナを停止して削除します。mysql5.7mysql5.7再度コンテナの作成を行ってMySQLに接続しても作成したtestデータベースはありません。データが保持できていないためコンテナを削除するとMySQLに保存されたデータは消えてしまいます。'test'データを保持する方法コンテナを再作成してもデータが保持できるようにローカルのOS上にデータ保存用のフォルダを作成します。フォルダ名もフォルダの作成場所も任意の場所を指定してください。ここでは/Users/reffect/dbとしています。dbコンテナの作成を行います。mysql:5.7-vオプションでMysqlの設定ファイルの場所を指定していましたがもう一つ-vオプションを追加したローカルのフォルダのパスとコンテナ上のフォルダのパスを指定して実行します。作成後dbフォルダに移動するとコンテナの/var/lib/mysqlフォルダの中身を確認することができます。lsauto.cnfclient-cert.pemib_logfile1mysqlpublic_key.pemca-key.pemclient-key.pemibdata1performance_schemaserver-cert.pemca.pemib_logfile0ibtmp1private_key.pemserver-key.pemコンテナ作成後、先ほどと同様にデータベースを作成しデータを挿入した後にコンテナの再作成を行ってください。挿入したが保持されていることが確認できるはずです。別のバージョンである5.6のコンテナを作成します。allocated.バージョン5.6のイメージがローカルにないのでダウンロードを行っています。現在稼働している5.7のポートと重複しているため起動することができません。一度5.7を停止して5.6を起動すること正常に起動させることができます。同時に起動させる時はポートが重複しないように作成する必要があります。mysql5.6mysql5.6docker-composeからの作成dockerコマンドを使ってMySQLコンテナが作成できることを確認してきましたが、-vオプションや様々なパラメータを追加したためコマンドがなりました。docker-compose.ymlファイルに各種情報を入力し保存しておくことで同じコンテナ環境を構築することができます。dockerコマンドで実行した内容と同じ環境を作成するため、/Users/reffectフォルダの下にdocker-compose.ymlファイルを作成し、下記を記述します。password作成後、docker-compose.ymlファイルが保存されているフォルダでdocker-composeコマンドを実行するとMySQLコンテナを作成することができます。-aコマンドで状態を確認することができます。33060/tcpデータベースへの接続等はdockerコマンドと同様の方法で行うことができます。Laravelからの接続Laravelである必要ではありませんが、コンテナ上にないアプリケーションからDocker上のMySQLにアクセスすることができるのかどうか確認を行っておきましょう。laravelからDocker上に作成したMySQLコンテナのMySQLに接続しテーブルが作成できるか確認してみましょう。Laravelはローカル環境にそのままインストールしValet等は利用していません。Laravelのインストールにはcomposerが必要なので事前にインストールを完了させておいてください。任意のフォルダで以下のコマンドを実行してください。laravel6作成後にMySQLコンテナに接続してデータベースを作成しておきます。データベース名はlaravelとしています。sec)Laravel6のインストールフォルダにある.envファイルでデータベースの接続情報を更新します。runを実行した際のポート番号やrootのパスワード、作成したデータベース名を指定してください。migrateコマンドで行います。seconds)上記のようにテーブルが作成できたらLaravelからDocker上のMySQLに接続できていることがわかります。Laravelからの。