Eu tenho usado este tutum / wordpress do Docker-image para demonstrar um site do Wordpress. Recentemente, descobri que a imagem usa volumes para os dados do MySQL.
Portanto, o problema é o seguinte: Se eu quiser fazer backup e restaurar o contêiner, posso tentar confirmar uma imagem, depois excluir o contêiner e criar um novo contêiner a partir da imagem confirmada. Mas se eu fizer isso, o volume será excluído e todos os meus dados desaparecerão.
Deve haver uma maneira simples de fazer backup do meu contêiner, além dos dados de volume, mas não consigo encontrá-lo em nenhum lugar.
backup
docker
linux-containers
pguardiario
fonte
fonte
Respostas:
Como o manual do usuário do docker explica, os volumes de dados devem persistir dados fora de um sistema de arquivos de contêiner. Isso também facilita o compartilhamento de dados entre vários contêineres.
Embora o Docker nunca exclua dados em volumes (a menos que você exclua o contêiner associado
docker rm -v
), os volumes que não são referenciados por nenhum contêiner do Docker são chamados de volumes pendentes . Esses volumes pendentes são difíceis de se livrar e de acessar.Isso significa que, assim que o último contêiner usando um volume é excluído, o volume de dados fica oscilando e seu conteúdo fica difícil de acessar.
Para evitar esses volumes pendentes, o truque é criar um contêiner de docker adicional usando o volume de dados que você deseja permanecer; para que sempre haja pelo menos esse contêiner de docker que faça referência ao volume. Dessa forma, você pode excluir o contêiner do docker executando o aplicativo wordpress sem perder a facilidade de acesso ao conteúdo do volume de dados.
Esses contêineres são chamados de contêineres de volume de dados .
imagens da janela de encaixe
Para fazer backup de imagens do docker, use o comando docker save, que produzirá um arquivo tar que poderá ser usado posteriormente para criar uma nova imagem do docker com o comando docker load .
contêineres de docker de backup
Você pode fazer backup de um contêiner de docker de diferentes maneiras
Esteja ciente de que esses comandos farão backup apenas do sistema de arquivos em camadas do contêiner do docker. Isso exclui os volumes de dados .
volumes de dados da janela de encaixe de backup
Para fazer backup de um volume de dados, é possível executar um novo contêiner usando o volume que você deseja fazer backup e executar o comando tar para produzir um archive do conteúdo do volume, conforme descrito no guia do usuário da janela de encaixe .
No seu caso particular, o volume de dados é usado para armazenar os dados para um servidor MySQL. Portanto, se você deseja exportar um arquivo tar para este volume, será necessário parar o servidor MySQL primeiro. Para fazer isso, você terá que parar o contêiner do wordpress.
faça backup dos dados do MySQL
Uma outra maneira é conectar-se remotamente ao servidor MySQL para produzir um despejo de banco de dados com o comando mysqldump . Entretanto, para que isso funcione, seu servidor MySQL deve estar configurado para aceitar conexões remotas e também ter um usuário com permissão para se conectar remotamente. Pode não ser o caso da imagem do docker wordpress que você está usando.
Editar
O Docker apresentou recentemente os plugins de volume do Docker que permitem delegar a manipulação de volumes aos plug-ins implementados pelos fornecedores.
O
docker run
comando tem um novo comportamento para a-v
opção. Agora é possível passar para ele um nome de volume . Os volumes criados dessa maneira são nomeados e fáceis de referenciar posteriormente, facilitando os problemas com volumes pendentes .Editar 2
O Docker introduziu o
docker volume prune
comando para excluir todos os volumes pendentes facilmente.fonte
Data volumes are designed to persist data, independent of the container’s life cycle. Docker therefore never automatically delete volumes when you remove a container, nor will it “garbage collect” volumes that are no longer referenced by a container.
assim os dados são apenas recipientes legadomysqldump
. Apenas descasque no recipiente, despeje-o e copie-o comdocker cp
.data only container obsolete?
Nem um pouco. O contêiner somente de dados fornece um contêiner paradocker exec data-container tar -czf snapshot.tgz /data
entãodocker cp data-container:snapshot.tgz ./snapshot.tgz
e similares. Se você deseja que o contêiner tenha vida longa, faça com que seu comando pareçatail -f /dev/null
que nunca sai, usando recursos mínimos.ATUALIZAÇÃO 2
Script de bash de backup de volume único bruto:
Script de bash de restauração de volume único bruto:
O uso pode ser assim:
As premissas são: o arquivo de backup é denominado backup.tar, reside no mesmo diretório do script de backup e restauração, o nome do volume é o mesmo entre os contêineres.
ATUALIZAR
Parece-me que fazer backup de volumes de contêineres não é diferente de fazer backup de volumes de contêineres de dados.
Os volumes nada mais são do que caminhos vinculados a um contêiner, portanto, o processo é o mesmo.
Não sei se o docker-backup também funciona para os mesmos volumes de contêiner, mas você pode usar:
e:
FIM DE ATUALIZAÇÃO
Existe uma boa ferramenta disponível que permite fazer backup e restaurar contêineres de volumes de docker:
https://github.com/discordianfish/docker-backup
se você tiver um contêiner vinculado a alguns volumes de contêineres como este:
você pode fazer backup de todos os volumes como este:
e restaure assim:
Ou você pode seguir o caminho oficial:
Como portar volumes somente de dados de um host para outro?
fonte
unknown shorthand flag: 'r' in -rm.
deveria ser--rm
? (Versão do Docker 18.09.5, compilação e8ff056)Se você só precisar fazer backup de volumes montados, poderá copiar pastas do Dockerhost .
No Ubuntu
Você pode encontrar todas as pastas com volumes aqui:
/var/lib/docker/volumes/
para copiá-las e arquivar onde quiser.No MAC
Não é tão fácil quanto no Ubuntu. Você precisa copiar arquivos da VM.
Aqui está um script de como copiar todas as pastas com volumes da máquina virtual (onde o servidor Docker está sendo executado) para a sua máquina local. Assumimos que sua VM da máquina de encaixe denominada padrão .
Ele criará uma pasta ./backup_volumes em seu diretório atual e copiará todos os volumes para essa pasta.
Aqui está um script de como copiar todos os volumes salvos do diretório local ( ./backup_volumes ) na máquina Dockerhost
Agora você pode verificar se funciona por:
fonte
/var/lib/docker/volumes
no Ubuntu?Digamos que seu nome de volume seja
data_volume
. Você pode usar os seguintes comandos para fazer backup e restaurar o volume de e para uma imagem da janela de encaixe denominadadata_image
:Para fazer backup:
Restaurar:
fonte
Sei que isso é antigo, mas percebo que não há uma solução bem documentada para enviar um contêiner de dados (como backup) ao hub do docker. Acabei de publicar um pequeno exemplo de como fazê-lo em https://dzone.com/articles/docker-backup-your-data-volumes-to-docker-hub
A seguir, a linha inferior
O tutorial do docker sugere que você pode fazer backup e restaurar o volume de dados localmente. Vamos usar essa técnica; adicione mais algumas linhas para que esse backup seja enviado ao hub do docker para facilitar a futura restauração em qualquer local que desejemos. Então vamos começar. Estes são os passos a seguir:
Faça backup do volume de dados do contêiner de dados denominado data-container-to-backup
Expanda esse arquivo tar para um novo contêiner para que possamos enviá-lo como parte de sua imagem
Confirme e envie a imagem com a tag desejada ($ VERSION)
Finalmente, vamos limpar
Agora, temos uma imagem chamada backup de dados em nosso repositório que é simplesmente um sistema de arquivos com os arquivos e pastas de backup. Para usar esta imagem (também conhecida como restauração do backup), fazemos o seguinte:
Execute o contêiner de dados com a imagem de backup de dados
Execute sua imagem whatEver com volumes do contêiner de dados
É isso aí.
Fiquei surpreso por não haver documentação para esse trabalho. Espero que alguém ache isso útil. Eu sei que demorei um tempo para pensar sobre isso.
fonte
Se o seu projeto usa docker-compose, aqui está uma abordagem para fazer backup e restaurar seus volumes.
docker-compose.yml
Basicamente, você adiciona
db-backup
edb-restore
presta serviços de manutenção ao seu arquivo docker-compose.yml e adapta-o ao nome do seu volume. Meu volume é nomeadodbdata
neste exemplo.Evite a corrupção
Para obter consistência dos dados, pare o contêiner db antes de fazer backup ou restaurar
Fazendo backup
Para fazer backup no destino padrão (
backup/dbdata.tar.bz2
):Ou, se você desejar especificar um nome de destino alternativo, faça:
Restaurando
Para restaurar de
backup/dbdata.tar.bz2
, faça:Ou restaure a partir de um arquivo específico usando:
Adaptei os comandos de https://loomchild.net/2017/03/26/backup-restore-docker-named-volumes/ para criar essa abordagem.
fonte
O comando a seguir executará o tar em um contêiner com todos os volumes de dados nomeados montados e redirecionará a saída para um arquivo:
Certifique-se de testar o arquivo resultante, caso algo dê errado:
fonte
Se você precisar apenas de um backup simples de um arquivo, tente o meu pequeno utilitário: https://github.com/loomchild/volume-backup
Exemplo
Cópia de segurança:
arquivará o volume nomeado
some_volume
para/tmp/archive1.tar.bz2
arquivar o arquivoRestaurar:
vai limpar e restaurar o volume chamado
some_volume
de/tmp/archive1.tar.bz2
arquivo.Mais informações: https://medium.com/@loomchild/backup-restore-docker-named-volumes-350397b8e362
fonte
Eu criei uma ferramenta para orquestrar e iniciar o backup de contêineres de dados e mysql, simplesmente chamado de docker-backup . Existe até uma imagem pronta para uso no hub do docker .
É escrito principalmente em Bash, pois é principalmente orquestração. Ele é usado
duplicity
para o mecanismo de backup real. No momento, você pode fazer backup no FTP (S) e Amazon S3.A configuração é bastante simples: escreva um arquivo de configuração no YAML descrevendo o que fazer backup e onde, e aqui está!
Para contêineres de dados, ele monta automaticamente os volumes compartilhados pelo seu contêiner para fazer backup e processá-lo. Para contêineres mysql, ele os vincula e executa um mysqldump empacotado com seu contêiner e processa o resultado.
Eu o escrevi porque uso o Docker-Cloud, que não está atualizado com as versões recentes do mecanismo do docker e porque queria adotar o caminho do Docker, não incluindo nenhum processo de backup nos contêineres dos aplicativos.
fonte
Se você deseja um backup completo, precisará executar algumas etapas:
Observe que fazer apenas uma confirmação do Docker do contêiner em uma imagem NÃO inclui volumes anexados ao contêiner (ref: documentação de confirmação do Docker ).
" A operação de confirmação não incluirá nenhum dado contido nos volumes montados dentro do contêiner. "
fonte
Se você gosta de inserir operadores misteriosos na linha de comando, vai adorar essas técnicas manuais de backup de contêiner. Lembre-se de que existe uma maneira mais rápida e eficiente de fazer backup de contêineres com a mesma eficácia. Eu escrevi instruções aqui: https://www.morpheusdata.com/blog/2017-03-02-how-to-create-a-docker-backup-with-morpheus
Etapa 1: adicionar um host do Docker a qualquer nuvem Como explicado em um tutorial no site de suporte do Morpheus, você pode adicionar um host do Docker à nuvem de sua escolha em questão de segundos. Comece escolhendo Infraestrutura na barra de navegação principal do Morpheus. Selecione Hosts na parte superior da janela Infraestrutura e clique no botão "+ Container Hosts" no canto superior direito.
Para fazer backup de um host do Docker em uma nuvem via Morpheus, navegue até a tela Infraestrutura e abra o menu "+ Hosts de contêiner".
Escolha um tipo de host de contêiner no menu, selecione um grupo e insira os dados nos cinco campos: Nome, Descrição, Visibilidade, Selecione uma Nuvem e Digite Tags (opcional). Clique em Avançar e, em seguida, configure as opções do host escolhendo um plano de serviço. Observe que os campos Volume, Memória e Contagem de CPU estarão visíveis apenas se o plano que você selecionar tiver opções personalizadas ativadas.
Aqui é onde você adiciona e dimensiona volumes, define o tamanho da memória e a contagem de CPU e escolhe uma rede. Você também pode configurar o nome de usuário e a senha do SO, o nome de domínio e o nome do host, que por padrão é o nome do contêiner que você inseriu anteriormente. Clique em Avançar e adicione quaisquer fluxos de trabalho de automação (opcional). Por fim, revise suas configurações e clique em Concluir para salvá-las.
Etapa 2: Adicionar a integração do registro do Docker às nuvens públicas ou privadas Adam Hicks descreve em outro tutorial do Morpheus como é simples integrar-se a um registro do Docker privado. (Nenhuma configuração adicional é necessária para usar o Morpheus para provisionar imagens com o hub público do Docker usando a API pública do Docker.)
Selecione Integrações na guia Administrador da barra de navegação principal e, em seguida, escolha o botão "+ Nova integração" no lado direito da tela. Na janela Integração exibida, selecione Repositório do Docker no menu suspenso Tipo, digite um nome e adicione o terminal da API do registro privado. Forneça um nome de usuário e senha para o registro que você está usando e clique no botão Salvar alterações.
Integre um Docker Registry a uma nuvem privada por meio da caixa de diálogo Morpheus "New Integration".
Para provisionar a integração que você acabou de criar, escolha Docker em Tipo na caixa de diálogo Criar instância, selecione o registro no menu suspenso Registro do Docker na guia Configurar e continue o provisionamento como faria com qualquer contêiner do Docker.
Etapa 3: gerenciar backups Depois de adicionar o host do Docker e integrar o registro, um backup será configurado e executado automaticamente para cada instância que você provisionar. O suporte ao Morpheus fornece instruções para visualizar backups, criar um backup de instância e criar um backup do servidor.
fonte
Se você tem um caso tão simples quanto o meu, pode fazer o seguinte:
ADD folder destination
Por exemplo, supondo que você possua os dados dos volumes no diretório inicial, por exemplo,
/home/mydata
você pode executar o seguinte:Onde seu DOCKERFILE aponta para um arquivo como este:
O restante do material é herdado da imagem base. Agora você pode enviar essa imagem para a docker cloud e seus usuários terão os dados disponíveis diretamente em seus contêineres
fonte
docker cp
.O problema : você deseja fazer backup do contêiner de imagem COM os volumes de dados, mas essa opção não está pronta para uso, a maneira mais direta e trivial seria copiar o caminho dos volumes e fazer backup da imagem do docker 'recarregue-a e vincule-a ambos juntos. mas essa solução parece ser desajeitada e não sustentável e sustentável - Você precisaria criar um trabalho cron que faria esse fluxo cada vez.
Solução : Usando o dockup - imagem do Docker para fazer backup dos volumes do contêiner do Docker e carregá-lo no s3 (Docker + Backup = dockup). O dockup usará suas credenciais da AWS para criar um novo bucket com o nome de acordo com a variável de ambiente, obtém os volumes configurados e será compactado, compactado com zíper, com registro de data e hora e carregado no bucket S3.
Passos :
docker-compose.yml
e anexe oenv.txt
arquivo de configuração a ele. Os dados devem ser carregados em um bucket s3 seguro dedicado e prontos para serem recarregados em execuções DRP. para verificar qual caminho de volumes configurar, executedocker inspect <service-name>
e localize os volumes :Edite o conteúdo do arquivo de configuração
env.txt
e coloque-o no caminho do projeto:Execute o contêiner de encaixe
fonte
Esta é uma maneira de backup de pasta de volume.
Se você tiver um registro do docker infra, esse método é muito útil.
Isso usa o Docker Registry para mover o arquivo zip facilmente.
Em outro servidor
Execute sua imagem que usa essa pasta de volume.
Você pode criar uma imagem que contenha uma imagem de execução e um arquivo zip de volume facilmente.
Mas não recomendo por vários motivos (tamanho da imagem, comando de entrada, ..).
fonte