DEV Community

Lukita Moreno
Lukita Moreno

Posted on

Tipos de Volumes no Docker

1. Para que serve o volume no Docker ?

Alt Text
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. ![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gmjc9k1aueduj1qriya0.png) * 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. ![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wn4v6we9qghx9peqvrnu.png) * 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 
Enter fullscreen mode Exit fullscreen mode

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 1. Criamos o container. * ![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2yuysvp4aai0buu3ojhw.png) 2. Executamos o comando **docker inspect id_container** para inspecionarmos as configurações do nosso container . * `docker inspect 1ba5ab5ab9e0` 3. 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. * ![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bb40bh314p12e15371oh.png) 4. 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` ![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8qu0iqnho3o80vlcmxwk.png) 5. 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 
Enter fullscreen mode Exit fullscreen mode

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`. ![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e6qp63y3upc19wy9wk6z.png) * 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. ![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/shrdtol5xrmlcwmwepys.png) ## 7. Volume Temporário (Esse tipo de volume funciona apenas no Linux) * Exemplo de uso 
Enter fullscreen mode Exit fullscreen mode

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. ![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m2zx2kdk1hfz4b6wb78b.png) ## 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** 
Enter fullscreen mode Exit fullscreen mode

docker run -it \
--mount type=bind,source=/home/devlmoreno/docker-volumes/my-folder-bind,target=/my-app-docker \
ubuntu:20.04

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sxztfmvb1m0ngv3lmwxd.png) ![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xd4zhsx1dkod0zb9m12l.png) * 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. 
Enter fullscreen mode Exit fullscreen mode

docker run -it \
--mount type=tmpfs,target=/my-app-docker \
ubuntu:20.04

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z9sxm5xia4t11c4o1g7z.png) * 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. 
Enter fullscreen mode Exit fullscreen mode

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**. ## 9. Documentação Docker sobre Volumes * https://docs.docker.com/storage/ 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)