#docker
#docker
Вопрос:
Я хотел бы получить снимок из базы данных объемом 300 ГБ, провести с ним некоторое тестирование, пока база данных больше не будет находиться в тестируемом состоянии, а затем «сбросить» базу данных в состояние моментального снимка и снова протестировать.
Docker кажется подходящим для этого, но все, что я могу найти, это как настроить пустую базу данных с помощью sql server.
Возможно ли создать образ docker с установленным sqlserver и существующей базой данных объемом 300 ГБ внутри образа? А затем снова потяните изображение, чтобы сбросить данные?
Ответ №1:
Теоретически, да. На практике вы столкнетесь с двумя большими проблемами:
- Все стандартные образы базы данных 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, но это, по крайней мере, просто и зависит только от обычных инструментов.