はじめに
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 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にログインできます。
永続化の確認
次にコンテナを作り直してもデータが残っていることを確認します。
永続化の確認のため、任意のデータベースを作成し、レコードを追加します。以下は今回データベースやレコードの作成に使用したコマンドです。
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初心者がつまずく「コンテナを消すとデータも消える」という問題を、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のデータ永続化について





