Para aproveitar a resposta de irakli, aqui está uma solução atualizada:
- usar o arquivo do Docker Compose da versão 2 mais recente
- separe
volumes
seção - configurações extras excluídas
docker-compose.yml
version: '2'
services:
postgres9:
image: postgres:9.4
expose:
- 5432
volumes:
- data:/var/lib/postgresql/data
volumes:
data: {}
demonstração
Inicie o servidor de banco de dados Postgres:
$ docker-compose up
Mostra todas as tabelas do banco de dados. Em outro terminal, fale com o Postgres do container:
$ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c '\z'
Não mostrará nada, pois o banco de dados está em branco. Crie uma tabela:
$ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c 'create table beer()'
Liste a tabela recém-criada:
$ 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 | |
Yay! Agora iniciamos um banco de dados Postgres usando um volume de armazenamento compartilhado e armazenamos alguns dados nele. O próximo passo é verificar se os dados realmente permanecem após o servidor parar.
Agora, mate o container do servidor Postgres:
$ docker-compose stop
Inicie o contêiner Postgres novamente:
$ docker-compose up
Esperamos que o servidor de banco de dados reutilize o armazenamento, portanto, nossos dados muito importantes ainda estão lá. Verificar:
$ 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 | |
Usamos com sucesso um arquivo Docker Compose de novo estilo para executar um banco de dados Postgres usando um volume de dados externo e verificamos se ele mantém nossos dados sãos e salvos.
armazenando dados
Primeiro, faça um backup, armazenando nossos dados no host:
$ docker exec -it $(docker-compose ps -q postgres9 ) pg_dump -Upostgres > backup.sql
Zap nossos dados do banco de dados de convidados:
$ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c 'drop table beer'
Restaure nosso backup (armazenado no host) no container Postgres.
Observação: use "exec -i", não "-it", caso contrário, você receberá um erro "dispositivo de entrada não é um TTY".
$ docker exec -i $(docker-compose ps -q postgres9 ) psql -Upostgres < backup.sql
Liste as tabelas para verificar se a restauração funcionou:
$ 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 | |
Para resumir, verificamos que podemos iniciar um banco de dados, os dados persistem após uma reinicialização e podemos restaurar um backup a partir do host.
Obrigado Tomasz!