LoginSignup
3
2

Docker 環境で MySQL を使用する:Dockerfile

Last updated at Posted at 2023-08-23

Docker 環境で MySQL を使用する:Dockerfile

こんにちは、@studio_meowtoon です。今回は、WSL の Ubuntu 22.04 の Docker 環境で MySQL を使用する手順を紹介します。
mysql_on_docker.png

目的

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 から出ます。

ここまでの手順で、ローカル環境の DockerMySQL のコンテナを起動することができました。

データベースの作成

今後、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

ファイルの内容

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

ファイルの内容

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

ファイルの内容

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

ファイルの内容

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 はこちら。
Dockerfile
# 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 があります。
image.png
image.png
これらのツールを活用することにより、より手軽に MySQL を操作することができます。

まとめ

ローカル環境の Ubuntu の Docker 環境で、MySQL コンテナを起動することができました。

クラウド開発においては、Dockerfile の理解は重要です。自動ビルドツールもありますが、手動で書く必要があるケースもあります。Ubuntu を使うと Linux の知識も身に付きます。最初は難しく感じるかもしれませんが、徐々に進めていけば自信を持って書けるようになります。

どうでしたか? MySQL の操作には、この他にもたくさんのコマンドがあります。みなさんも少しづつ試してみてください。今後も開発環境などを紹介していきますので、ぜひお楽しみにしてください。

おまけ

AUTO_INCREMENT インデックス値をリセットする方法

SQL として実行してください。
USE db_todo;
ALTER TABLE todos AUTO_INCREMENT = 1;

推奨コンテンツ

関連記事

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2