1. Para que serve o volume no Docker ?
Basicamente utilizamos o volume para fazer a persistência de dados entre nossa máquina e o container.
2. Tipos de Volume
- Bind-mount
- Volume / Volume Nomeado
- Volume Temporário
3. Bind-mount
- Exemplo de uso
docker run -it \
-v /home/devlmoreno/docker-volumes/my-folder-bind:/my-app-docker \
ubuntu:20.04
- Para exemplificar o uso, começamos criando um diretório em nosso sistema com o nome 'my-folder-bind', logo em seguida criamos o container.
- Por fim criamos um arquivo (bind-mount.txt) em nosso sistema (podendo ser a criação do arquivo dentro do container também). Pode-se observar que o arquivo é exibido normalmente tanto dentro do container quanto em nosso sistema.
- Esse tipo de Volume não é um volume criado pelo próprio Docker, ou seja, fazemos uma referência do caminho absoluto do nosso sistema para o diretório 'my-app-docker' dentro do nosso container.
4. Volume (Gerenciado pelo Docker)
- Exemplo de uso
docker run -it \
-v /my-app-docker \
ubuntu:20.04
- Nesse caso, o Docker cria um volume automaticamente dentro do nosso sistema e faz essa referência para o diretório 'my-app-docker' dentro do nosso container.
Para exemplificar o uso
- Criamos o container.
- Executamos o comando docker inspect id_container para inspecionarmos as configurações do nosso container .
docker inspect 1ba5ab5ab9e0
- Procuramos pelo atributo Mounts e em seguida o Source para descobrirmos o caminho do diretório que o Docker criou em nosso sistema para gerenciar o volume.
- Copiamos o caminho do diretório e logamos como sudo (por conta do caminho ser protegido), logo em seguida acessamos o diretório.
- Por eu estar utilizando o wsl2 (ambiente linux dentro do windows) para exemplificar esse tipo de volume, o caminho do volume criado pelo Docker fica em um caminho diferente do que é listado no Mounts > Source, caso você não esteja utilizando o wsl2 basta acessar o caminho exibido no Mounts > Source normalmente.
-
Exemplo do caminho com wsl2
cd \\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes
cd 1ba0860040f23624cb8efbbfde2f53af0b1d00c4af9d588299427b096ac17696
cd .\_data\
-
Exemplo do caminho para ambientes linux comuns
-
cd/var/lib/docker/volumes/7e5cc9339921d493553691db46fceed61f89d9cc60abf6b2c1060811166a0c4d/_data
-
- Criamos um arquivo dentro do diretório do nosso sistema e listamos esse arquivo no container.
echo "Volume Gerenciado pelo Docker!" > volume-gerenciado-docker.txt
- Para criar um arquivo no linux basta digitar
touch arquivo.txt
. No exemplo acima o arquivo foi criado a partir do powershell do windows por conta da utilização do wsl2.
5. Diferença entre Bind-mount e Volume
O Bind-mount faz uma referência a um caminho absoluto do nosso sistema, ou seja, nos permite escolher qual diretório queremos mapear ao docker, por conta disso ficamos "reféns" da estrutura de diretórios.
No formato Volume, o Docker faz esse trabalho, com isso abrimos um leque de possibilidades para utilizarmos os comandos que o mesmo disponibiliza, como por exemplo, create, inspect, rm, prune e etc.
6. Volume Nomeado (Gerenciado pelo Docker)
- Exemplo de uso
docker run -it \
-v my-volume-docker:/my-app-docker \
ubuntu:20.04
- Crie um volume através do comando do Docker.
-
docker volume create my-volume-docker
-
- Execute o container através do comando do exemplo de uso.
- Para encontrar seu volume nomeado que foi criado (my-volume-docker) acesse o diretório
/var/lib/docker/volumes
, caso esteja utilizando o wsl2 seu volume será encontrado no diretório\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes
. - Em seguida crie um arquivo dentro desse diretório e faça a listagem do mesmo no seu container, pronto, seu arquivo estará lá para ser acessado.
7. Volume Temporário (Esse tipo de volume funciona apenas no Linux)
- Exemplo de uso
docker run -it \
--tmpfs /my-app-docker \
ubuntu:20.04
- Enquanto nosso container estiver sendo executado, esse volume estará sendo armazenado na nossa memória RAM, ou seja, será um acesso mais rápido ao volume porém volátil, não teremos uma persistência de dados envolvida nesse método.
8. Recomendações Docker
- Por conta de facilitar o entendimento na hora da leitura do comando, é recomendando pelo próprio Docker utilizar a flag --mount ao invés da flag -v.
- Exemplo do comando com a flag --mount
docker run -it \
--mount type=bind,source=/home/devlmoreno/docker-volumes/my-folder-bind,target=/my-app-docker \
ubuntu:20.04
- Estrutura do comando com a flag.
- type = bind | volume (default) | tmpfs
- source = diretório do nosso sistema
- target = diretório dentro do container
- No caso do type tmpfs, não teríamos um source, basta retirar esse parâmetro do comando.
docker run -it \
--mount type=tmpfs,target=/my-app-docker \
ubuntu:20.04
- No caso de um volume nomeado, seguindo nosso exemplo anterior e assumindo que você criou o volume a partir do gerenciamento do Docker, podemos utilizar o comando dessa forma.
docker run -it \
--mount source=my-volume-docker,target=/my-app-docker \
ubuntu:20.04
- Nota-se que no comando nós não passado o type, isso por conta do valor default do type ser volume.
Top comments (0)