Я хотел бы получить снимок из базы данных объемом 300 ГБ, провести некоторое тестирование, пока база данных не перестанет быть в тестируемом состоянии, а затем «сбросить» базу данных до состояния моментального снимка и снова протестировать.
Docker кажется подходящим для этого, но все, что я могу найти, это как настроить пустую базу данных с сервером sql.
Можно ли создать образ докера с установленным sqlserver и существующей базой данных размером 300 ГБ внутри образа? А потом снова дернуть образ, чтобы сбросить данные?
Теоретически да. На практике вы столкнетесь с двумя большими проблемами:
Все стандартные образы баз данных Docker Hub настроены таким образом, что их данные всегда находятся в томе. Это означает, что вы не можете создать изображение на основе стандартных изображений с предварительно загруженными данными; вам придется создать свой собственный базовый образ базы данных.
Сетевой ввод-вывод Docker начинает работать неустойчиво с отдельными слоями, которые намного превышают 1 ГБ. Просто механика передачи 300-гигабайтного образа по сети будет хлопотной.
Есть также некоторые соображения в зависимости от того, как база данных внутренне хранит свои данные. Если есть один файл размером 300 ГБ, возможно, первая запись в него приведет к попытке скопировать его целиком. Это зависит от хранилища базы данных и низкоуровневых деталей ядра 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 ГБ данных все равно потребуется некоторое время для распаковки и записи tar-файла, но это, по крайней мере, просто и зависит только от обычных инструментов.