Dockerを使ったMySQL環境構築ガイド: 簡単かつ効率的なセットアップ方法
MySQLの環境構築を迅速かつ効率的にDockerComposeを使用して構築する方法を詳しくまとめる。各ファイルの設定ポイントや注意点もピックアップし解説を付ける。Dockerの利便性を活用して、手間をかけずにMySQL環境を整備を行うことを目指す。モクジディレクトリ構造docker-compose.ymlの作成各種設定ファイルの作成Dockerfilemy.cnf.envテーブル作成と初期データコンテナの起動と操作コンテナと接続MySQLの操作関連記事ディレクトリ構造下記のようにディレクトリ構造を作り、MySQL環境を構築する。/PROGECT/docker/mysql/initdb01_creat-tabl02_inset-seeddockerfilemy.cnfdocker-compose.yml.envdocker-compose.ymlの作成docker-compose.ymlの内容「データベース」と「データベース管理ツール」の2つのコンテナをビルドするため、docker-compose.ymlファイルを以下の様に書き込む。docker-compose.ymlversion:'3.8'services: mysql-db: container_name:mysql-container build:.docker/mysql env_file: -.env ports: -3306:3306 volumes: -mysql-data:/var/lib/mysql -./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf -./docker/mysql/initdb:/docker-entrypoint-initdb.d restart:always phpmyadmin: container_name:phpmyadmin-container image:phpmyadmin/phpmyadmin environment: -PMA_HOSTS=mysql-db ports: -8080:80 restart:alwaysvolumes: mysql-data:各項目の設定ポイントmysql-db:サービスの各設定項目サービスコンテナ名を「mysql-db」という名前任意で定義し各項目の設定を行う。container_name:コンテナに任意の名前を設定。build:./docker/mysqlDockerfileを読み取り、ビルドすることを設定。Dockerfileにmysqlイメージを指定することで、データベースのコンテナをビルドする。env_file:.env環境変数の読み込み対象ファイルを指定。ports:-3306:3306ホストとコンテナ間のポートマッピングを定義。左側がホスト、右側がコンテナのポート。ホストマシンのポートへのアクセスをコンテナ内のポートに転送させる。MySQLデータベースサーバーは通常ポート3306でリスンする。volumes:services内ホストPC内にデータ保存領域の作成を定義。「-」を使用しリスト形式で設定。-mysql-volumes:/var/lib/mysql「名前付きボリューム」「mysql-volumes」に対し、MySQLデータベースのデータを保存するためのデフォルトディレクトリ「mysql」をマウントさせ永続化する。-./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnfMySQL設定ファイル「my.cnf」をマウントさせ読み込ませる。-./docker/mysql/initdb:/docker-entrypoint-initdb.d「docker-entrypoint-initdb.d」に対して、「initdb」内の「.sql」ファイルを読み込ませることで、事前にテーブルを作成させる。phpmyadmin:サービスの各設定項目サービスコンテナ名を「phpmyadmin」という名前任意で定義し各項目の設定を行う。image:phpmyadmin/phpmyadminデータベース管理ツール「phpmyadmin」のイメージを指定し、コンテナをビルドする。environment:環境変数の設定を行う。PMA_HOSTS=mysql-dbMySQLの接続先のホストを設定。ホストとして、「mysql-db」サービスを指定。8080:80ブラウザにhttp://localhost:8080/と入力することで、アクセスできる。volumes:ボリュームの定義「services:」定義と同列に「volumes:」定義を書き込むことで「名前付きvolumes」を作成することができる。mysql-data:任意の名前を設定。「名前付きvolumes」では、Docker内の特定のディレクトリにデータを保存されるため、ホスト上のファイル構造を汚染することなく、データの永続化ができる。各種設定ファイルの作成DockerfileDockerComposeでコンテナをビルドする場合、Dockerfileは必須ではないが、既存のイメージに対して追加の設定やカスタマイズを行う際は、Dockerfileを作成し、それをdocker-compose.ymlから参照させる。Dockerfileの内容DockerfileFROMmysqlEXPOSE3306ADD./my.cnf/etc/mysql/conf.d/my.cnfCMD["mysqld"]FROMビルドするためのイメージを指定。EXPOSEコンテナがどのポートをリスンするかを指定。ADDMySQL設定ファイルをイメージ内にコピーさせる。CMDコンテナが起動された際に実行されるデフォルトのコマンドを指定。["mysqld"]MySQLのデーモンプロセスであるmysqldを実行し、コンテナをMySQLサーバーとして起動させる。my.cnfmy.cnfは、MySQLの設定ファイル。以下の内容を書き込むことで、MySQLでの日本語の文字化けを防ぐ。my.cnfの内容my.cnf[mysql]default-character-set=utf8mb4[mysqld]character-set-server=utf8mb4collation-server=utf8mb4_bin[client]default-character-set=utf8mb4.envプロジェクトのルートディレクトリに.envファイルを作成し、MySQLコンテナで使用する環境変数を書き込む。環境変数はdocker-compose.ymlやDockerfileに書き込むことも可能だが、パスワードが含まれるため、セキュアに管理する目的で作成を行う。.envの内容.envは、環境変数を定義するためのファイル。.env#MySQLMYSQL_ROOT_PASSWORD=ROOT-P@SSWORDMYSQL_DATABASE=DB-NAMEMYSQL_USER=USER-NAMEMYSQL_PASSWORD=USER-P@SSWORDMYSQL_ROOT_PASSWORD必須設定。rootユーザーのパスワードを設定。MYSQL_DATABASE指定した名前任意でデータベースが作成される。MYSQL_USER指定した名前任意のユーザーが作成される。MYSQL_PASSWORD追加したユーザーのパスワードを設定。PhpMyAdmin用の環境変数.envへの追加書き込み.envファイルに以下の内容を追加で書き込むことで、MySQLへのログイン時の認証を自動化し、パスワード入力を省略できる。.env#MySQL:#phpmyadminPMA_USER=rootPMA_PASSWORD=ROOT-P@SSWORDこの設定はphpMyadmin用のユーザーとパスワードの設定ではなく、認証情報をphpMyadminの設定ファイル「/etc/phpmyadmin/config.inc.php」へ渡すための書き込み。docker-compose.ymlへの追加書き込み.envファイルの読み込みを設定。docker-compose.ymlversion:'3.8' mysql-db:: phpmyadmin:: env_file: -.envmysql-dbサービス同様に「env_file:」項目を書き込み、.envファイルの読み込みを設定。テーブル作成と初期データこれまでの設定でデータベースは構築される。これからの設定で、そのデータベースに対し、テーブル作成と初期データの入れ込みを行う。/docker-entrypoint-initdb.dとはdocker-entrypoint-initdb.dディレクトリに対し、.sh、.sql、.sql.gzのファイルをマウントすることで、MySQLのコンテナ起動時にそのファイルが自動で実行される。該当するファイルが複数ある場合、アルファベット順で実行される。実行に順序の指定が必要な場合には、ファイル名に番号を付けておく。01_creat-tabl.sqlテーブルの作成を行う用のsqlファイル。01_creat-tabl.sqlCREATETABLEIFNOTEXISTS`TABLE-NAME`(`id`INT(11)AUTO_INCREMENT,`name`VARCHAR(20)NOTNULL,`email`VARCHAR(50)UNIQUENOTNULL,`created_time`DATETIMENOTNULLDEFAULTCURRENT_TIMESTAMP,`updated_time`DATETIMENOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,PRIMARYKEY(`id`));02_inset-seed.sql初期データ登録用のsqlファイル。02_inset-seed.sqlINSERTINTO`TABLE-NAME`(`id`,`name`,`email`)VALUES(1,'USER-01','01@gg.com');INSERTINTO`TABLE-NAME`(`id`,`name`,`email`)VALUES(2,'USER-02','02@gg.com');INSERTINTO`TABLE-NAME`(`id`,`name`,`email`)VALUES(3,'USER-03','03@gg.com');コンテナの起動と操作コンテナと接続コンテナの起動、接続手順CommandProcedue01イメージのビルド$Docker-Composebuild02コンテナの作成$Docker-Composeup-d-dバックグラウンドモードの指定。ターミナルを別の作業に使用できる。03作成したコンテナを確認$dockerps04起動したコンテナに接続$dockerexec-itmysql-containerbash-it対話的に操作するためのオプション。mysql-container接続するコンテナの名前を指定。bashコンテナ内部でコマンドを実行できる。05MySQLサーバーに接続$mysql-uroot-prootユーザーを指定。「.env」で設定したユーザーでも可。以上のコマンドを実行すると、パスワードの入力を求められる。「.env」で設定したパスワードを入力することで接続完了。MySQLの操作データベースの操作、切断手順CommandProcedue01データベースの確認mysql>showdatabases;02テーブルの確認mysql>showtablesfrom`DB-NAME`;DB-NAMEデータベース名を指定。03カラムの確認mysql>showcolumnsfrom`TABLE-NAME`from`DB-NAME`;TABLE-NAMEテーブル名を指定。04データの取得mysql>use`DB-NAME`USE使用するデータベースを選択。mysql>select*from`TABLE-NAME`;SELECT*すべてのカラムとすべての行を表示。05データの追加mysql>insertinto`TABLE-NAME`(`name`,`email`)values('USER-05','05@gg.com');06切断操作mysql>exit;MySQLサーバーを切断「\q」、「quit」でも可。$exitコンテナを切断$docker-composestopコンテナの停止関連記事Specialthanks【Docker】DockerでMySQLを起動【Docker】Docker環境内でmysqlの操作方法docker-composeでMySQL環境簡単構築