Criando volumes com Docker
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.