docker Volumeについて
データベースを使用していてデータ永続化するとき、volume周辺をいろいろ触っていたので、備忘録とする。
取り扱うもの
dockerについて
volume永続化
例えば、データベースにあるデータをコンテナ削除/再起動したとき、再起動時にデータを継続して使いたい場合に永続化させる。
永続化方法は?
- 永続化しないとき
version: "3.7" services: mysql: container_name: mysql image: mysql:5.7.26 ports: - 3306:3306 env_file: - ./.env networks: - overlay networks: overlay:
- 永続化するとき
version: "3.7" services: mysql: container_name: mysql image: mysql:5.7.26 ports: - 3306:3306 env_file: - ./.env volumes: # これで永続化できる - mysql-volume:/var/lib/mysql networks: - overlay volumes: # これで永続化できる mysql-volume: networks: overlay:
永続化されたデータはどこへ?
これを確認すると、永続化がどのようにされているか少し理解できる。
保存先は、var/lib/docker/volumes
となっている。
- 永続化しないとき、ハッシュ値となる
/var/lib/docker$ sudo ls volumes b9216de573512e2ae948b29f017bcd8c98461e2e4146b42fb4125554a90dee4f metadata.db
- 永続化するとき、yamlで指定した名称となる
/var/lib/docker$ sudo ls volumes mysql-volume metadata.db # yamlで指定したmysql-volumeとして保存される
「永続化 yaml」と「非永続化 ymal」をそれぞれ起動・削除するとどうなるか?
手順は、docker-compose up
→ docker-compose down
→ docker-compose up
とする。
- 「永続化 ymal」のとき
/var/lib/docker$ sudo ls volumes mysql-volume metadata.db # 指定volumeだけ
- 「非永続化 ymal」のとき そもそもvolumesを記述してないのに、ここにファイルが増えてく。
/var/lib/docker$ sudo ls volumes b9216de573512e2ae948b29f017bcd8c98461e2e4146b42fb4125554a90dee4f ea68031e5829cc5e3537cf71ea791be76f099dfe10afbc1f7d5f8fb8c66fa37f metadata.db #ハッシュが増えてく、消えない
つまり、「永続化」は起動時に同じファイルを指定してマウントしてるだけ。 volume記述しなくても、ゴミは残り続けるから、ゴミに名前を付けて再利用してるということ。 docker立ち上げるだけでゴミが増えてくから、ゴミ掃除のとき、全部消しちゃったなんてなると・・・
volume削除
- ファイル指定して削除
docker volume rm FileName # FileNameを任意ファイルとする
- 利用してないファイル削除(起動してない=利用してない??)
docker volume prune
- 全削除
docker volume rm $(docker volume ls -qf dangling=true)