как сделать резервную копию базы данных в докере
Я запускаю свое приложение, используя docker-compose с нижним yml файлом
postgres:
container_name: postgres
image: postgres:${POSTGRES_VERSION}
volumes:
- postgresdata:/var/lib/postgresql/data
expose:
- "5432"
environment:
- POSTGRES_DB=42EXP
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
node:
container_name: node
links:
- postgres:postgres
depends_on:
- postgres
volumes:
postgresdata:
Как вы можете видеть здесь, я использую named volume
для управления состоянием postgres.
Согласно официальным документам, я могу сделать резервную копию тома, как показано ниже
docker run --rm --volumes postgresdata:/var/lib/postgresql/data -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
В некоторых других руководствах я предлагаю функцию pg-dump
предоставляемую postgres для резервного копирования.
pg_dump -Fc database_name_here > database.bak
Думаю, мне нужно будет зайти в контейнер postgres, чтобы выполнить эту функцию, и установить каталог резервного копирования на хост.
Является ли один подход лучше/предпочтительнее другого?
Ответы
Ответ 1
Для запуска pg_dump вы можете использовать команду docker exec
:
Для резервного копирования:
docker exec -u <your_postgres_user> <postgres_container_name> pg_dump -Fc <database_name_here> > db.dump
Чтобы удалить db (не делайте это только для производства, только для тестирования !!!):
docker exec -u <your_postgres_user> <postgres_container_name> psql -c 'DROP DATABASE <your_db_name>'
Восстановить:
docker exec -i -u <your_postgres_user> <postgres_container_name> pg_restore -c -d postgres < db.dump
Также вы можете использовать докеры -c ompose analog of exec. В этом случае вы можете использовать короткое имя службы (postgres) вместо полного имени контейнера (composeproject_postgres).
docker exec
докер -c ompose exec
pg_restore
Ответ 2
Я просто передаю контейнер, работающий с базой данных. Затем я нажимаю это новое изображение в свой частный реестр. Что бы ни случилось с приложением или базой данных, я всегда могу просто вытащить его из своего реестра и получить его в кратчайшие сроки.
docker commit [container-name] [domain:port/'new-image-name']
Затем после этого я нажимаю изображение в свой реестр.
docker push [new-image-name]
Если мне когда-либо понадобится восстановить эту базу данных, я просто вытащил ее из своего собственного реестра.
docker pull [domain:port/'new-image-name']
Так что просто уточнить, это: [domain: port/'new-image-name']
Будет выглядеть так: myregistrydomain.com:5000/dbSep
Ответ 3
Так как у вас есть
expose:
- "5432"
Вы можете запустить
pg_dump -U <user> -h localhost -Fc <db_name> > 1.dump
pg_dump подключится к порту 5432, чтобы сделать дамп, так как он lissensed postgres в контейнере, вы будете выгружать дб из контейнера