docker

MySQLのDBをそのままdocker imageとして保存できない理由

概要

読んでそのまま。
DBに初期データ流し込んでそれimageとして保存したい時に、わざわざ-vオプションで手元のディレクトリに吐かせたりするのは他のところに持って行きにくいし面倒に思ったので。

  • mysqlのdocker imageってコミットしても /var/lib/mysqlが初期化されてしまうのはなぜか?
  • Dockerfileを読んだところ VOLUME /var/lib/mysql の記述があったためこのあたりについて調べてみた
  • 公式イメージを使わなければ普通に実現できますよという話はそれはそれとして

環境

そもそもVOLUME コマンドについての確認

https://docs.docker.com/engine/reference/builder/#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について

ボリュームの名前だけでマウントする手段がない以上、これを手動で使うことあるのか???