はじめに
Dockerを利用することで、アプリケーション環境の構築と管理が簡単に行えます。
本記事では、Dockerfile を使用して MySQL コンテナをカスタマイズし、初期データを投入する方法を解説します。
未来の自分への備忘録としても活用できるよう、基礎的な部分を体系的にまとめています。そのため、Docker初心者の方にも役立つ内容となっています!
前提条件
以下の環境が整っていることを前提に、実際にハンズオンを進めていきます。
- Dockerがインストールされ、起動していること
- 基本的なコマンドライン操作の知識
- 任意のテキストエディタ(例: VS Code, Vim, etc.)
また、Dockerの基礎知識については、以下の記事で解説していますので、参考にしてください。
ディレクトリ構成
本記事で作成するプロジェクトのディレクトリ構成は以下の通りです。
mysql-docker/
├── init.sql # 初期化用のSQLスクリプトファイル
└── Dockerfile # Dockerの設定ファイル
シンプルでわかりやすいディレクトリ構成にしています。
実際にやってみた
プロジェクトの準備
ターミナルで以下のコマンドを実行し、プロジェクト用のディレクトリを作成します。
mkdir mysql-docker
cd mysql-docker
必要なファイルを作成
次に、以下の2つのファイルをプロジェクトディレクトリに作成します。
-
init.sql
: 初期化用のSQLスクリプトファイル -
Dockerfile
: Dockerの設定ファイル
Dockerfile の作成
以下の内容で Dockerfile
を作成します。
# ベースイメージとして MySQL を使用
FROM mysql:latest
# MySQL の初期設定を環境変数で指定
ENV MYSQL_ROOT_PASSWORD=my-secret-pw
ENV MYSQL_DATABASE=my_database
ENV MYSQL_USER=my_user
ENV MYSQL_PASSWORD=my_password
# カスタムの初期化スクリプトをコピー(必要に応じて)
COPY ./init.sql /docker-entrypoint-initdb.d/
# デフォルトのポートを公開
EXPOSE 3306
初期化用 SQL ファイルの作成
初期化用の SQL スクリプトを作成します。このファイルは、コンテナ起動時に自動的に実行されます。
以下は init.sql
の例です。
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL
);
INSERT INTO users (name, email) VALUES ('honda', 'honda@example.com');
Dockerイメージのビルド
Dockerfile
を基に Docker
イメージをビルドします。
docker build -t custom-mysql .
-t custom-mysql
: イメージ名を custom-mysql
に指定します。.
: 現在のディレクトリを指定しています。
上記のコマンドを実行すると、Dockerfile
の内容に基づいてコンテナイメージが作成されます。
コンテナ実行
ビルドしたイメージを使って、コンテナを作成・起動します。
docker run --name custom-mysql-container \
-p 3306:3306 \
-d custom-mysql
--name custom-mysql-container
: コンテナ名を custom-mysql-container
に指定します。
-p 3306:3306:
ポートのマッピングを行います。
アプリケーションの確認
コンテナ内の MySQL に接続し、初期化したデータやテーブルが正しく反映されているか確認します。
docker exec -it custom-mysql-container mysql -u root -p
パスワードとして my-secret-pw
を入力し、SQL クエリを実行します。
USE my_database;
SELECT * FROM users;
クエリの結果が以下のように表示されれば、成功です。
出力結果から、データが挿入され、SELECT
文で正しく取得できていることが確認できました。
+----+-------+-------------------+
| id | name | email |
+----+-------+-------------------+
| 1 | honda | honda@example.com |
+----+-------+-------------------+
まとめ
この記事では、Dockerfile
を使用して簡単にMySQL環境を構築する方法をご紹介しました。
今回はDockerの基礎的な内容を扱いましたが、基本をしっかり理解することでDockerやコンテナに関する知識がさらに深まります。
今後もDocker関連の知識を整理しながら発信していきますので、この記事が誰かの技術的な参考になれば嬉しいです。
おまけ:シェルスクリプトで一括作成してみた
手動でディレクトリとファイルを作成するのが少し面倒に感じたので、ディレクトリ構造と必要なファイルを一括で作成するシェルスクリプトを作成しました。
#!/bin/bash
# プロジェクトのベースディレクトリ名
PROJECT_DIR="mysql-docker"
# 初期化用のSQLスクリプトの内容
INIT_SQL_CONTENT="""CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL
);
INSERT INTO users (name, email) VALUES ('honda', 'honda@example.com');
"""
# Dockerfileの内容
DOCKERFILE_CONTENT="""# ベースイメージとして MySQL を使用
FROM mysql:latest
# MySQL の初期設定を環境変数で指定
ENV MYSQL_ROOT_PASSWORD=my-secret-pw
ENV MYSQL_DATABASE=my_database
ENV MYSQL_USER=my_user
ENV MYSQL_PASSWORD=my_password
# カスタムの初期化スクリプトをコピー(必要に応じて)
COPY ./init.sql /docker-entrypoint-initdb.d/
# デフォルトのポートを公開
EXPOSE 3306
"""
# ディレクトリの作成
if [ -d "$PROJECT_DIR" ]; then
echo "$PROJECT_DIR ディレクトリは既に存在します。" >&2
exit 1
fi
mkdir "$PROJECT_DIR"
echo "$PROJECT_DIR ディレクトリを作成しました。"
# init.sql の作成
echo "$INIT_SQL_CONTENT" > "$PROJECT_DIR/init.sql"
echo "init.sql を作成しました。"
# Dockerfile の作成
echo "$DOCKERFILE_CONTENT" > "$PROJECT_DIR/Dockerfile"
echo "Dockerfile を作成しました。"
# 処理完了
echo "プロジェクト構成が完了しました。"
echo "ディレクトリ構成:"
tree "$PROJECT_DIR"
このスクリプトを実行すれば、ディレクトリ構造と初期ファイルなどが自動で作成されます。
関連記事