docker volumeの書き方について調査する
こんなdocker-composeをみかけて「え?ホスト側のマウント先指定してなくね?」と思った。
code:docker-compose
db:
image: mysql:5.7
~省略~
volumes:
- /var/lib/mysql
自分はvolumesは./db/my-volume:/var/lib/mysqlという風にホスト側とコンテナ側どちらもフォルダやファイルのパスを指定しないといけないと思っていた。
理解が浅いので、dockerのリファレンスを見てみる。
code:volumesの書き方 -Short syntax-
volumes:
①
# Just specify a path and let the Engine create a volume
# コンテナ側のパスだけ指定するとDocker Engineがボリュームをつくる
- /var/lib/mysql
②
# Specify an absolute path mapping
# 絶対パスでホスト,コンテナのパスを指定
- /opt/data:/var/lib/mysql
③
# Path on the host, relative to the Compose file
# ホスト側を相対パスで指定
- ./cache:/tmp/cache
④
# User-relative path
# ホスト側をホームディレクトリからの相対パスで指定
- ~/configs:/etc/configs/:ro
⑤
# Named volume
# 名前をつけたvolumeを指定してマウントさせる
- datavolume:/var/lib/mysql
jiroshin.icon short syntaxだけで5つも書き方があったの知らなかった!今回引っかかったのは①の書き方だったのか。
かといって②、③、④はマウント先のパスを自分で指定しているためパッと見でどこにコンテナと共有されたデータがあるのか分かる。でも、①とか②は分からない...。
code: docker inspectの使い方
ホスト側にマウント先が謎なdockerコンテナを立ち上げて, docker psしてコンテナIDまたはnameを調べてから docker inspectに引数として渡して実行する。
するとdockerコンテナの情報がズラーと表示される。その中でにマウント情報が書いてあるので確認。
code: docker inspect の結果を一部抜粋
"Mounts": [
{
"Type": "volume",
"Name": "7589758232100",
"Source": "/var/lib/docker/volumes/57826331652/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
volumesマウントしてるからRWがtrueになってる。volumeのnameは7589758232100でホスト側のマウント先(Source)は/var/lib/docker/volumes/57826331652/_data`だということが分かった。
code: docker volume inspect 7589758232100 の結果
[
{
"CreatedAt": "2019-12-25T14:44:09Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/57826331652/_data",
"Name": "7589758232100",
"Options": null,
"Scope": "local"
}
]
やっぱりホスト側の"/var/lib/docker/volumes/57826331652/_data"にマウントされたデータあるということが分かった。
それではcd /var/lib/docker/volumesとターミナルでコマンドを実行してデータを確かめたいところだけどエラー cd: no such file or directory: /var/lib/docker/volumes。
実はDocker for MacはVMで動いていて、今回の/var/lib/docker/volumes/といったパスはVM内のパスなのだ。
↓ 参考になる記事
もう一度, volumesの書き方に戻る。5つの書き方は実はこういうこと。
code:volumesの書き方 -Short syntax-
volumes:
①
# docker engineにvolumeを作らせてVM内のパスを参照するパターン
- /var/lib/mysql
②
# VMではなくローカルにホストするパターン1
- /opt/data:/var/lib/mysql
③
# VMではなくローカルにホストするパターン2
- ./cache:/tmp/cache
④
# VMではなくローカルにホストするパターン3
- ~/configs:/etc/configs/:ro
⑤
# 分かりやすい名前のvolumeを作成しておいてホスト側の参照先に指定するパターン
# 実態はVM内の /var/lib/docker/volumes/名前つけたvolume/data に保存される
- datavolume:/var/lib/mysql
↓ ⑤に関して、この記事が分かりやすい
volumeの謎が解けた!
でも今回のようなdocker engineにvolumeを作らせるパターンはdocker volume lsした時にvolume名だけではどのコンテナにマウントされてるか分からないし、自分でdocker volume create --nameしてvolumeを作ってからコンテナにマウントさせるのが良いのではないかと思う。 それかプロジェクトごとに管理しやすそうな、ホストもコンテナもパスを指定してあげる②、③、④の書き方が良さそう。
参考になるリンク