コンテナDB入門シリーズ①:Dockerでデータベースを動かしてみた(MySQL)

はじめに

Dockerの基本コマンドは使えるようになったけれど、次のステップとしてKubernetesに挑戦したい方やコンテナ環境でデータベースを安全に動かしたり接続する方法を知りたい方、将来的に「Kubernetes上でアプリケーションとDBを組み合わせて動かす」ことを目指している方へ向けて・・・

今回から「コンテナDB入門シリーズ」と題して、実務に応用可能な知識をステップ・バイ・ステップで習得することを目指し本シリーズを連載します。

本記事は第一回目として、まず単体のDockerコンテナ上でデータを永続化してコンテナDBを動かす方法を解説します。Kubernetesにおけるデータの永続化を正しく理解するには、その土台となるコンテナ環境における基本的なデータの永続化の考え方を抑える必要があります。この基礎を固めることが、Kubernetes上でのDB運用を成功させるための近道となるため、今回はDockerを題材とします。

コンテナのデータ永続化

永続化とはデータを生成したプログラムが終了してもそのデータが存続する特性のことです。この永続化の仕組みはDockerにも存在し、データの保存に関連します。

なぜデータ永続化が必要か

Dockerコンテナを扱う上で最も重要な性質の一つが、「コンテナが削除されるとその内部のデータも失われる」という点です。

例えば、データベースのコンテナを起動し、顧客データを保存したとします。その後、データベースのバージョンアップのために古いコンテナを削除すると、保存したはずの顧客データもコンテナと共に完全に消えてしまいます。コンテナと共にデータを削除しないために、データをコンテナの外部に保存する「データ永続化」という仕組みが必要になります。

データ永続化の方法(Docker Volumeの利用)

Docker Volumeは、コンテナ内部のデータを保持するために、コンテナ外部の場所(ディレクトリ)にデータを保管する仕組みです。

コンテナ内のデータは、コンテナを削除すると失われてしまいますが、Docker Volumeはホストマシン上のDockerが管理する領域に作成されます。そのため、コンテナとは別にデータが管理されるのが特徴です。

コンテナ起動時に、このVolumeをコンテナ内の特定のディレクトリに接続(マウント)することで、アプリケーションが書き込むデータはコンテナの外にあるVolumeに保存されます。これにより、コンテナを削除・再作成しても、同じVolumeを再度マウントすれば、データを引き継ぐことができるのです。

DockerでDBを動かすハンズオン

今回のハンズオンはdockerコマンドが使える環境がある方を対象としています。

もし、まだDockerをインストールしていない場合は、以下、公式サイトや記事を参考にして、お使いのUbuntu環境にDocker Engineをセットアップしてください。

【公式サイト】Install Docker Engine on Ubuntu https://docs.docker.com/engine/install/ubuntu/

VSCode Dev ContainerとRancher Desktopで作るコンテナ環境【WSL】

https://tech-lab.sios.jp/archives/33994

実行環境

  • Ubuntuのバージョン:24.04.1 LTS
  • Dockerのバージョン:28.1.1

DBコンテナイメージの取得

ハンズオンを始めるにあたって、まずはお好きな場所に作業用のディレクトリを作成し、そこに移動してください。今回はMySQL8.4のコンテナイメージを使用します。以下のコマンドでMySQL8.4のDockerイメージを取得できます。

docker pull mysql:8.4

ボリュームの作成

docker volume create コマンドを使うとDocker Volumeを作成できます。

docker volume create <作成したいVolume名>

Docker Volumeの作成

作成したDocker Volumeはdocker volume lsコマンドで確認することができます。

docker volume ls

Docker Volumeを指定してDBコンテナを起動

