MySQLの環境構築を迅速かつ効率的にDocker Composeを使用して構築する方法を詳しくまとめる。
各ファイルの設定ポイントや注意点もピックアップし解説を付ける。
Dockerの利便性を活用して、手間をかけずにMySQL環境を整備を行うことを目指す。
ディレクトリ構造
下記のようにディレクトリ構造を作り、MySQL環境を構築する。
- /PROGECT
- /docker
- /mysql
- /initdb
- dockerfile
- my.cnf
- /mysql
- docker-compose.yml
- .env
docker-compose.ymlの作成
docker-compose.ymlの内容
「データベース」と「データベース管理ツール」の2つのコンテナをビルドするため、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の内容
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の内容
[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は、環境変数を定義するためのファイル。
# 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ファイルに以下の内容を追加で書き込むことで、MySQLへのログイン時の認証を自動化し、パスワード入力を省略できる。
# MySQL
:
# phpmyadmin
PMA_USER = root
PMA_PASSWORD = ROOT-P@SSWORD
この設定はphpMyadmin用のユーザーとパスワードの設定ではなく、認証情報をphpMyadminの設定ファイル「/etc/phpmyadmin/config.inc.php」 へ渡すための書き込み。
.envファイルの読み込みを設定。
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ファイル。
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ファイル。
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');
コンテナの起動と操作
コンテナと接続
01 | イメージのビルド |
$ Docker-Compose build | |
02 | コンテナの作成 |
$ Docker-Compose up -d | |
|
|
03 | 作成したコンテナを確認 |
$ docker ps | |
04 | 起動したコンテナに接続 |
$docker exec -it mysql-container bash | |
|
|
05 | MySQLサーバーに接続 |
$mysql -u root -p | |
|
|
以上のコマンドを実行すると、パスワードの入力を求められる。「.env」で設定したパスワードを入力することで接続完了。 |
MySQLの操作
01 | データベースの確認 |
mysql> show databases; | |
02 | テーブルの確認 |
mysql> show tables from `DB-NAME`; | |
|
|
03 | カラムの確認 |
mysql> show columns from `TABLE-NAME` from `DB-NAME`; | |
|
|
04 | データの取得 |
mysql> use `DB-NAME` | |
|
|
mysql> select * from `TABLE-NAME`; | |
|
|
05 | データの追加 |
mysql> insert into `TABLE-NAME` (`name`, `email`) values (‘USER-05′,’05@gg.com’); | |
06 | 切断操作 |
mysql> exit; | |
|
|
$ exit | |
|
|
$ docker-compose stop | |
|