DevSecOps

10 nov, 2015

Montando volumes no Docker

Publicidade

Hoje vamos ver como utilizar a funcionalidade de volumes no Docker. Um volume pode ser apenas o mapeamento de pasta entre o host e container, bem como o mapeamento de uma pasta entre containers.

Gerenciando volumes

Host – Container

Na imagem abaixo podemos visualizar como fica o mapeamento entre host e container:

host_container-300x273

Podemos analisar os pontos positivos e negativos dessa abordagem em:

Prós:

  • Menor overhead para acesso do disco, pois não há análise pela libcontainer das chamadas para esse volume mapeado;
  • É possível mapear o mesmo volume para múltiplos containers: forma primitiva de replicação de dados entre containers (lembrando que neste caso não há controle de arquivos lidos e escritos ao mesmo tempo, quem deve ser responsável por isso é o filesystem do volume, não o volume em si);
  • Persistência de dados: não há risco do container cair ou ser removido e os dados desaparecerem.

Contras:

  • Sucessível possíveis brechas de segurança a nível de filesystem e escalonamento de privilégios, pois neste ambiente não há controle pela libcontainer;
  • Não escalável, pois se atrela o container ao host ou pelo menos ao mapeamento;
  • Dificulta administração, pois há mais uma camada de gerenciamento que deve ser muito bem estruturada.

Container – Container

Na imagem abaixo podemos visualizar como fica o mapeamento entre containers:

container_container-300x273

Podemos analisar os pontos positivos e negativos dessa abordagem em:

Prós:

  • Portável, pois o volume não está mais atrelado ao host;
  • É possível mapear o mesmo volume para múltiplos containers, forma primitiva de replicação de dados entre containers (lembrando que neste caso não há controle de arquivos lidos e escritos ao mesmo tempo, quem deve ser responsável por isso é o filesystem do volume, não o volume em si);
  • Persistência de dados, não há risco do container cair ou ser removido e os dados desaparecerem.

Contras:

  • Maior overhead para acesso disco, pois há análise pela libcontainer das chamadas para esse volume mapeado;
  • Maior complexidade, pois há mais passos a serem seguidos para criação e remoção de containers.

Criando e montando volumes

Adicionando um volume de dados

Para mapear o volume do container a uma pasta no host basta executar o comando:

docker run -d --name meucontainer -v /var/app imagem

Será criado um novo diretório dentro do container chamado /var/app, caso o mesmo já exista, será sobrescrito por este novo.

Verificando volume

Você pode verificar quais volumes um container possui executando o comando:

docker inspect meucontainer

O resultado do comando será parecido com isso:

...
Mounts": [
    {
        "Name": "fac362...80535",
        "Source": "/var/lib/docker/volumes/fac362...80535/_data",
        "Destination": "/var/app",
        "Driver": "local",
        "Mode": "",
        "RW": true
    }
]
...

Por padrão, todos os volumes são montados como leitura e escrita. Para montar o volume como apenas leitura, basta executar:

docker run -d --name meucontainer -v /var/app:ro imagem

Note o :ro no final do /var/app, isso quer dizer que este volume é apenas leitura.

Montando um diretório do host como um volume de dados

Para mapear o volume do container para uma pasta no host, basta executar o comando:

docker run -d --name meucontainer -v /var/app:/var/www/html imagem

Será criado um novo diretório dentro do container chamado /var/app, caso o mesmo já exista, será sobrescrito por este novo.

Criando e montando um container como um volume de dados

É possível você criar um container com um volume que pode ser compartilhado com os demais containers. Esta é uma prática comum quando se deseja ter alguma persistência de dados e que não esteja atrelado ao host onde o container está. Para isso, crie o container conforme abaixo:

docker create -v /dados --name meucontainer imagem /bin/true

Agora, no próximo container basta você utilizar o parametro –volumes-from para que o volume criado no container acima seja mapeado para o novo container, algo como:

docker run -d --volumes-from dados--name meucontainer1 imagem

Você pode criar quantos containers desejar mapeando este volume, inclusive pode mapear o volume de um container, por exemplo:

docker run -d --volumes-from container1 --name meucontainer2 imagem

Com isso, não é necessário mapear obrigatoriamente o container de volume, e sim algum container que já o utiliza. Outro ponto importante a se observar nessa caso é que:

  • Quando se remove o container de volume, os demais containers não perdem os dados, pois continua existindo neste container a pasta montada;
  • Para remover o volume nesse caso é necessário remover todos os containers que foram criados mapeando este container e em seguida executar o comando: docker em -v.

Bom pessoal, espero que tenham gostado. Esse assunto é muito importante dentro do Docker e espero fazer um vídeo usando volumes e disponibilizá-lo para vocês.

Não fique com dúvida! Mande e-mail para: contato@mundodocker.com.br ou escreva aqui nos comentários e vamos conversando.