docker runコマンドは、オプションを追加することで、コンテナの名前や使用するボリュームなど様々な設定をその場で指定できます。以下は今回使用したコマンドの解説です。

  • docker run -d
    • dockerコンテナを起動するコマンドdocker runに-dオプションを付けて実行します。-dオプションを使用することでdocker runをバックグラウンド(デタッチモード)で実行することができます。バックグラウンドで実行することでターミナル画面がデータベースのログで埋め尽くされ、他のコマンドが打てなくなることを防ぎます。
  • – name <付けたいコンテナ名>
    • 起動するコンテナの名前を決めるオプションです。後でコンテナ名を使用して操作するためここで名前を決めます。
  • -e MYSQL_ROOT_PASSWORD=<設定したいパスワード> 
    • パスワードを設定するオプションです。MySQLの公式イメージは、起動する際にMYSQL_ROOT_PASSWORDという環境変数がないかを探しに行きます、存在していればその値を管理者(root)ユーザーの初期パスワードとして自動で設定してくれます。
  • -v <作成したvolume>:/var/lib/mysql 
    • 作成したDocker Volumeを、コンテナの中の「/var/lib/mysql」というフォルダに接続(マウント)するオプションです。このオプションをつけることでコンテナ内のMySQLが書き込むデータは、コンテナの外にある安全なボリュームに保存されます。
  • -p 3306:3306 
    • ホストの3306番ポートと、コンテナの3306番ポートを繋ぐオプションです。
  • mysql:8.4 
    • mysql:8.4という名前のDockerイメージを使って、これらすべての設定を実行します。
docker run -d \
 --name <付けたいコンテナ名> \
 -e MYSQL_ROOT_PASSWORD=<設定したいパスワード> \
 -v <作成したvolume>:/var/lib/mysql \
 -p 3306:3306 \
 mysql:8.4

このコマンドを実行することでコンテナ起動時にDocker Volumeの指定を出来ます

起動したDBコンテナへのアクセス

docker execコマンドは、実行中のDockerコンテナの内部にアクセスし、そこで別のコマンドを実行するためのものです。

今回の目的は、起動したMySQLコンテナにログインすることなので、まずdocker execでコンテナの中に入り、続けてmysqlコマンドを実行します。これにより、コンテナ内でrootユーザーとして、パスワードを使ってMySQLにログインすることができます。

docker exec -it <コンテナ名> mysql -u root -p

Enter password: と出力されるので先ほど指定したMySQLのrootユーザーパスワードを入力してEnterを押下するとMySQLにログインできます。

MySQLコンテナにアクセス

永続化の確認

次にコンテナを作り直してもデータが残っていることを確認します。

永続化の確認のため、任意のデータベースを作成し、レコードを追加します。以下は今回データベースやレコードの作成に使用したコマンドです。

CREATE DATABASE <作成するDB名>;

USE <作成するDB名>;

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

INSERT INTO users (name) VALUES ('Taro Yamada');

SELECT * FROM <テーブル名>;

テストデータを作成

データを作成したのでコンテナを削除します。MySQLコンテナから抜ける際はexitを使用します。

次にコンテナを停止・削除していきます。

docker stop <コンテナ名> を実行してコンテナを停止します。

docker rm <コンテナ名> を実行してコンテナを削除します。

docker stop <コンテナ名>;
docker rm <コンテナ名>;

コンテナを削除

データ永続化確認のためVolumeを指定してコンテナにアクセスし、テーブル内のデータを確認します。

docker run -d \ --name <任意のコンテナ名> \ -e MYSQL_ROOT_PASSWORD=<任意のパスワード> \ -v <作成したvolume>:/var/lib/mysql \ -p 3306:3306 \ mysql:8.4 docker exec -it <コンテナ名> mysql -u root -p USE <作成するDB名>; SELECT * FROM <テーブル名>; 

参考としてVolumeの指定をせずにコンテナを起動しデータを確認するとデータが保存されていないことが確認できます。

Docker Volumeを使用しなかった場合の実行結果

おわりに

今回は、Docker初心者がつまずく「コンテナを消すとデータも消える」という問題を、Docker Volumeを使って解決する方法を紹介しました。

Webアプリなどデータベースを必要とするシステムをコンテナで作成する際、「コンテナが削除されると内部のデータも消える」という性質からデータを守るこの「永続化」の概念はとても重要です。

コンテナとデータを分離するという考え方は、この先Kubernetesを学ぶ上でも非常に重要になってきます。Kubernetesでは、このデータ永続化を、PersistentVolume (PV)と PersistentVolumeClaim(PVC)という、さらに洗練された仕組みで実現します。

次回の記事では、Docker Volumeの知識を土台に、Kubernetesでのデータ管理の世界へステップアップしますので、ぜひご覧ください。

参考文献

辞典・百科事典の検索サービス – Weblio辞書 「永続化の意味・解説」

https://www.weblio.jp/content/%E6%B0%B8%E7%B6%9A%E5%8C%96

Dockerのデータ永続化について

https://docker.lock-life.com/archives/341

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です