目次
こんにちは。sinyです。
本記事では、Docker入門者向けにdockerのData Volumeの使い方についてまとめました。
Data Volumeとは?
Dockerのコンテナ実行中に書き込まれたファイル等はホスト側にファイルやディレクトリをマウントしておかない限りコンテナを破棄した時点でデータが消失してしまいます。
例えば、データベースを利用している場合にコンテナ実行中に行われた変更内容が維持されないと困りますよね。
このように永続的にデータを保存しておきたい場合、データベース用のコンテナとは別にData Volumeコンテナという永続化専用のコンテナを用意する方法があります。
- Data Volumeコンテナのボリュームはホスト側の/var/lib/docker/volumes/配下に配置される。
- Data Volumeコンテナを必要とするコンテナ(今回のケースではデータベース用のコンテナ)はホスト側のVolumeディレクトリがどこなのかということを知る必要がなく、Data Volumeコンテナ名を指定するだけでOK
- Data Volumeコンテナとの結びつけはdocker run時に--volumes-fromオプションで指定する。
以下は、MySQLデータベースのコンテナを使用した場合にデータを永続的に保存するためにData Volumeコンテナを利用した場合の概要図です。
Data Volumeの利用方法
以下はMySQLを利用した場合にデータベースへの変更内容を永続的に保存するためにMySQLコンテナの他にData Volumeコンテナを使った場合の手順です。
DataVolume用のDockerfileの作成
今回はData Volume用のコンテナにbusyboxという軽量なLinuxOSを利用します。
以下のようなDockerfileを作ります。
FROM busybox VOLUME /var/lib/mysql CMD ["bin/true"]
FROMで元となるDockerイメージを指定します。(今回はbusybox)
VOLUMEに永続化したいボリュームを指定します(今回はMySQLのデータが格納されるディレクトリ)
CMDは bin/trueとしています。(単に正常終了するようなコード)
Data Volumeコンテナ用イメージを作成
docker imageコマンドで先ほど作成したDockerfileを使ってData Volume用のDockerイメージを作成します。
コマンド実行後にdicker imagesでイメージが作成されていることを確認しましょう。
docker image build -t siny/mysql-data . $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE siny/mysql-data latest fb43d6a80082 2 hours ago 1.22MB
Data Volumeコンテナの実行
続いて、先ほど作成したData Volume用イメージを使ってコンテナを起動します。
docker container run -d --name mysql-data siny/mysql-data
ここでは、 --nameオプションでコンテナ名「mysql-data」を指定してDockerイメージ「siny/mysql-data」を元にData Volume用のコンテナを起動しています。
データベース用コンテナ(MySQL)の実行
最後にMySQLコンテナを実行します。
docker coitaner runコマンド実行時に--volumes-fromで先ほど起動したData Volume用のコンテナ名(mysql-data)を指定することで、MySQLのコンテナに/var/lib/mysqlのデータが保存されるようになります。
$ docker container run -d --rm --name mysql \ > -e "MYSQL_ALLOW_EMPTY_PASSWORD=yes" \ > -e "MYSQL_DATABASE=volume_test" \ > -e "MYSQL_USER=siny" \ > -e "MYSQL_PASSWORD=password" \ > --volumes-from mysql-data \ > mysql:5.7 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 98e783a3562d mysql:5.7 "docker-entrypoint.s…" 17 minutes ago Up 23 seconds 3306/tcp, 33060/tcp mysql
docker psで確認するとMySQL用のコンテナ(mysql)が起動していることが確認できます。
MySQLに接続してデータを更新
それでは、docker container execコマンドを使ってMySQLコンテナに接続してテスト用にテーブルを作成してみます。
$ docker container exec -it mysql mysql -u root -p volume_test Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.27 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
mysqlのプロンプト画面がでるので、以下のコードを実行してテスト用にuserテーブルを作成してみます。
mysql> create table user (id int, name varchar(10), address varchar(10)); Query OK, 0 rows affected (0.00 sec) mysql> select * from user; Empty set (0.01 sec)
テーブルを作っただけなのでレコードは0件です。
テスト用に2件ほどデータを追加します。
mysql> insert into user values (1, 'siny', 'Tokyo'); Query OK, 1 row affected (0.00 sec) mysql> insert into user values (2, 'taro', 'Chiba'); Query OK, 1 row affected (0.01 sec) mysql> select * from user; +------+------+---------+ | id | name | address | +------+------+---------+ | 1 | siny | Tokyo | | 2 | taro | Chiba | +------+------+---------+ 2 rows in set (0.00 sec)
2件データが登録されました。
ここで、MySQLコンテナを停止します。
docker container stop mysql
続いて、先ほどと同じdocker cointaner runコマンドでMySQLコンテナを再度起動します。
さらにdocker container execで再度MySQLコンテナに接続してselect * from user;を実行して先ほど作ったuserテーブルのレコードが存在していることを確認します。
mysql> select * from user; +------+------+---------+ | id | name | address | +------+------+---------+ | 1 | siny | Tokyo | | 2 | taro | Chiba | +------+------+---------+ 2 rows in set (0.00 sec)
上記の通り、MySQLコンテナを停止、起動してもデータベースのデータが永続的に保持できていることが確認できます。
以上、Data Volumeコンテナの利用方法まとめ【入門者向け】でした。