it-swarm-pt.com

Como devo fazer backup e restaurar os volumes denominados do docker

Estou um pouco confuso com a funcionalidade de volumes nomeados em um arquivo de composição do Docker especificamente quando se trata de backup/restauração do meu aplicativo. 

Eu estou realmente testando este arquivo dockercompose: 

      version: '2'
      services:
          Django:
              build: 
                  context: "{{ build_dir }}/docker/Django"
              depends_on:
                  - db
              environment:
                  [...]
              volumes:
                  - code:/data/code
                  - www:/var/www
                  - conf:/data/conf
              networks:
                  - front
                  - db
              expose:
                  - "8080"
              entrypoint: "/init"
          db:
              build:
                  context: "{{ build_dir }}/docker/postgres" 
              environment:
                  [...]
              volumes:
                  - data:/var/lib/postgresql/data
              networks:
                  - db

      volumes:
          data:
          www:
          code:
          conf:

      networks:
          front:
              external:
                  name: "proxy_nw"

Como a documentação dizia, tentei usar o volume nomeado em vez do container somente de dados. Mas como devo fazer backup dos meus dados? 

Com um contêiner somente de dados, eu teria feito um docker run --rm --volume-from DOC backup_container save que é realmente fácil. 

Agora eu li neste tópico que eu deveria usar algo como docker run --rm --volume data --volume www --volume code --volume conf backup_container save. Isso não é tão simples porque tenho muitos aplicativos com diferentes tipos e nomes de volumes, o que significa que meu comando para salvar meus dados teria que ser diferente para cada aplicativo. Isso complica o processo de automação.

Edit: Na verdade, esta sintaxe docker run --volume data --volume www container_image my_command não está correta. Ele precisa do ponto de montagem dentro do contêiner, então seria docker run --volume data:/somewhere --volume www:/somewhereelse container_image my_command. Então, é ainda mais complicado usar um contêiner de backup. 

Então, quais são as melhores práticas neste caso? Devo usar apenas um volume nomeado para todos os meus contêineres?

18
Plup

Na verdade, deve ser feito da mesma forma como está escrito na documentação oficial. O contêiner de volume de dados armazena seus dados em "raiz virtual", portanto, você deve fazer backup com o próximo comando:

docker run --rm \ 
  --volume [DOCKER_COMPOSE_PREFIX]_[VOLUME_NAME]:/[TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA] \
  --volume $(pwd):/[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE] \
  ubuntu \
  tar cvf /[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE]/[BACKUP_FILENAME].tar /[TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA]

onde:

  • --rm significa que a imagem criada para este comando de execução será limpa
  • DOCKER_COMPOSE_PREFIX no padrão é o nome do diretório do projeto
  • VOLUME_NAME é o nome do contêiner de volume de dados do arquivo de composição
  • TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA é um diretório para montar seus dados de volume
  • TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE é um diretório virtualmente mapeado para o seu diretório atual, onde o backup será feito
  • BACKUP_FILENAME - um nome de arquivo de backup (você o encontra no diretório atual)
  • ubuntu - você pode alterar o tipo de imagem para outro container com tar :)

Recupere os dados no volume (restauração):

docker run --rm \ 
  --volume [DOCKER_COMPOSE_PREFIX]_[VOLUME_NAME]:/[TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP] \
  --volume $(pwd):/[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE] \
  ubuntu \
  tar xvf /[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE]/[BACKUP_FILENAME].tar -C /[TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP] --strip 1

onde:

  • TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP é um diretório para onde os arquivos extraídos serão copiados (isso está vinculado ao volume e, portanto, será gravado nele)
  • -C - tell tar onde extrair o conteúdo
  • --strip 1 - remove os elementos do caminho inicial (por exemplo, o diretório pai, se o conteúdo do backup estiver localizado em uma pasta/temp ou similar)
35
Aleksey Rembish

Eu finalmente mudei minha abordagem. Eu analiso os volumes de meus contêineres procurando os pontos de montagem e faço backup de tudo em uma pasta separada no tar. 

Então, não estou usando um contêiner para fazer isso, mas sim um script externo. Não sei se é uma abordagem melhor, mas funciona bem. 

0
Plup