diadia

興味があることをやってみる。自分のメモを残しておきます。

dockerのvolumeがホストのどこにあるのか

Dockerのvolumeがホストのどこに存在するか知りたい。

docker-compose.yml内で以下のように記述することに関していままで自分が勘違いしていた。

  db:
    image: postgres

    volumes:
        - postgres_data:/var/lib/postgresql/data <-コレ

    environment:
      - POSTGRES_DB=docker_test_db
      - POSTGRES_USER=docker_test_user
      - POSTGRES_PASSWORD=docker_pass
      - DATABASE=postgres

    ports:
      - 5432:5432

volumes:
  postgres_data:

postgres_dataはいかなるホスト(OS)でも存在し、そしてdocker-compose.ymlではパスで表示している。ひょっとするとdocker-compose.ymlのカレントディレクトリに隠しファイルとして作成されるのか、とも思っていた。

こんなふうに考えていたが、少し確かめたことがありその結果は以下になる。まずpostgres_dataはすべてのホストで存在している事実はない。volumesで宣言することで新たにpostgres_dataというディレクトリもしくはファイルが作成されることはなかった。次にdocker-compose.ymlでpostgres_dataはパスとして書いていない。 そしてカレントディレクトリの隠しファイルとして新たにファイルが作成されることもなかった。

ではどこにvolumesの値が保存されるのかという話だ。
どこにデータが存在するか確かめたい。本当にホストに存在しているのか確かめたいと思った。

Volumeのパスは以下のコマンドで確認することができると分かった。

docker inspect コンテナID
Volumeのパスを参照するコマンドについての資料

Dockerで特定のコンテナのVolumeのパスを確認する方法 - Qiita

結果としてホストのある部分にvolumeに該当する領域を確認することができた。

"Mounts": [
{
"Type": "volume",
"Name": "mydockertest_postgres_data",
"Source": "/var/lib/docker/volumes/mydockertest_postgres_data/_data",
"Destination": "/var/lib/postgresql/data",
"Driver": "local",
"Mode": "rw",
"RW": true,
"Propagation": ""
}
],

またvolumeは自分で削除しない限りずっと残り続けてしまうので確認が必要だと認識した。 ちなみにvolumeのリスト表示は以下のコマンドで表示することができる。

docker volume ls

これでコンテナを使っていないのにvolumeだけ残っているものを発見したら削除できる

Volumeの削除は以下のようにして実行する。 未使用のvolumeを一括削除する

docker volume rm $(docker volume ls -qf dangling=true)

指定して削除するコマンドは以下の通り。

docker volume rm project_db-data
volumeの一括削除に関する資料

Docker volumeの削除 - Qiita

volumeの削除コマンドについての資料

未使用のコンテナ、volumeなどを一括削除 - Qiita