インターネットのスケッチ

Done is better than perfect.

docker-compose.ymlのトップレベルに書くvolumesについて

名前付きvolume

docker-compose.ymlの書き方について調べていると、以下のような設定がたまにあります。

version: "3.2"
services:
  web:
    image: nginx:alpine
    volumes:
      - type: volume
        source: mydata
        target: /data
        volume:
          nocopy: true
      - type: bind
        source: ./static
        target: /opt/app/static

  db:
    image: postgres:latest
    volumes:
      - "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"
      - "dbdata:/var/lib/postgresql/data"

volumes:
  mydata:
  dbdata:

今回疑問に思ったのは、一番下にある volumes はどういう役割があるのか、ということです。 servicesの中にあるvolumesは普通に見るけど、外にあるvolumesって何だろうと。

これはトップレベルに定義するvolumesで、「名前付きvolume」と言うらしいです。 なるほど、一番上の階層はトップレベルっていうんですね。

そして名前付きvolumeは単体のサービス内だけでなく、複数のサービス(例えばwebとdb)内のvolumesから参照できるようです。

ちなみに

サービスにはコンテナがアタッチされるため、サービスの実態はコンテナです。

データの永続化について

名前付きvolumeを使うと、 docker-compose down や docker-compose prune とかでコンテナを削除したらDBのデータも消えるっぽい?

この方式は各サービスのvolume:ではホスト側はボリュームの名称を指定するのでいちいちディレクトリパスを書かずに済むのですが、dockerコマンドでボリュームを削除するとホスト側のディレクトリごと削除されてしまう

トップレベルに書かないで、サービスごとに書けば問題ないみたいだが、また機会があれば検証してみようと思います。

とりあえず今は名前付きvolumeは使わないで進めてみます。

参考

Compose file version 3 reference | Docker Documentation

さわって理解するDocker入門 第4回 | オブジェクトの広場
→「volumes - volume(データの永続化領域)の定義」のところ

Docker Composeのトップレベルvolumesでホストのディレクトリをマウントする

Docker for Macを使ってRuby on Rails開発環境を構築する | mediba Creator × Engineer Blog