はじめに
この記事では、Docker のボリューム機能を利用して、コンテナを削除してもコンテナのデータが消えないようにする手順について記載します。
ボリュームへの理解促進の一環で行っています。
開発環境
開発環境は以下の通りです。
- Windows 11
- Docker Engine 26.1.1
- MySQL 8.4.0
ボリュームを作成する
まずは、docker volume create
でボリュームを作成します。
docker volume create --name my-volume
docker volume ls
で作成したボリュームを確認します。
docker volume ls
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;
これで 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;
参考
- docker container run
- docker volume create
- docker volume ls
- Volumes
- 鈴木亮「開発系エンジニアのためのDocker絵とき入門」秀和システム、2024
関連記事