Como as pessoas lidam com o armazenamento persistente dos seus contêineres do Docker?
Atualmente, estou usando esta abordagem: construa a imagem, por exemplo, para PostgreSQL e inicie o contêiner com
docker run --volumes-from c0dbc34fd631 -d app_name/postgres
IMHO, que tem a desvantagem, que eu nunca devo (por acidente) excluir o contêiner "c0dbc34fd631".
Outra idéia seria montar os volumes do host "-v" no contêiner, no entanto, o ID do usuário no contêiner não corresponde necessariamente ao ID do usuário do host e, em seguida, as permissões podem ser alteradas.
Nota: Em vez de --volumes-from 'cryptic_id'
você também pode usar --volumes-from my-data-container
onde my-data-container
está um nome que você atribuiu a um contêiner somente de dados, por exemplo docker run --name my-data-container ...
(veja a resposta aceita)
fonte
--name
. você tem-name
Respostas:
Docker 1.9.0 e superior
Usar API de volume
Isso significa que o padrão de contêiner somente de dados deve ser abandonado em favor dos novos volumes.
Na verdade, a API de volume é apenas uma maneira melhor de atingir o que era o padrão de contêiner de dados.
Se você criar um contêiner com um
-v volume_name:/container/fs/path
Docker, criará automaticamente um volume nomeado para você, que pode:docker volume ls
docker volume inspect volume_name
--volumes-from
conexãoA nova API de volume adiciona um comando útil que permite identificar volumes pendentes:
E depois remova-o pelo nome:
Como o @mpugach sublinha nos comentários, você pode se livrar de todos os volumes pendentes com um belo one-liner:
Docker 1.8.xe abaixo
A abordagem que parece funcionar melhor na produção é usar um contêiner apenas de dados .
O contêiner apenas de dados é executado em uma imagem de barebones e, na verdade, não faz nada, exceto expor um volume de dados.
Em seguida, você pode executar qualquer outro contêiner para ter acesso aos volumes do contêiner de dados:
Em este post não é uma boa descrição do chamado recipiente como padrão de volume que esclarece o principal ponto de ter dados somente recipientes .
A documentação do Docker agora tem a descrição DEFINITIVA do contêiner como padrão de volume / s .
A seguir, é apresentado o procedimento de backup / restauração do Docker 1.8.xe abaixo.
CÓPIA DE SEGURANÇA:
RESTAURAR:
Aqui está um bom artigo do excelente Brian Goff explicando por que é bom usar a mesma imagem para um contêiner e um contêiner de dados.
fonte
--volumes-from
permite compartilhar espaço em disco,--link
compartilhar serviços.docker volume create --name mydata
) é preferível a um contêiner de volume de dados. O pessoal do Docker sugere que os Data Volume Containers “ não são mais considerados um padrão recomendado ”, “os volumes nomeados devem poder substituir os volumes somente de dados na maioria dos casos (se não todos) ” e “ não há razão para usar. contêineres somente para dados ".No Docker versão v1.0 , a ligação de uma montagem de um arquivo ou diretório na máquina host pode ser feita pelo comando fornecido:
O volume acima pode ser usado como armazenamento persistente no host executando o Docker.
fonte
A partir do Docker Compose 1.6, agora há suporte aprimorado para volumes de dados no Docker Compose. O seguinte arquivo de composição criará uma imagem de dados que persistirá entre as reinicializações (ou mesmo a remoção) dos contêineres pai:
Aqui está o anúncio do blog: Componha 1.6: Novo arquivo de composição para definir redes e volumes
Aqui está um exemplo de arquivo de composição:
Tanto quanto posso entender: Isso criará um contêiner de volume de dados (
db_data
) que persistirá entre as reinicializações.Se você executar:
docker volume ls
deverá ver seu volume listado:Você pode obter mais alguns detalhes sobre o volume de dados:
Alguns testes:
Notas:
Você também pode especificar vários drivers no
volumes
bloco. Por exemplo, você pode especificar o driver do Flocker para db_data:Isenção de responsabilidade: essa abordagem é promissora e estou sendo usada com sucesso em um ambiente de desenvolvimento. Eu ficaria apreensivo em usar isso na produção ainda!
fonte
Caso não esteja claro na atualização 5 da resposta selecionada, a partir do Docker 1.9, você poderá criar volumes que possam existir sem estar associado a um contêiner específico, tornando obsoleto o padrão "contêiner somente de dados".
Consulte Contêineres somente de dados obsoletos com o docker 1.9.0? # 17798 .
Eu acho que os mantenedores do Docker perceberam que o padrão de contêiner somente de dados era um cheiro de design e decidiram tornar os volumes uma entidade separada que pode existir sem um contêiner associado.
fonte
Enquanto isso ainda faz parte do Docker que precisa de algum trabalho , você deve colocar o volume no Dockerfile com a instrução VOLUME para não precisar copiar os volumes de outro contêiner.
Isso tornará seus contêineres menos interdependentes e você não precisará se preocupar com a exclusão de um contêiner que afeta outro.
fonte
docker rm
)Ao usar o Docker Compose , basta anexar um volume nomeado, por exemplo:
fonte
A resposta do @ tommasop é boa e explica algumas das mecânicas do uso de contêineres somente de dados. Mas como alguém que inicialmente pensou que os contêineres de dados eram tolos quando se podia ligar um monte ao volume (como sugerido por várias outras respostas), mas agora percebe que, de fato, os contêineres somente de dados são muito legais, posso sugerir o meu próprio postagem no blog sobre este tópico: Por que os Docker Data Containers (Volumes!) são bons
Consulte também: minha resposta à pergunta " Qual é a (melhor) maneira de gerenciar permissões para volumes compartilhados do Docker? " Para obter um exemplo de como usar contêineres de dados para evitar problemas como permissões e mapeamento uid / gid com o host.
Para resolver uma das preocupações originais do OP: que o contêiner de dados não deve ser excluído. Mesmo que o contêiner de dados seja excluído, os dados em si não serão perdidos enquanto qualquer contêiner tiver uma referência a esse volume, ou seja, qualquer contêiner que montou o volume
--volumes-from
. Portanto, a menos que todos os contêineres relacionados sejam parados e excluídos (pode-se considerar isso o equivalente a um acidenterm -fr /
), os dados estão seguros. Você sempre pode recriar o contêiner de dados executando--volumes-from
qualquer contêiner que tenha uma referência a esse volume.Como sempre, faça backups!
ATUALIZAÇÃO: O Docker agora possui volumes que podem ser gerenciados independentemente de contêineres, o que facilita ainda mais o gerenciamento.
fonte
Existem vários níveis de gerenciamento de dados persistentes, dependendo de suas necessidades:
-v host-path:container-path
para manter os dados do diretório de contêiner em um diretório de host.--volumes-from
para montar esses dados no contêiner do aplicativo.fonte
Se você deseja mover seus volumes, também deve consultar o Flocker .
No README:
fonte
Depende do seu cenário (isso não é realmente adequado para um ambiente de produção), mas aqui está uma maneira:
Criando um container MySQL Docker
Esta essência é usar um diretório em seu host para persistência de dados.
fonte
Recentemente, escrevi sobre uma solução em potencial e um aplicativo que demonstra a técnica. Acho que é bastante eficiente durante o desenvolvimento e a produção. Espero que ajude ou acenda algumas idéias.
Repo: https://github.com/LevInteractive/docker-nodejs-example
Article: http://lev-interactive.com/2015/03/30/docker-load-balanced-mongodb-persistence/
fonte
Estou apenas usando um diretório predefinido no host para manter os dados do PostgreSQL. Além disso, é possível migrar facilmente as instalações existentes do PostgreSQL para contêineres do Docker: https://crondev.com/persistent-postgresql-inside-docker/
fonte
Minha solução é usar o novo
docker cp
, que agora pode copiar dados de contêineres, não importa se está em execução ou não, e compartilhar um volume de host no mesmo local exato em que o aplicativo de banco de dados está criando seus arquivos de banco de dados dentro do contêiner . Essa solução dupla funciona sem um contêiner somente de dados, diretamente do contêiner do banco de dados original.Portanto, meu script systemd init está executando o trabalho de fazer backup do banco de dados em um arquivo no host. Coloquei um carimbo de data / hora no nome do arquivo para nunca reescrever um arquivo.
Está fazendo isso no ExecStartPre:
E está fazendo a mesma coisa no ExecStopPost também:
Além disso, expus uma pasta do host como um volume ao mesmo local exato em que o banco de dados está armazenado:
Funciona muito bem na minha VM (eu construo uma pilha LEMP para mim): https://github.com/DJviolin/LEMP
Mas eu simplesmente não sei se é uma solução "à prova de balas" quando sua vida depende dela (por exemplo, loja virtual com transações em possíveis milissegundos)?
Aos 20 minutos e 20 segundos deste vídeo oficial do Docker, o apresentador faz o mesmo com o banco de dados:
Introdução ao Docker
fonte
Use a Reivindicação de volume persistente (PVC) do Kubernetes, que é uma ferramenta de gerenciamento e agendamento de contêineres do Docker:
Volumes Persistentes
As vantagens de usar o Kubernetes para essa finalidade são as seguintes:
fonte