为什么在运行`docker-compose up`时会创建无名卷,并在执行`docker-compose down && docker-compose up`后数量增加一倍?

85次阅读
没有评论

问题描述

在使用docker-compose启动应用程序时,发现每次第一次启动时会创建有名卷,然后每次再次启动时会创建额外的卷。他想知道这是否是正常行为,还是他的docker-compose文件有问题。此外,在运行docker volume prune后,删除了两个无名卷。下面是他的输出示例:

DRIVER              VOLUME NAME
local               2b33c81e6e955ff36061f4120b7181c7efc7aebded2f87eaa7290027f1e7a725
local               74301eadc75018d6f7da76aec44bcf743e03261492cfcc33211941684a570030
local               c42b1e2c17342c52b4b9e90f4d4b7fa24ccb30de5479e65cf4366e2373dfb0bf
local               dcfa63dbf99362fc92fe3b981f50abebfe1bba03063d4dd9dd790f4c058817cf
local               dockerinfluxdbgrafana_grafana-data
local               dockerinfluxdbgrafana_influxdb-data

解决方案

在解决这个问题之前,我们首先需要理解Docker中有名卷和无名卷的概念。

有名卷(Named Volumes)与无名卷(Anonymous Volumes)

有名卷是用户显式创建并命名的卷,而无名卷是没有显式命名的卷。无名卷在容器内的挂载点是由Docker自动生成的,其名称是唯一且随机的。

Docker-Compose的行为

在你的问题描述中,当你每次使用docker-compose up启动应用程序时,无名卷的数量会增加。这是因为Docker-Compose默认情况下会创建无名卷。而当你使用docker-compose down停止应用程序时,这些无名卷并不会被自动删除。因此,当你再次使用docker-compose up启动应用程序时,会为每个服务重新创建新的无名卷,从而导致数量增加。

解决方案

解决这个问题有几种方法,以下是一些可能的解决方案:

使用命名卷

命名卷是一种更可控的卷管理方式,可以避免无名卷的增加。你可以通过修改你的docker-compose.yml文件,将需要持久化的数据目录使用命名卷进行挂载。例如,对于你的grafana服务,可以这样修改:

version: "3"
services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    env_file:
      - 'env.grafana'
      - 'secrets.grafana'
    networks:
      - backend
    volumes:
      - grafana-data:/var/lib/grafana

volumes:
  grafana-data:  # 这里定义了一个命名卷

使用绑定挂载

另一种方法是使用绑定挂载(Bind Mounts),将主机上的路径挂载到容器内。这样可以避免自动创建无名卷。例如,对于你的grafana服务,可以这样修改:

version: "3"
services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    env_file:
      - 'env.grafana'
      - 'secrets.grafana'
    networks:
      - backend
    volumes:
      - /srv/lib/grafana:/var/lib/grafana  # 使用绑定挂载

# 注意:如果路径不存在,需要提前在主机上创建

结论

以上两种方法中,使用命名卷是一种更常见的做法,它可以更好地管理和控制卷的状态。绑定挂载则适用于需要将主机文件系统中的路径直接映射到容器内部的情况。

希望这些解决方案能够帮助你解决无名卷增加的问题。如果你在实施时遇到问题,可以随时提问。

正文完