docker - 如何使用 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:/
解决方案
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
公开了足够的功能,通常不需要直接使用短名称访问容器。
推荐阅读
- python - 在 Meta 中:AttributeError:模块 'django.db.models' 没有属性
- django - 我可以在Django的views.py中使用for循环吗?
- node.js - MEVN应用的安全性
- android - 如何使用 Mockito 在 Android 中模拟 Companion 对象
- python - 覆盖dragEnterEvent和dropEvent光标后的PyQt不闪烁和改变
- html - 如何使用“rvest”在所有列中使用带有href的表在R中抓取HTML表?
- regex - 字符串之间的正则表达式匹配
- openshift - 无法在 Minishift (1.34.0) 上部署 Keycloak (9.0.0) 部署:keycloak-add-user.json(权限被拒绝)
- javascript - 如何在堆栈导航中为 Webview 制作后退按钮
- javascript - 如何制作社交媒体分享按钮来分享 iframe 元素 vuejs