Actualizar uma aplicação Docker sem perder dados

Actualizar uma aplicação em Docker é, em regra, descarregar a imagem nova e recriar o contentor. Os dados sobrevivem se estiverem num volume, e é aí que se ganha ou se perde tudo: o contentor é descartável, o volume não. Com uma cópia feita antes e uma versão fixada, actualizar é um procedimento calmo e que se desfaz. Este artigo supõe um VPS com o Docker e um projecto em Compose (exemplo).

O procedimento

1 Leia as notas da versão nova. O projecto publica o que mudou e o que obriga a passos extra (migrações, variáveis renomeadas). Saltar de várias versões de uma vez é onde costumam surgir problemas.
2 Faça a cópia da base de dados: docker compose exec -T db pg_dump -U appuser appdb > copia.sqlO -T é necessário para o > não receber lixo de um terminal. Para MariaDB ou MySQL, o equivalente é o mysqldump. Veja cópias e restauro.
3 Guarde também o ficheiro de configuração e o .env num sítio fora do servidor. A cópia de um volume e a do VPS inteiro estão em cópias de um VPS.
4 Fixe a versão que vai usar no ficheiro (image: nome:1.2.3 em vez de :latest). Assim sabe exactamente o que instalou e pode voltar atrás.
5 Descarregue e recrie: docker compose pull
docker compose up -d
O Compose só recria os serviços cuja imagem mudou. Os volumes mantêm-se.
6 Veja os registos e confira que a aplicação arrancou e que as migrações correram: docker compose logs -f --tail=100. Abra a aplicação e experimente uma operação real.
7 Limpe as imagens antigas só quando estiver satisfeito: docker image prune. Enquanto não limpar, voltar à versão anterior é só mudar o número e repetir o passo 5.

O que apaga dados e o que não apaga

Comando O que faz Os dados?
docker compose pull + up -d Descarrega imagens e recria os contentores que mudaram. Ficam, se estiverem em volumes.
docker compose down Para e remove os contentores e a rede. Ficam. Os volumes não são tocados.
docker compose down -v Faz o mesmo e remove também os volumes. Perdem-se.
docker volume prune e docker system prune --volumes Removem volumes que nenhum contentor está a usar (conforme a versão e as opções, só os anónimos ou também os com nome). Perdem-se, se os contentores estiverem parados ou removidos.
Ficheiros escritos fora de um volume Vivem na camada do contentor. Perdem-se quando o contentor é recriado.
Um volume «sem uso» é um volume sem contentor a correr. Depois de um docker compose down, o volume da sua base de dados não tem nenhum contentor ligado, e um prune feito nessa altura pode levá-lo. Antes de qualquer prune com volumes, veja a lista com docker volume ls e tenha cópia. Fora disso, não use --volumes.
A versão principal de uma base de dados não se muda mudando o número. Passar, por exemplo, de uma versão principal do PostgreSQL para a seguinte pede uma cópia (pg_dump) e uma restauração para um volume novo. Para actualizações menores dentro da mesma versão principal, o procedimento acima chega.
Ensaie com uma cópia. Se a aplicação é importante, restaure a cópia numa pasta nova com outro nome de projecto, actualize lá, e só depois toque no que está no ar. E repare: actualizar o Docker e a aplicação é seu, num VPS não gerido: até onde vai o nosso suporte.

Algo correu mal na actualização e o servidor deixou de responder? Se é o VPS, a rede ou o acesso, trata-se connosco; diga-nos o que viu.

Abrir um pedido de suporte

VEJA TAMBÉM

Cópias com mysqldump e pg_dump, e restaurar a cópia

Cópias de um VPS: instantâneos ou ficheiros

O Docker a encher o disco: imagens, volumes e registos

PRODUTO RECOMENDADO

Alojamento de sites com cPanel

Domínio e SSL incluídos, cópias diárias e o painel que já conhece. desde 5.940,00 Kz/mês (plano de 3 anos, com cupão)

Ver planos
  • 0 Utilizadores acharam útil
Esta resposta foi útil?