Você tem uma suposição errada sobre como os volumes funcionam no docker. Tentarei explicar como os volumes se relacionam com contêineres docker e imagens docker e esperamos que as diferenças entre volumes de dados e contêineres de volume de dados ficarão claras.
Primeiro, vamos relembrar algumas definições
Imagens do Docker
As imagens do Docker são essencialmente um sistema de arquivos de união + metadados. Você pode inspecionar o conteúdo do sistema de arquivos da união da imagem do docker com o comando docker export
e pode inspecionar um metadado da imagem do docker com o comando docker inspect
.
Volumes de dados
do Guia do usuário do Docker :
A data volume is a specially-designated directory within one or more containers that bypasses the Union File System to provide several useful features for persistent or shared data.
É importante observar aqui que um determinado volume (como o diretório ou arquivo que contém dados) é reutilizável somente se existir pelo menos um contêiner docker usando-o. As imagens do Docker não têm volumes, elas só têm metadados que, eventualmente, informam onde os volumes seriam montados no sistema de arquivos union. Os volumes de dados não fazem parte do sistema de arquivos de união dos contêineres do Docker, então onde eles estão? sob /var/lib/docker/volumes
no host do docker (enquanto os contêineres são armazenados em /var/lib/docker/containers
).
Contêineres de volume de dados
Esse tipo especial de contêiner não tem nada de especial. Eles são contêineres apenas interrompidos usando um volume de dados com o único e exclusivo objetivo de ter pelo menos um contêiner usando esse volume de dados. Lembre-se de que, assim que o último contêiner (em execução ou parado) usando um determinado volume de dados for excluído, esse volume ficará inacessível por meio da opção execução do docker --volumes-from
.
Trabalhando com contêineres de volume de dados
Como criar um contêiner de volume de dados
A imagem usada para criar um contêiner de volume de dados não tem importância, pois um contêiner pode permanecer parado e ainda preencher sua finalidade. Portanto, para criar um contêiner de dados chamado datatest_data
para um volume em /datafolder
, você só precisa executar:
docker run --name datatest_data --volume /datafolder busybox true
Aqui base
é o nome da imagem (um convenientemente pequeno) e true
é um comando que fornecemos apenas para evitar que o daemon do docker se queixe de um comando ausente. De qualquer forma, depois que você tiver um contêiner interrompido chamado datatest_data
com o único propósito de permitir que você alcance esse volume com a opção --volumes-from
do comando docker run
.
Como ler de um contêiner de volume de dados
Eu conheço duas maneiras de ler um volume de dados: o primeiro é através de um contêiner. Se você não puder ter um shell em um contêiner existente para acessar esse volume de dados, poderá executar um novo contêiner com a opção --volumes-from
com o único objetivo de ler esses dados.
Por exemplo:
docker run --rm --volumes-from datatest_data busybox cat /datafolder/data.txt
A outra maneira é copiar o volume da pasta /var/lib/docker/volumes
. Você pode descobrir o nome do volume nessa pasta inspecionando os metadados de um dos contêineres usando o volume. Veja esta resposta para detalhes.
Trabalhando com volumes (desde o Docker 1.9.0)
Como criar um volume (desde o Docker 1.9.0)
O Docker 1.9.0 introduziu um novo comando docker volume
que permite criar volumes:
docker volume create --name hello
Como ler de um volume (desde o Docker 1.9.0)
Digamos que você tenha criado um volume chamado hello
com docker volume create --name hello
, você pode montá-lo em um contêiner com a opção -v
:
docker run -v hello:/data busybox ls /data
Sobre como cometer & empurrando recipientes
Agora deve ficar claro que, como os volumes de dados não fazem parte de um contêiner (o sistema de arquivos union), a confirmação de um contêiner para produzir uma nova imagem do docker não persistirá em nenhum volume de dados.
Fazendo backups de volumes de dados
O guia do usuário do Docker tem um belo artigo sobre backup de volumes de dados .
Bom artigo sobre o volume de reagentes: link