Introdução

No mundo dos contêineres Docker, os volumes desempenham um papel importante ao lidar com armazenamento e persistência de dados. Um volume é um recurso que permite que os dados sejam compartilhados e persistido entre contêineres e entre o host e o contêiner. Eles fornecem uma maneira flexível e eficiente de armazenar e compartilhar informações, permitindo que os dados sobrevivam além do ciclo de vida de um contêiner.

Os volumes são usados em situações em que é necessário manter os dados mesmo quando os contêineres são reiniciados, atualizados ou removidos. Eles podem conter arquivos, diretórios ou até mesmo bancos de dados inteiros. Os volumes no Docker são independentes dos contêineres e podem ser montados em um ou mais contêineres, permitindo que eles acessem e compartilhem os mesmos dados.

Docker Volume

Tipos de Volumes

  • Volume nomeado

    O volume do tipo nomeado é um recurso importante do Docker que permite a persistência de dados entre sua máquina e o contêiner.

    É gerenciado pelo próprio Docker, que mantém o local físico do volume no disco e fornece os dados corretos quando você consulta o nome do volume.

    Os volumes do tipo nomeado oferecem várias vantagens, como serem fáceis de fazer backup ou migrar e funcionarem em contêineres Linux e Windows.

  • Bind volume

    O volume "bind" no Docker permite que você compartilhe diretórios e arquivos específicos do sistema de arquivos do host com um contêiner Docker.

    As alterações feitas no contêiner são imediatamente refletidas no host e vice-versa, já que ambos estão usando o mesmo diretório ou arquivo. Isso possibilita que você trabalhe diretamente com os arquivos do host dentro do contêiner e faça alterações fora dele que serão instantaneamente visíveis dentro do contêiner.

Demosntração

Vamos começar criando um Volume, que se chamara mysql-db:

docker volume create mysql-db

Em seguida, listaremos os volumes para verificar se tudo está correto:

docker volume ls

Docker Volume


Agora, executaremos um novo contêiner com o nome "mysql-db", vinculando-o ao volume recém-criado:

docker contêiner run -d --name mysql-db -v mysql-db:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql

-d: É usado para executar o contêiner em segundo plano, isso permite que o contêiner libere o terminal para outros comandos.

--name mysql-db: --name é usado para atribuir um nome específico ao contêiner. Neste caso, o nome "mysql-db".

-v mysql-db:/var/lib/mysql: -v é usado para criar e vincular um volume ao contêiner. mysql-db é o nome do volume, e /var/lib/mysql é o caminho dentro do contêiner onde o volume será montado.
Isso permite que os dados do banco de dados MySQL persistam no volume "mysql-db" mesmo que o contêiner seja reiniciado ou removido.

-e MYSQL_ROOT_PASSWORD=root: -e é usado para definir variáveis de ambiente dentro do contêiner.
Essa variável é usada pelo contêiner MySQL para definir a senha do usuário root do banco de dados.

mysql: É a imagem do Docker a ser usada para iniciar o contêiner. Neste caso, a imagem "mysql" será usada para executar o contêiner MySQL.

E então listaremos os contêineres ativos:

docker ps

Docker Volume


Para demonstrar que o volume continua ativo mesmo após a remoção do contêiner, excluiremos o contêiner "mysql-db":

docker rm -f 8e8

Docker Volume

rm é o comando para remover, e -f é para forçar a remoção, assim será feita mesmo com o contêiner em execução, e 8e8 são os 3 primeiros dígitos do id do contêiner, para identificação

Por fim, mostraremos que o volume ainda existe antes de excluí-lo:

docker volume prune -a

Docker Volume

Note que mesmo deletando o contêiner o volume que usávamos continuou existindo, isso é ótimo para salvar dados, fazer backup, compartilhar dados entre contêineres, escalabilidade, etc.

Porém isso pode gerar problema, se você usar o comando para criar um contêiner, por exemplo do próprio mysql, ele gera um volume automaticamente, já que é uma configuração de sua imagem.

Usando varias vezes o comando sem o parâmetro de volume:

docker run -d --name mysql2 -e MYSQL_ROOT_PASSWORD=root mysql

Docker Volume

Vários volumes foram criados juntos.

E agora se deletarmos os contêineres, iremos ter vários volumes sem uso ocupando espaço:

docker rm -f 00b 661 31a 631 270

Docker Volume


Então tome cuidado, pois nesse exemplo simples os cinco volumes estavam ocupando mais de 1GB.

Docker Volume