首页 > 解决方案 > 如何使用 Docker Compose 容器存储数据?

问题描述

我有这个docker-compose.yml,我有一个 Postgres 数据库和 Grafana 在它上面运行以对数据进行查询。

version: "3"

services:
  db:
    image: postgres
    container_name: db
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_PASSWORD=my_secret_password
      
  grafana:
    image: grafana/grafana
    container_name: grafana
    depends_on:
      - db
    ports:
      - "3000:3000"

我用命令开始这个组合docker-compose up,但是,如果我不想丢失任何数据,我必须运行docker-compose stop而不是docker-compose down.

我也读到了docker commit,但是“提交操作将不包括安装在容器内的卷中包含的任何数据”,所以我想这对我的需求没有用。

存储创建的卷并使用命令重用它们的正确方法是什么up/down,即使在重新创建容器时也是如此?我必须使用每个图像提供的某种备份方法(例如,Postgres 的 DB 导出和 Grafana 的其他类型的导出),或者有办法在内部执行此操作docker-compose.yml

编辑:我也读到过volumes,但是有没有标准的方法来存储所有东西?

@DannyB 提供的链接中,设置volumes./postgres-data:/var/lib/postgresql而不是./postgres-data:/var/lib/postgresql/data导致容器存储实际文件夹。

我的问题是:每张图片都必须遵循上面的特定模式?每个 Docker 映像自述文件中都存在用于存储底层卷的数据路径。或者有没有类似的东西:

volumes:
  - ./my_image_root:/

标签: dockerdocker-compose

解决方案


Docker 提供卷作为在容器调用之间持久化卷以及在容器之间共享数据的方式。

在撰写文件中声明和使用它们非常简单:

volumes:
  postgres:
  grafana:

services:
  db:
    image: postgres
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_PASSWORD=my_secret_password
    volumes:
      - postgres:/var/lib/postgresql/data
      
  grafana:
    image: grafana/grafana
    depends_on:
      - db
    volumes:
      - grafana:/var/lib/grafana
    ports:
      - "3000:3000"

或者,您还可以将本地目录设置为您的容器卷,这增加了使文件不仅可以从容器内部轻松访问的信心。这对于将特定配置文件挂载到它们在容器中的位置特别有用,您可以像任何其他文件一样在本地编辑文件,使用更新的配置重新启动容器(证书和其他类似文件也可以很好地使用此选项)。你这样做:

    volumes:
     - /home/myusername/postgres_data/:/var/lib/postgresql/data/

PS。我省略了 compose.yml 中的 container_name 和 version 指令,因为(从 docker 20.10 开始),docker compose 规范自动确定版本,并docker compose公开了足够的功能,通常不需要直接使用短名称访问容器。


推荐阅读