0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

【Docker Storage】ボリュームで MySQL コンテナのデータが消えないようにする

Last updated at Posted at 2024-06-29

はじめに

この記事では、Docker のボリューム機能を利用して、コンテナを削除してもコンテナのデータが消えないようにする手順について記載します。
ボリュームへの理解促進の一環で行っています。

開発環境

開発環境は以下の通りです。

  • Windows 11
  • Docker Engine 26.1.1
  • MySQL 8.4.0

ボリュームを作成する

まずは、docker volume create でボリュームを作成します。

docker volume create --name my-volume

image.png

docker volume ls で作成したボリュームを確認します。

docker volume ls

image.png

MySQL コンテナ起動時にボリュームをマウントする

docker container run コマンドの --mount オプションを指定して、作成したボリュームをコンテナにマウントします。

--mount オプションには、<key> <value> 形式の設定をカンマ区切りで指定します。

<key> <value> 備考
type volume
source my-volume マウント元
target /var/lib/mysql マウント先

マウント先の /var/lib/mysql は、MySQL サーバーがデータを保存するデフォルトのディレクトリになります。MySQL 設定ファイル(/etc/my.cnf)で定義されています。

docker container run --rm mysql:8.4.0 cat /etc/my.cnf
[mysqld]
...
datadir=/var/lib/mysql
...

それでは、ボリュームをマウントして MySQL コンテナを起動します。

# docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker container run                                            `
--name db1                                                      `
--rm                                                            `
--detach                                                        `
--env MYSQL_ROOT_PASSWORD=password                              `
--env MYSQL_DATABASE=sample                                     `
--publish 3306:3306                                             `
--mount type=volume,source=my-volume,target=/var/lib/mysql `
mysql:8.4.0

MySQL サーバーに接続します。

mysql --host=127.0.0.1 --port=3306 --user=root --password=password sample

user テーブルを作成し、Wyatt と Billy を user テーブルに追加します。

create table user (id int, name varchar(32));
insert into user (id, name) values (1, 'Wyatt');
insert into user (id, name) values (2, 'Billy');
select * from user;

image.png

これで MySQL サーバーにデータが作成され、/var/lib/mysql に保存されました。/var/lib/mysql はボリュームがマウントしてあるので、コンテナ内のディレクトリではなく、ボリュームにデータが保存されています。

動作確認

動作確認のため、db1 コンテナを停止します。

docker container stop db1

新たに db2 コンテナを起動します。db1 コンテナにマウントした my-volume を同じように db2 コンテナにマウントします。

docker container run                                            `
--name db2                                                      `
--rm                                                            `
--detach                                                        `
--publish 3306:3306                                             `
--mount type=volume,source=my-volume,target=/var/lib/mysql `
mysql:8.4.0

db2 コンテナの起動に環境変数は不要です。コンテナ起動時に環境変数のデータを元に MySQL サーバーのデータが作成されます。今回はボリュームを利用するので、データは既に作成済みです。

MySQL サーバーに接続します。

mysql --host=127.0.0.1 --port=3306 --user=root --password=password sample

db2 コンテナの user テーブルに Wyatt と Billy が確認できます。

select * from user;

image.png

参考

関連記事

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?