Artigos de Tecnologia e Negócios

Criando volumes com Docker

yuri.oliveira
yuri.oliveira

Quando um container é removido todas as suas informações são perdidas. Será que existe algum meio de persistir as informações do container? Esse meio se chama volume e vamos ver como criá-los.

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 uma formação em DevOps, 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.

Artigos de Tecnologia e Negócios