Criando volumes com Docker

(Last Updated On: 19 de julho de 2018)

Estou estudando Docker. Por isso, subi dois containers, um com uma aplicação construída em Java e outro com o banco de dados MySQL. Subi os dois containers e salvei alguns dados no banco, no outro dia, quando subi a aplicação de novo, percebi que os dados do banco tinham sumido.

Toda a vez que um container é removido, ele perde todas as suas informações, isto é, tudo que estava salvo no container é deletado, o que faz sentido já que, pensando em escalabilidade, um container pode ser, quando necessário, tanto criado ou excluído.

Contudo existem algumas informações que não devemos perder, os dados do banco são exemplo, neste caso, essa era uma aplicação de teste, mas e se estivesse em produção?

O usuário poderia acessar a aplicação um dia e notar que todos os dados sumiram. Já pensou ter que realizar todos os cadastros de novo, sem falar de informações, como dados de vendas, que seriam perdidos.

Será que existe alguma forma de salvar os dados de um container?

Criando nosso volume

Nós queremos criar uma cópia dos dados que estão no container para a nossa máquina. Caso o container venha a cair ou seja removido, podemos falar para ele onde está os dados. Dessa forma, nossas informações ficam salvas independente do estado do container.

Ou seja, queremos falar para o Docker criar um repositório de dados para os containers, ou, como é chamado volume.

Vamos falar para o docker que queremos criar um volume volume create chamado dados-do-banco, no meu caso:

docker volume create dados-do-banco

Aparentemente deu tudo certo, mas como podemos saber quais são nossos volumes? Bem, podemos falar para o docker listá-los (ls):

docker volume ls

Neste comando o Docker nos mostra qual o nome do volume e o seu driver. Isto é, qual é a forma que ele deve montar o volume. No meu caso, este é o driver local, o driver padrão (built-in) do Docker.

Bacana, já temos um volume criado, mas como podemos atribuí-lo a um container?

Referenciando um volume

Já temos o nosso volume criado, então, vamos falar para o docker rodar um container container run, chamado db (--name db), no meu caso, com o nosso volume (-v) dados-do-banco associado ao diretório do container que guarda as informações que desejamos salvar, /var/lib/mysql, neste caso:

docker container run --name db -v dados-do-banco:/var/lib/mysql

Dessa forma, estamos falando para o Docker criar um container e associar o diretório /var/lib/mysql ao volume dados-do-banco. Nossa aplicação precisa de uma senha para se logar no banco de dados, então vamos falar que este container, em seu ambiente (-e, environment), terá a senha alura:

docker container run --name db -v dados-do-banco:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=alura

Legal, agora basta falarmos qual é a imagem que criará nosso container, no nosso caso, é a imagem do MySQL:

docker container run --name db -v dados-do-banco:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=alura mysql

Legal nosso container está rodando, vamos fazer alguns testes para testar nosso volume. Em uma outra aba no terminal, vamos falar para o docker que queremos executar alguns comandos em um container (container exec) com um terminal interativo (-ti) no nosso container bd com o interpretador /bin/bash:

docker container exec -it db /bin/bash

Vamos logar no mysql com o usuário (-u) root e com a senha -p alura:

Vamos criar (create) um banco de dados (database) para fazer o nosso teste, no meu caso, vou chamar esse banco de dados de loja:

Vamos sair do nosso container, para isso, podemos apertar as teclas CTRL + D até voltarmos ao nosso terminal, ou então, utilizar o atalho Ctrl + P + Q. Falamos para o docker parar o nosso container (container stop) db e em seguida falar para ele removê-lo (container rm):

docker container stop db

docker container rm db

Mesmo tendo removido o container, as informações dele devem ter ficado salvas no volume. Vamos criar um novo container, dessa vez vou nomeá-lo de banco e referenciar o mesmo volume dados-do-banco ao diretório /var/lib/mysql:

docker container run --name banco -v dados-do-banco:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=alura mysql

Vamos ver se nossas informações ficaram salvas, vamos acessar esse novo container com o comando docker container exec -it banco /bin/bash e acessar o mysql

docker container exec -it banco /bin/bash

mysql -u root -p

Vamos falar para o banco de dados mostrar (show) as bases de dados existentes (databases):

show databases;

Veja que nossa base de dados loja está aparecendo normalmente, ou seja, conseguimos manter os dados mesmo após o container ter sido excluído.

Para saber mais

Nós podemos referenciar mais de um container para o mesmo volume. Ou seja, nós podemos ter dois ou mais container referenciando para o mesmo volume.

Esses nosso volumes ficam guardados no diretório /var/lib/docker/volumes/, porém, conseguimos também criar volumes em outros diretórios, basta que na hora da criação do container, passar como parâmetro o caminho da pasta, ao invés do nome do volume:

docker container run --name db -v /outro/diretorio/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql

Nós vimos como criar um volume, mas como podemos removê-lo? Nós podemos falar para o docker remover o volume (volume rm):

docker volume rm dados-do-banco

Lembrando que para remover um volume, nenhum container pode estar utilizando-o.

O Docker ganhou muito espaço tanto no cenário de desenvolvimento quanto no de infra, isso porque ele vem com o objetivo de facilitar o desenvolvimento de aplicações.

Aqui na Alura, temos um curso Docker, nele você aprenderá tudo sobre o que é um container, como fazer eles se comunicarem, além de aprender como criar suas próprias imagens para personalizar seus container.

FIQUE POR DENTRO

Próximo ArtigoNovidades do EF Core 2.1 - Conversão entre enumerados e strings