Backend

Dockerを使ったMySQL環境構築ガイド: 簡単かつ効率的なセットアップ方法

MySQLの環境構築を迅速かつ効率的にDocker Composeを使用して構築する方法を詳しくまとめる。
各ファイルの設定ポイントや注意点もピックアップし解説を付ける。
Dockerの利便性を活用して、手間をかけずにMySQL環境を整備を行うことを目指す。

ディレクトリ構造

下記のようにディレクトリ構造を作り、MySQL環境を構築する。

docker-compose.ymlの作成

docker-compose.ymlの内容

「データベース」と「データベース管理ツール」の2つのコンテナをビルドするため、docker-compose.ymlファイルを以下の様に書き込む。

docker-compose.yml
version: '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: always

volumes:
     mysql-data:

各項目の設定ポイント

mysql-db: サービスの各設定項目

サービスコンテナ名を「mysql-db」という名前任意で定義し各項目の設定を行う。

container_name:
コンテナに任意の名前を設定。
build: ./docker/mysql
Dockerfileを読み取り、ビルドすることを設定。
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.cnf
MySQL設定ファイル「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-db
MySQLの接続先のホストを設定。
ホストとして、「mysql-db」サービスを指定。
8080:80
ブラウザにhttp://localhost:8080/と入力することで、アクセスできる。

volumes: ボリュームの定義

「services:」定義と同列に「volumes:」定義を書き込むことで「名前付きvolumes」を作成することができる。

mysql-data:
任意の名前を設定。
「名前付きvolumes」では、Docker内の特定のディレクトリにデータを保存されるため、ホスト上のファイル構造を汚染することなく、データの永続化ができる。

各種設定ファイルの作成

Dockerfile

Docker Composeでコンテナをビルドする場合、Dockerfileは必須ではないが、 既存のイメージに対して追加の設定やカスタマイズを行う際は、 Dockerfileを作成し、それをdocker-compose.ymlから参照させる。

Dockerfileの内容

Dockerfile
FROM mysql

EXPOSE 3306

ADD ./my.cnf /etc/mysql/conf.d/my.cnf

CMD ["mysqld"]
FROM
ビルドするためのイメージを指定。
EXPOSE
コンテナがどのポートをリスンするかを指定。
ADD
MySQL設定ファイルをイメージ内にコピーさせる。
CMD
コンテナが起動された際に実行されるデフォルトのコマンドを指定。
[“mysqld”]
MySQLのデーモンプロセスであるmysqldを実行し、コンテナをMySQLサーバーとして起動させる。

my.cnf

my.cnf は、MySQL の設定ファイル。
以下の内容を書き込むことで、MySQLでの日本語の文字化けを防ぐ。

my.cnfの内容

my.cnf
[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin

[client]
default-character-set = utf8mb4

.env

プロジェクトのルートディレクトリに .env ファイルを作成し、MySQL コンテナで使用する環境変数を書き込む。
環境変数はdocker-compose.ymlやDockerfileに書き込むことも可能だが、パスワードが含まれるため、 セキュアに管理する目的で作成を行う。

.envの内容

.envは、環境変数を定義するためのファイル。

.env
# MySQL
MYSQL_ROOT_PASSWORD = ROOT-P@SSWORD
MYSQL_DATABASE = DB-NAME
MYSQL_USER = USER-NAME
MYSQL_PASSWORD = USER-P@SSWORD
MYSQL_ROOT_PASSWORD
必須設定。rootユーザーのパスワードを設定。
MYSQL_DATABASE
指定した名前任意でデータベースが作成される。
MYSQL_USER
指定した名前任意のユーザーが作成される。
MYSQL_PASSWORD
追加したユーザーのパスワードを設定。

PhpMyAdmin用の環境変数

.env への追加書き込み

.envファイルに以下の内容を追加で書き込むことで、MySQLへのログイン時の認証を自動化し、パスワード入力を省略できる。

.env
# MySQL
:
# phpmyadmin
PMA_USER = root
PMA_PASSWORD = ROOT-P@SSWORD

この設定はphpMyadmin用のユーザーとパスワードの設定ではなく、認証情報をphpMyadminの設定ファイル「/etc/phpmyadmin/config.inc.php」 へ渡すための書き込み。

docker-compose.yml への追加書き込み

.envファイルの読み込みを設定。

docker-compose.yml
version: '3.8'
 mysql-db:
: 
 phpmyadmin:
:
   env_file:
     - .env

mysql-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.sql
CREATE TABLE IF NOT EXISTS `TABLE-NAME` 
(
`id` INT(11) AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`email` VARCHAR(50) UNIQUE NOT NULL,
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);

02_inset-seed.sql

初期データ登録用のsqlファイル。

02_inset-seed.sql
INSERT INTO `TABLE-NAME` (`id`, `name`, `email`) VALUES (1, 'USER-01', '01@gg.com');
INSERT INTO `TABLE-NAME` (`id`, `name`, `email`) VALUES (2, 'USER-02', '02@gg.com');
INSERT INTO `TABLE-NAME` (`id`, `name`, `email`) VALUES (3, 'USER-03', '03@gg.com');    

コンテナの起動と操作

コンテナと接続

コンテナの起動、接続手順
Command Procedue
01 イメージのビルド
$ Docker-Compose build
02 コンテナの作成
$ Docker-Compose up -d
-d
バックグラウンドモードの指定。ターミナルを別の作業に使用できる。
03 作成したコンテナを確認
$ docker ps
04 起動したコンテナに接続
$docker exec -it mysql-container bash
-it
対話的に操作するためのオプション。
mysql-container
接続するコンテナの名前を指定。
bash
コンテナ内部でコマンドを実行できる。
05 MySQLサーバーに接続
$mysql -u root -p
root
ユーザーを指定。「.env」で設定したユーザーでも可。
以上のコマンドを実行すると、パスワードの入力を求められる。「.env」で設定したパスワードを入力することで接続完了。

MySQLの操作

データベースの操作、切断手順
Command Procedue
01 データベースの確認
mysql> show databases;
02 テーブルの確認
mysql> show tables from `DB-NAME`;
DB-NAME
データベース名を指定。
03 カラムの確認
mysql> show columns from `TABLE-NAME` from `DB-NAME`;
TABLE-NAME
テーブル名を指定。
04 データの取得
mysql> use `DB-NAME`
USE
使用するデータベースを選択。
mysql> select * from `TABLE-NAME`;
SELECT *
すべてのカラムとすべての行を表示。
05 データの追加
mysql> insert into `TABLE-NAME` (`name`, `email`) values (‘USER-05′,’05@gg.com’);
06 切断操作
mysql> exit;
MySQLサーバーを切断
「\q」、「quit」でも可。
$ exit
コンテナを切断
$ docker-compose stop
コンテナの停止

関連記事