【MySQL + Docker】開発環境の構築と初期データの流し込み
今回は、MySQL + Dockerで開発環境を構築してみよう!の回になります。その際にデータベースとテーブルを作成して初期データを流し込み、構築後にdocker desktopのターミナルからSQL文を実行して初期データが作成されているかを確認するところまでやってみます。それではいってみましょう!
目次
前提条件
- M1 Mac Monterey
- VSCode
- Node.js v20.9.0
- docker desktop v4.28.0
ディレクトリ構成
今回作成するディレクトリ構成はこちらになります。
mysql-practice
├── init
│ ├── init.sh # Docker起動時に実行するシェルスクリプト
│ ├── Dockerfile # Docker起動時に実行するコマンドラインを命令
│ └── sql
│ ├── shop-data.sql # テーブル作成用
│ └── shop-database.sql # データ注入用
├── my.cnf # MySQLの設定ファイル
└── compose.yml # Docker設定
開発環境を構築するための事前準備
上記ディレクトリ構成に記載してあるディレクトリやファイルをVSCodeで作成していきます。各ファイルごとにサンプルコードを記載してますのでコピペやカスタマイズなどしてお使いください。
ルートディレクトリを作成する
まずは今回のプロジェクト用のルートディレクトリを作成します。Macのターミナルアプリからディレクトリを作成してVSCodeを開く流れでやってみます。方法はご自身のやりやすい方法でやってください。
ターミナルアプリを開き、今回作成するディレクトリを配置したい場所に移動します。今回はprojectディレクトリ内に配置したいのでそこへ移動します。
cd project
移動したらルートディレクトリとなるmysql-practiceを作成します。
mkdir mysql-practice
作成したらmysql-practiceディレクトリに移動します。
cd mysql-practice
移動したら以下コマンドでVSCodeを開きます。
code .
compose.ymlを作成する
compose.ymlはDocker設定用のファイルです。ルートディレクトリ直下にcompose.ymlファイルを作り、以下の記述を追加してください。データベース名をshopにしたいので、MYSQL_DATABASEの箇所で指定しています。platformの箇所は、M1 Macの場合、linux/x86_64じゃないと動かない可能性があります。
services:
mysql:
ports:
- "3306:3306"
platform: linux/x86_64
image: mysql:8.1
container_name: db-mysql
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=shop
- TZ=Asia/Tokyo
build:
context: ./init
dockerfile: Dockerfile
volumes:
- ./my.cnf:/etc/mysql/conf.d/my.cnf
- ./init:/docker-entrypoint-initdb.d
my.cnfを作成する
my.cnfはMySQLの設定ファイルです。MySQLサーバーの動作や挙動を制御するための設定オプションを記述します。
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4
shop-database.sqlを作成する
shop-database.sqlはデータの型定義や条件を指定します。ファイル名は任意で命名してください。shopデータベースに関しては、既に存在していたら削除、存在しなければ新規作成、それを使用するデータベースとして指定します。productテーブルに関しては、既に存在していたら削除、存在しなければ新規作成、カラム名の設定と条件などを指定しています。
DROP DATABASE IF EXISTS shop;
CREATE DATABASE shop;
USE shop;
DROP TABLE IF EXISTS product;
CREATE TABLE product (
product_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name TEXT NOT NULL,
price DECIMAL(10, 0) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
shop-data.sqlを作成する
shop-data.sqlはデータの値などを指定します。ファイル名は任意で命名してください。COMMIT; は、トランザクション内で行われたすべてのデータベース操作を確定し、データベースに反映するSQLステートメントです。トランザクションとは複数のデータベース操作をまとめて一連の処理として扱う際に使用される仕組みのことです。
SET NAMES utf8mb4;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
SET @old_autocommit=@@autocommit;
USE shop;
SET AUTOCOMMIT=0;
INSERT INTO product (product_id, name, price) VALUES
(1, 'Tシャツ', 5800),
(2, 'パーカー', 12800),
(3, 'キャップ', 4800);
COMMIT;
init.shを作成する
init.shは初期化に必要な設定や処理を行うシェルスクリプトです。今回はDocker起動時に先ほど作成したshop-data.sql、shop-database.sqlが実行され、テーブルが作成され、そこに初期データが流し込まれます。
rootの箇所はMySQLサーバーに接続する際のユーザー名を指定して、-pの後にくっついてるrootはcompose.ymlのMYSQL_ROOT_PASSWORDで指定したパスワードを指定します。
#!/bin/bash
# テーブルを作成する
mysql -u root -proot shop < "/docker-entrypoint-initdb.d/sql/shop-database.sql"
# データを流し込む
mysql -u root -proot shop < "/docker-entrypoint-initdb.d/sql/shop-data.sql"
Dockerfileを作成する
Dockerfileはイメージを構築するために必要な手順や命令を記述します。ルートディレクトリ直下にinitディレクトリを作成して、その中にDockerfileを作成して以下の記述を追加します。
FROM --platform=linux/x86_64 mysql:8.1
EXPOSE 3306
開発環境を起動する
これで事前準備が完了したので、VSCodeのターミナルで以下のコマンドでDocker環境が起動します。
docker compose up -d
docker desktopのターミナルからログインする
docker desktopの左側メニューのContainerが選択されている状態で、右側のAcitonの列にある三点リーダー(Show container acitons)からOpen in terminalを選択するとターミナルが開きます。そこに以下のコマンドを入力してログインしてください。
mysql -u root -p
compose.ymlファイルの「MYSQL_ROOT_PASSWORD」で設定したパスワードを入力してください。入力したパスワードは表示されませんので、間違いないように入力したらEnterを押してください。
Enter password: password
以下が表示されればログイン成功です。
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.1.0 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
以下のエラーが出てログインできない場合があります。
mysql: [Warning] World-writable config file '/etc/mysql/conf.d/my.cnf' is ignored.
その場合は、以下のコマンドでmy.cnfのパーミッションを644(-rw-r--r--)に変更すればログインできるかと思います。デフォルトのパーミッションは664(-rw-rw-r--)です。
sudo chmod 644 my.cnf
もしくは、Dockerfileに以下を追加してコンテナ作成時にパーミッション変更する方法もあります。
ADD ./my.cnf /etc/mysql/conf.d/my.cnf
RUN chmod 644 /etc/mysql/conf.d/my.cnf
構築した開発環境を確認する
構築した開発環境に、初期データとして準備したデータベースやテーブルが作成されているかを確認していきましょう。
データベース一覧を表示する
Docker起動後、データベース一覧を表示してみましょう。
SHOW DATABASES;
以下のように表示されていればデータベースが作成されているということです。shopは先ほど準備したデータベースで、それ以外はDocker起動後にデフォルトで作成されるMySQLサーバーの動作や管理に関連する情報が格納されたデータベースです。
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| shop |
| sys |
+--------------------+
5 rows in set (0.02 sec)
mysql>
上記データベースにどんな情報が格納されているかざっくり解説します。
- information_schema : MySQLデータベースのメタデータ
- mysql : MySQLサーバーに関するユーザーアカウントや特権情報
- performance_schema : MySQLサーバーのパフォーマンスに関する情報
- shop : 今回準備した初期データを入れる用のデータベース
- sys : MySQLの内部管理、セッション、ステートメントなどの情報
テーブル一覧を表示する
上記のデータベースからどのデータベースを使用したいかを指定します。今回はshopを指定します。
USE shop;
shopデータベースに入ってるテーブル一覧を表示します。
SHOW TABLES;
以下が表示されれば、テーブルが作成できていることになります。Empty setと表示される場合は、準備したファイルの記述や入力したSQL文が間違っている可能性があるので再度確認してみてください。
mysql> SHOW TABLES;
+----------------+
| Tables_in_shop |
+----------------+
| product |
+----------------+
1 row in set (0.01 sec)
テーブル内の情報を表示する
productテーブル内に初期データが入っているかを確認します。
SELECT * FROM product;
以下のように表示されれば正常に初期データが流し込まれているということが確認できます。
mysql> SELECT * FROM product;
+------------+--------------+-------+
| product_id | name | price |
+------------+--------------+-------+
| 1 | Tシャツ | 5800 |
| 2 | パーカー | 12800 |
| 3 | キャップ | 4800 |
+------------+--------------+-------+
3 rows in set (0.02 sec)
ここまできたらあとはデータ操作でお遊びの時間になります。データ操作に関する基本的なSQL文の使い方はこちらの記事で解説してますので、是非遊んでみてください。
【MySQL初心者入門】基本的なデータベース操作(SELECT、INSERT、UPDATE、DELETE) | MOH LABO
https://www.mohlabo.com/coding/227/
おまけ:そもそもMySQLとSQLってなに?
これってフロントエンド寄りの初学者だと「データベースの何かだろう」と漠然と記憶していたり、一回調べたけど忘れてしまいがちな内容かと思うので、MySQLとSQLの違いについて明確に理解しておきましょう。
MySQLとSQLの違い
- MySQL ••• リレーショナルデータベースでデータを管理するシステム(RDBMS)
- SQL ••• MySQLというシステムを操作するためのデータベース言語
なので、MySQLのデータ操作をするためにSQLを使う、ということになります。
リレーショナルデータベースとは
行と列で構成されたテーブルを利用してデータを管理しているデータベースのことです。XServerやさくらサーバーでも使われています。
リレーショナルデータベースの種類
MySQLの他に、MariaDB、PostgreSQL、Oracle Database、Microsoft SQL Serverなどがあります。
まとめ
ご覧いただきありがとうございます。私自身、フロントエンド寄りでデータベースに関しては初学者なので、良き学びになりました。データ操作もやってみると楽しいもんです。一緒に成長していきましょう。
参考記事