Gerenciando Dados com Docker Volumes
Um desafio ao trabalhar com containers Docker é a persistência de dados. Containers são efêmeros, o que significa que qualquer dado criado dentro de um container é perdido quando o container é removido. Docker volumes resolvem esse problema, fornecendo uma maneira de persistir dados fora dos containers.
Compreendendo Docker Volumes
Docker volumes são o mecanismo preferido para persistir dados gerados e usados por containers Docker. Eles são completamente gerenciados pelo Docker e são isolados da estrutura de diretórios do sistema de arquivos do host.
Benefícios de usar volumes incluem:
- Volumes são mais fáceis de fazer backup ou migrar do que bind mounts
- Você pode gerenciar volumes usando comandos da Docker CLI
- Volumes funcionam em containers Linux e Windows
- Volumes podem ser compartilhados com mais segurança entre vários containers
- Drivers de volume permitem que você armazene volumes em hosts remotos, provedores de nuvem ou criptografe o conteúdo dos volumes
Criando e Usando Docker Volumes
Vamos criar um container de banco de dados MySQL simples que usa um volume para persistir seus dados.
Criando um Volume
Primeiro, crie um Docker volume:
docker volume create mysql-data
Você pode listar todos os volumes com:
docker volume ls
Você deve ver seu novo volume na lista:
DRIVER VOLUME NAME
local mysql-data
Executando um Container com um Volume
Agora, vamos executar um container MySQL que usa este volume:
docker run --name mysql-db -e MYSQL_ROOT_PASSWORD=mysecretpassword -v mysql-data:/var/lib/mysql -p 3306:3306 -d mysql:5.7
Este comando:
--name mysql-db: Nomeia o container "mysql-db"
-e MYSQL_ROOT_PASSWORD=mysecretpassword: Define uma variável de ambiente para configurar o MySQL
-v mysql-data:/var/lib/mysql: Monta o volume "mysql-data" no diretório onde o MySQL armazena seus dados
-p 3306:3306: Mapeia a porta 3306 no host para a porta 3306 no container
-d: Executa o container em modo detached
mysql:5.7: Especifica a imagem a ser usada
Aguarde um momento para o container iniciar e, em seguida, verifique se ele está em execução:
docker ps
Interagindo com o Banco de Dados
Vamos criar um banco de dados e uma tabela para demonstrar a persistência de dados. Primeiro, conecte-se ao container MySQL:
docker exec -it mysql-db bash
Dentro do container, conecte-se ao servidor MySQL:
mysql -u root -pmysecretpassword
Crie um novo banco de dados e tabela:
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255));
INSERT INTO users (name) VALUES ('John'), ('Jane'), ('Bob');
SELECT * FROM users;
Você deve ver os dados inseridos:
+----+------+
| id | name |
+----+------+
| 1 | John |
| 2 | Jane |
| 3 | Bob |
+----+------+
Saia do prompt do MySQL e do container:
exit
exit
Testando a Persistência do Volume
Agora, vamos parar e remover o container e, em seguida, criar um novo usando o mesmo volume:
docker stop mysql-db
docker rm mysql-db
Crie um novo container usando o mesmo volume:
docker run --name mysql-db-new -e MYSQL_ROOT_PASSWORD=mysecretpassword -v mysql-data:/var/lib/mysql -p 3306:3306 -d mysql:5.7
Agora, conecte-se ao novo container e verifique se nossos dados persistiram:
docker exec -it mysql-db-new bash
mysql -u root -pmysecretpassword
USE testdb
SELECT * FROM users
Você deve ver os mesmos dados que inserimos anteriormente:
+----+------+
| id | name |
+----+------+
| 1 | John |
| 2 | Jane |
| 3 | Bob |
+----+------+
Saia do prompt do MySQL e do container:
exit
exit
Isso demonstra que os dados persistiram mesmo após a remoção do container original, porque foram armazenados em um Docker volume.
Inspecionando e Gerenciando Volumes
Você pode inspecionar um volume para obter mais informações sobre ele:
docker volume inspect mysql-data
Isso mostrará detalhes como o ponto de montagem e o driver usado:
[
{
"CreatedAt": "YYYY-MM-DDTHH:MM:SS+00:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/mysql-data/_data",
"Name": "mysql-data",
"Options": {},
"Scope": "local"
}
]
Para limpar, vamos parar e remover o container:
docker stop mysql-db-new
docker rm mysql-db-new
Se você também quiser remover o volume:
docker volume rm mysql-data
Você agora aprendeu como usar Docker volumes para persistir dados entre os ciclos de vida dos containers, o que é essencial para aplicações com estado (stateful applications) como bancos de dados.