goroumaru41gou

遊んでいる中でインプットした内容をアウトプットする場

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 updocker-compose downdocker-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)

参考

docker volume削除について