旧題: MySQLのDBをそのままdocker imageとして保存できない理由
概要
DBに初期データ流し込んでそれimageとして保存したい時に、わざわざ-vオプションで手元のディレクトリに吐かせたりするのは他のところに持って行きにくいし面倒に思ったので。
- mysqlのdocker imageってコミットしても /var/lib/mysqlが初期化されてしまうのはなぜか?
- Dockerfileを読んだところ
VOLUME /var/lib/mysql
の記述があったためこのあたりについて調べてみた - 公式イメージを使わなければ普通に実現できますよという話はそれはそれとして
環境
- dockerのバージョン:
Docker version 17.05.0-ce, build 89658be
- 使ったDockerfile: https://github.com/docker-library/mysql/blob/6c414e7f38c2079c7193beae5dc7c34ee46cd6e7/5.7/Dockerfile
そもそもVOLUME 命令についての確認
-
VOLUME /abs/path
で、このパスをボリュームとする. - ボリュームとなると他のホストやコンテナからマウント可能になる
- 具体的にはdocker run した時に新しくボリュームが作成される
- これに関しては調査していないが恐らく
docker run -v /abs/path
と挙動は同じ - 手元の環境では
/var/lib/docker/volumes/
以下に作成されていた - -v で手元のディレクトリをマウントさせるときと同じく実体としては共有するファイルがそのまま置かれている
- これに関しては調査していないが恐らく
- すでに作られたボリュームについて確認するコマンド
-
docker volume ls
既にあるボリュームのls -
docker volume inspect volume_name
ボリュームの情報を吐く -
docker container inspect container_name
Mountsの項目にどのボリュームをマウントしているのかが出る
-
結論 保存されないのではなく、volumeとして外部に保存されている
毎回違うvolumeを作るから前回の変更が保持されていない、ということなので
前回と同じvolumeを使えば良い....が毎回/var/lib/docker/volumes/db みたいなことを叩くのは面倒なので
手元のディレクトリに作るのが良さそう
その他: docker runのオプションの-v と --mountについて
このあたりについて調べてる上でdocker runのオプションにボリューム関連のオプションが2つあることに気づきました
-v
と --mount
の違いについては下のページに公式からのありがたいお言葉が散りばめられています
https://docs.docker.com/engine/admin/volumes/bind-mounts/
その他その2 Data Volume Containerについて
ボリュームとしての役割を果たすコンテナをData Volume Containerと呼ぶ(らしい)
"data volume container" inurl:docs.docker.com で検索したが出てこないので出てきた中ではかなり公式感があるドキュメントを参考に。
http://docs.docker.jp/engine/userguide/dockervolumes.html
これは、下記のようにして実現しているようです。
-
docker create -v /var/lib/mysql --name volume busybox
などでボリュームとそのボリュームをマウントするコンテナを作成(ボリュームへのひも付けが必要なだけなのでできるだけ軽量なものが望ましい) -
docker run --volumes-from=volume mysql
のように--volumes-from
で マウント
最初のステップで/var/lib/docker/volumes以下に新規でディレクトリが掘られて、以降はそれと紐付いたコンテナ越しにマウントすればいくつかの点で便利、みたいな話なのかと思ってます。
これを見て個人的に思った長所と気になる点(短所ではない)を書いていきます
長所
- 複数のボリュームをセットにして扱いたい場合はひとまとめになって便利
- /var/lib/docker/volumes/***** とか打たなくていい
- /var/lib/docker/volumes以下にデータは保存されるので手元のディレクトリ消した時にうっかりまだ使うデータ消しちゃった的な心配は減る
気になる点
- 無理矢理実現しているだけでは?
- ~/.volumes/とかに切ればそれで良さそう
- 別にコンテナ一個増えるとかはまあいいけど気になるものは気になる
その他その3 docker volume createについて
ボリュームの名前だけでマウントする手段がない以上、これを手動で使うことあるのか???