Ответ 1
Чтобы построить ответ irakli, здесь обновленное решение:
- использовать новую версию 2 Docker Compose file
- раздел
volumes
- удалены дополнительные настройки.
докер-compose.yml
version: '2'
services:
postgres9:
image: postgres:9.4
expose:
- 5432
volumes:
- data:/var/lib/postgresql/data
volumes:
data: {}
демо
Запустите сервер базы данных Postgres:
$ docker-compose up
Показать все таблицы в базе данных. В другом терминале поговорите с контейнером Postgres:
$ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c '\z'
Он ничего не покажет, так как база данных пустая. Создать таблицу:
$ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c 'create table beer()'
Список вновь созданной таблицы:
$ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c '\z'
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+-----------+-------+-------------------+--------------------------
public | beer | table | |
Ура! Теперь мы запустили базу данных Postgres, используя общий том хранилища, и сохранили некоторые данные в нем. Следующим шагом является проверка того, что данные фактически склеиваются после остановки сервера.
Теперь уничтожьте контейнер сервера Postgres:
$ docker-compose stop
Запустите контейнер Postgres снова:
$ docker-compose up
Мы ожидаем, что сервер базы данных будет повторно использовать хранилище, поэтому наши очень важные данные все еще существуют. Проверьте:
$ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c '\z'
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+-----------+-------+-------------------+--------------------------
public | beer | table | |
Мы успешно использовали файл Docker Compose нового стиля для запуска базы данных Postgres с использованием внешнего тома данных и проверили, что он сохраняет наши данные в безопасности и звуке.
сохранение данных
Сначала сделайте резервную копию, сохранив наши данные на хосте:
$ docker exec -it $(docker-compose ps -q postgres9 ) pg_dump -Upostgres > backup.sql
Замените наши данные из гостевой базы данных:
$ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c 'drop table beer'
Восстановите нашу резервную копию (хранящуюся на узле) в контейнере Postgres.
Примечание: используйте "exec -i", а не "-it", иначе вы получите сообщение "входное устройство не является TTY".
$ docker exec -i $(docker-compose ps -q postgres9 ) psql -Upostgres < backup.sql
Перечислите таблицы для проверки выполненного восстановления:
$ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c '\z'
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+-----------+-------+-------------------+--------------------------
public | beer | table | |
Подводя итог, мы проверили, что мы можем запустить базу данных, данные сохраняются после перезапуска, и мы можем восстановить резервную копию в ней с хоста.
Спасибо Томаш!