Docker 環境で MySQL を使用する:Dockerfile
こんにちは、@studio_meowtoon です。今回は、WSL の Ubuntu 22.04 の Docker 環境で MySQL を使用する手順を紹介します。
目的
Windows 11 の Linux でクラウド開発します。
こちらから記事の一覧がご覧いただけます。
実現すること
ローカル環境の Ubuntu の Docker 環境で、MySQL コンテナを起動します。
MySQL をコンテナとして起動
実行環境
要素 | 概要 |
---|---|
terminal | ターミナル |
Ubuntu | OS |
Docker | コンテナ実行環境 |
データベース コンテナ
要素 | 概要 |
---|---|
mysql-todo | データベースコンテナ |
mysql | DB サーバー |
db_todo | データベース |
技術トピック
MySQL とは?
こちらを展開してご覧いただけます。
MySQL
MySQL は、オープンソースのリレーショナルデータベース管理システム (RDBMS) で、世界中で広く利用されているデータベースソフトウェアです。
特徴 |
---|
MySQL は、高いパフォーマンス、拡張性、信頼性、および簡単な使用と管理性が特徴であり、Web アプリケーションや企業アプリケーションなど、さまざまな用途で使用されています。 |
MySQL は、クライアント/サーバーシステムとして動作し、多くのプログラムやWebアプリケーションから利用できます。 |
また、MySQL はオープンソースであるため、コミュニティによって開発されており、多くの開発者やユーザーが貢献しています。 |
MySQL は現在、Oracle Corporation が所有しており、Oracle Corporation から商用ライセンスも提供されています。 |
開発環境
- Windows 11 Home 22H2 を使用しています。
WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。
WSL (Microsoft Store アプリ版) ※ こちらの関連記事からインストール方法をご確認いただけます
> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
Ubuntu ※ こちらの関連記事からインストール方法をご確認いただけます
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.1 LTS
Release: 22.04
Docker ※ こちらの関連記事からインストール方法をご確認いただけます
$ docker --version
Docker version 23.0.1, build a5ee5b1
この記事では基本的に Ubuntu のターミナルで操作を行います。Vim を使用してコピペする方法を初めて学ぶ人のために、以下の記事で手順を紹介しています。ぜひ挑戦してみてください。
Docker 環境で MySQL を使用する手順:共通手順
Docker ネットワークを作成します
$ docker network create net-todo
説明を開きます。
要素 | 説明 |
---|---|
docker network create | Docker 内でコンテナ間通信を可能にするためのネットワークを作成するコマンドです。 |
net-todo | net-todo という名前の Docker ネットワークが作成されます。 |
今後、このデータベースコンテナとの間でコンテナ間通信を行うために、ユーザ定義ネットワークを作成しています。
Docker 環境で MySQL を使用する手順:コマンド編
記事後半の Docker 環境で MySQL を使用する手順:Dockerfile 編 ではこちらの作業を自動化します。
コンテナを作成・起動します
$ docker run -d \
--publish 3306:3306 \
--name mysql-todo \
--net net-todo \
--volume db_todo_mysql:/var/lib/mysql \
--env MYSQL_ROOT_PASSWORD=password \
mysql:8.0-debian
説明を開きます。
要素 | 説明 |
---|---|
docker run | 新しいコンテナを作成して実行するコマンドです。 |
-d | -d オプションは、コンテナをバックグラウンドで実行します。 |
--publish 3306:3306 | --publish オプションは、ホストとコンテナ間のポートマッピングを行います。ホスト側のポート 3306 をコンテナのポート 3306 にマッピングしています。 |
--name mysql-todo | --name オプションは、コンテナに mysql-todo という名前を付けます。これにより、後でコンテナを識別しやすくなります。 |
--net net-todo | --net オプションは、コンテナで使用する Docker ネットワークを指定します。 |
--volume db_todo_mysql:/var/lib/mysql | --volume オプションは、Docker ボリュームを作成し、コンテナ内の /var/lib/mysql ディレクトリにマウントします。db_todo_mysql という名前のボリュームが作成されます。これにより、データベースのデータが永続化されます。 |
--env MYSQL_ROOT_PASSWORD=password | --env オプションは、コンテナ内で使用される環境変数を指定します。MYSQL_ROOT_PASSWORD 環境変数に password を設定することで、MySQL ルートユーザーのパスワードを設定します。 |
mysql:8.0-debian | MySQL 8.0 の Docker イメージを指定しています。このイメージを基にしてコンテナが作成され、MySQL データベースが実行されます。 |
このコンテナを停止する場合には、以下のコマンドを実行します。
$ docker stop mysql-todo
次にこのコンテナを起動する場合には、以下のコマンドを実行します。
$ docker start mysql-todo
コンテナ内の MySQL に接続します
コンテナに接続します。
※ コンテナから出るときは ctrl + D を押します。
$ docker exec -it mysql-todo /bin/sh
説明を開きます。
要素 | 説明 |
---|---|
docker exec | 実行中のコンテナ内でコマンドを実行するコマンドです。 |
-it mysql-todo | 対話的なシェルセッションを開始するためのフラグです。これにより、mysql-todo コンテナ内のシェルに対して入出力が可能になります。 |
/bin/sh | コンテナ内で実行するコマンドを指定します。ここではコンテナ内のデフォルトシェルである /bin/sh を起動しています。 |
MySQL のバージョンを確認します。
# mysql --version
mysql Ver 8.0.34 for Linux on x86_64 (MySQL Community Server - GPL)
MySQL に接続します。
※ MySQL から出るときは ctrl + D を押します。
# mysql -uroot -ppassword
mysql>
データベースの一覧表示をします。
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.03 sec)
一度 MySQL から出ます。
ここまでの手順で、ローカル環境の Docker で MySQL のコンテナを起動することができました。
データベースの作成
今後、ToDo リストアプリを作成する為に、以下の仕様のデータベース テーブルを作成します。
ToDo リストテーブル
コンテナに接続します。
※ コンテナから出るときは ctrl + D を押します。
$ docker exec -it mysql-todo /bin/sh
テキストエディタのインストール
コンテナ内の MySQL に SQL を適用する方法はいくつかあります。この記事では学習の目的で vim を使用した方法を紹介しています。
vim をインストールします。
# apt update
# apt install vim
# vim -version
VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Oct 01 2021 01:51:08)
vimrc ファイルを編集します。
# vim ~/.vimrc
以下の設定を追記します。
:set encoding=utf-8
debian コンテナに UTF-8 を設定します。
.bashrc ファイルを修正します。
# vim ~/.bashrc
以下を追記します。
export LANG=ja_JP.UTF-8
変更を反映します。
# . ~/.bashrc
環境変数を確認します。
# echo $LANG
ja_JP.UTF-8
データベースとテーブルを作成
先にデータベースを作成します。
※ db_todo という名前のデータベースを作成します。
# mysql -uroot -ppassword -e "CREATE DATABASE db_todo;"
SQL ファイルを作成します。
$ mkdir -p ~/tmp/mysql-base
$ cd ~/tmp/mysql-base
# vim create_table.sql
ファイルの内容
USE db_todo;
CREATE TABLE todos (
id INT AUTO_INCREMENT PRIMARY KEY,
content TEXT NOT NULL,
created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
completed_date TIMESTAMP
);
MySQL に SQL ファイルを取り込みます。
# mysql -uroot -ppassword db_todo < create_table.sql
テーブルの内容を表示してみます。
# mysql -uroot -ppassword
mysql> USE db_todo;
mysql> SELECT * FROM todos;
Empty set (0.00 sec)
ここまでの手順で MySQL のコンテナにデータベースとテーブルを作成することができました。
データの挿入
SQL ファイルを作成します。
# vim insert_table.sql
ファイルの内容
USE db_todo;
INSERT INTO todos (content, completed_date)
VALUES
('食材を買う', NOW()),
('報告書を仕上げる', NOW()),
('運動する', NOW()),
('本を読む', NULL),
('請求書を支払う', NULL),
('家を掃除する', NULL),
('プレゼンの準備する', NULL),
('コードを書く', NULL);
MySQL に SQL ファイルを取り込みます。
# mysql -uroot -ppassword db_todo < insert_table.sql
テーブルの内容を表示してみます。
# mysql -uroot -ppassword
mysql> USE db_todo;
mysql> SELECT * FROM todos;
+----+-----------------------------+---------------------+---------------------+
| id | content | created_date | completed_date |
+----+-----------------------------+---------------------+---------------------+
| 1 | 食材を買う | 2023-08-16 05:25:04 | 2023-08-16 05:25:04 |
| 2 | 報告書を仕上げる | 2023-08-16 05:25:04 | 2023-08-16 05:25:04 |
| 3 | 運動する | 2023-08-16 05:25:04 | 2023-08-16 05:25:04 |
| 4 | 本を読む | 2023-08-16 05:25:04 | NULL |
| 5 | 請求書を支払う | 2023-08-16 05:25:04 | NULL |
| 6 | 家を掃除する | 2023-08-16 05:25:04 | NULL |
| 7 | プレゼンの準備する | 2023-08-16 05:25:04 | NULL |
| 8 | コードを書く | 2023-08-16 05:25:04 | NULL |
+----+-----------------------------+---------------------+---------------------+
8 rows in set (0.00 sec)
ここまでの手順で MySQL のコンテナのテーブルにデータを挿入することができました。
Docker 環境で MySQL を使用する手順:Dockerfile 編
こちらの内容は、これまで上で説明してきた作業を Dockerfile で自動化するための手順になります。
プロジェクトフォルダを作成・移動します。
$ mkdir -p ~/tmp/mysql-base
$ cd ~/tmp/mysql-base
SQL ファイルを作成します。
# vim init_db.sql
ファイルの内容
DROP DATABASE IF EXISTS db_todo;
CREATE DATABASE db_todo;
USE db_todo;
CREATE TABLE todos (
id INT AUTO_INCREMENT PRIMARY KEY,
content TEXT NOT NULL,
created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
completed_date TIMESTAMP
);
INSERT INTO todos (content, completed_date)
VALUES
('食材を買う', NOW()),
('報告書を仕上げる', NOW()),
('運動する', NOW()),
('本を読む', NULL),
('請求書を支払う', NULL),
('家を掃除する', NULL),
('プレゼンの準備する', NULL),
('コードを書く', NULL);
Dockerfile を作成します。
$ vim Dockerfile
ファイルの内容
# set up the container.
FROM mysql:8.0-debian
# set utf-8 encoding and mysql root password.
ENV LANG=ja_JP.UTF-8
ENV MYSQL_ROOT_PASSWORD=password
# copy the init sql file to the init dir.
COPY init_db.sql /docker-entrypoint-initdb.d/
vim をインストールする ver はこちら。
# set up the container.
FROM mysql:8.0-debian
# install vim.
RUN apt-get update && \
apt-get install -y vim && \
rm -rf /var/lib/apt/lists/* && \
apt-get clean
# add encoding setting to .vimrc file.
RUN echo ':set encoding=utf-8' >> /root/.vimrc
# set utf-8 encoding and mysql root password.
ENV LANG=ja_JP.UTF-8
ENV MYSQL_ROOT_PASSWORD=password
# copy the init sql file to the init dir.
COPY init_db.sql /docker-entrypoint-initdb.d/
コンテナイメージをビルドします。
$ docker build \
--no-cache \
--tag mysql-base:latest .
コンテナイメージを確認します。
$ docker images | grep mysql-base
mysql-base latest 6a9a1de9ebfc 43 seconds ago 601MB
コンテナを起動します。
$ docker run -d \
--publish 3306:3306 \
--name mysql-todo \
--net net-todo \
--volume db_todo_mysql:/var/lib/mysql \
mysql-base
ここまでの手順で MySQL のコンテナを作成し、データベースとテーブルを作成、またテーブルにデータを挿入することができました。
GUI クライアントから確認
MySQL を GUI から操作する統合ビジュアルツールとして MySQL Workbench があります。
これらのツールを活用することにより、より手軽に MySQL を操作することができます。
まとめ
ローカル環境の Ubuntu の Docker 環境で、MySQL コンテナを起動することができました。
クラウド開発においては、Dockerfile の理解は重要です。自動ビルドツールもありますが、手動で書く必要があるケースもあります。Ubuntu を使うと Linux の知識も身に付きます。最初は難しく感じるかもしれませんが、徐々に進めていけば自信を持って書けるようになります。
どうでしたか? MySQL の操作には、この他にもたくさんのコマンドがあります。みなさんも少しづつ試してみてください。今後も開発環境などを紹介していきますので、ぜひお楽しみにしてください。
おまけ
AUTO_INCREMENT インデックス値をリセットする方法
USE db_todo;
ALTER TABLE todos AUTO_INCREMENT = 1;
推奨コンテンツ
関連記事