首页 > 解决方案 > 使用数据库重置 docker 映像

问题描述

我想从 300GB 数据库中获取快照,对其进行一些测试,直到数据库不再处于可测试状态,然后将数据库“重置”到它的快照状态并再次测试。

Docker 似乎很适合这个,但我能找到的只是如何使用 sql server 设置一个空数据库。

是否可以创建一个安装了 sqlserver 的 docker 镜像和一个 300GB 的现有数据库?然后再次拉动图像以重置数据?

标签: docker

解决方案


理论上,是的。在实践中,你会遇到两个大问题:

  1. 所有标准 Docker Hub 数据库映像都经过配置,以便它们的数据始终存在于一个卷中。这意味着您无法基于预加载数据的标准图像创建图像;您必须创建自己的基础数据库映像。

  2. Docker 的网络 I/O 开始变得不稳定,单层大小远高于 1 GB。简单地说,通过网络传输 300 GB 图像的机制会很麻烦。

根据数据库内部存储数据的方式,还有一些注意事项。如果有一个 300 GB 的文件,第一次写入它可能会导致尝试复制整个文件。这取决于您通常无法访问或控制的数据库存储和低级 Linux 内核详细信息。

拥抱 Docker 的卷系统可能比试图强制图像为您执行此操作更好。考虑你可以用外部数据启动一个容器,停止并删除它,然后基于相同的数据启动一个新的容器;如果您在两者之间保存基础数据文件的副本,数据库将不会知道您正在从快照重新启动它。

用 PostgreSQL 模拟这个,你可以这样做:

# Start a database container, pointing at local data
docker run \
  -d \
  --name postgres \
  -p 5432:5432 \
  -v "$PWD:pgdata:/var/lib/postgresql/data" \
  postgres:13
# Seed the database
PGHOST=localhost PGPORT=5432 ./seed-data.py
# Stop the database
docker stop postgres
docker rm postgres
# Save a copy of the database data
tar cvzf pgdata.tar.gz pgdata

然后每次你想运行一个测试,你可以解压这个保存的数据树

rm -rf pgdata
tar xzf pgdata.tar.gz
docker run \
  -d \
  --name postgres \
  -p 5432:5432 \
  -v "$PWD:pgdata:/var/lib/postgresql/data" \
  postgres:13
PGHOST=localhost PGPORT=5432 ./integration-test.py

有 300 GB 的数据,解压并写出 tar 文件仍然需要一些时间,但这至少是简单的,只依赖于普通工具。


推荐阅读