Montando Volumes no Docker

Olá!

Hoje, nós do mundodocker.com.br, vamos ver como podemos 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_containerPodemos analisar os pontos positivos e negativos dessa abordagem em:

Prós:

– Menor overhead para acesso disco, pois não há analise 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, escalonamento de privilégios, pois neste ambiente não há controle pela libcontainer.

– Não escalável, pois  atrela-se 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_containerPodemos 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á analise 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 montandos como leitura e escrita, você pode 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 a 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 demais containers, isso é uma prática comum quando deseja-se 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 isso:

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á utiliza ele. Outro ponto importante a se observar nessa caso é que:

  • Quando removido o container de volume os demais containers não perdem os dados, pois continuará existindo neste container a pasta montada;
  • Para remover o volume nesse caso é necessário remover todos os containers que foram criando 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, espero fazer um vídeo e disponibilizar para vocês um prática usando volumes.

Não fique com dúvida, mande e-mail para: [email protected] e vamos conversando, ajude a divulgar o blog e disseminar conhecimento, abraço!

Docker no Windows Server 2016

Olá Pessoal!

A Microsoft acaba de lançar o Windows Server 2016 Preview, que trará consigo o Docker Engine nativo, isso mesmo, a mesma engine utilizada dentro de distribuições Linux estará disponível no Windows Server. Quais benefícios isso trás?

 Flexibilização da infraestrutura, da mesma forma que no Linux, não será necessário instanciar uma VM ou máquina física para realizar deploy de uma aplicação.

Mais ferramentas para desenvolvedores, já existe um plugin para o Visual Studio, onde você poderá desenvolver sua aplicação e publica-la automaticamente dentro de um container, deu build foi pro ar!

Claro, isso não foi um trabalho fácil, houve um grande esforço por parte da Microsoft para que fosse possível integrar o Docker Engine ao Kernel do Windows e mesmo assim há algumas limitações, como por exemplo:  Não será possível, pelo menos não na versão preview, o uso de container Linux dentro Windows Server 2016, isso claro por motivos óbvios, pois o Kernel do host é bastante diferente do Kernel do container. Claro para testes ele pode ser utilizado sem problema.

OK, mas como ficou a arquitetura?

Bem parecido com o Docker no Linux, a Microsoft adicionou ao Kernel do Windows alguns recursos que possibilitam criar um ambiente isolado a nível de userspace, e uso limitado de recursos, na imagem abaixo podemos ter uma ideia de como ficou:

windows_docker

Fiquem atentos, nos próximos posts vamos colocar na prática o Docker no Windows Server 2016, continuem nos acompanhando aqui no blog, facebook ou nosso canal no youtube.

Referência:

Introducing the Technical Preview of Docker Engine for Windows Server 2016

Medindo Recursos com o cAdvisor

Oi Pessoal!
Hoje o post será um pouco mais curto, no vídeo abaixo explicamos como funciona e como o cAdvisor pode te ajudar a mensurar o uso de recursos de cada container, bem como o uso de recursos pelo host.

Ficou dúvida? Curiosidade? Deixe sua dúvida e vamos conversando, divulgue o mundodocker.com.br e nos ajude disseminando conhecimento!

Docker Private Registry

Olá Pessoal!

Hoje o post será um pouco mais curto, isso por que queremos compartilhar com vocês alguns vídeos sobre as ferramentas que cercam o Docker, entre elas o Private Registry, que nada mais é do que um repositório privado de imagens.

Veja abaixo o vídeo que fala sobre isso, assine nosso canal no Youtube, ajude divulgando o mundodocker.com.br e fique por dentro das novidades! 😉

 

Docker e DevOps

Olá pessoal!

Hoje vamos ao post um pouco mais voltado ao conceito e ideias que fazem do Docker uma tecnologia/solução tão inovadora, eficiente e claro popular.

Precisamos entender, antes de tudo, como a vida de um profissional pode ser, primeiro temos o mundo das empresas que adotam o método tradicional de trabalho, nessa empresa o horário é fixo, as decisões demoradas, e geralmente as ideias que você pode ter estão descritas em um manual interno.

Geralmente essas empresas demoram a reagir ao mercado, ou seja, algo novo demora a ser posto em prática, e as mudanças são vistas como um problema.

Temos outro mundo, a de empresas que vêem em mudanças um forma de ganhar espaço no mercado, onde ideias novas e desafios são um requisito para se trabalhar, você é instigado a ver as coisas de uma outra perspectiva, pois deve se manter sempre a frente do que vem em seguida.

Um os grandes entraves em ambas as empresas é a diferenciação que há entre as equipes de desenvolvimento e infra-estrutura, elas não se conversam, e o que uma propõe é um problema para a outra. Isso leva apenas a um lugar: Estagnação, pois não colaboração entre elas para criar ou resolver algo que seja vital para a empresa.

blue devops_4

Felizmente essa percepção está sendo mudada, em seu lugar surgiu um novo conceito de trabalho, que serve para ambas as empresas que mencionei acima, o conceito de DevOps. Mas o que ser isso cacique?

DevOps é uma metodologia, que incentiva uma maior integração entre as diferentes áreas da empresa, ou seja, em vez de cada um fazer uma coisa, as equipes tendem a se integrar em prol de uma objetivo comum, seja um projeto ou a resolução de um problema.

Para que isso seja possível, existem diversas ferramentas que auxiliam o desenvolvimento conjunto de projetos, desde base de conhecimento até orquestração de serviços. É nesse sentido em que o Docker auxilia, tanto o pessoal de Dev, quanto o pessoal de Ops. O Docker permite que o desenvolvedor tenha todo o seu ambiente de desenvolvimento e teste totalmente agnóstico da infraestrutura.  Da mesma forma que permite ao analista de infraestrutura realizar ou configurar o ambiente de produção de uma maneira muito mais segura e eficiente, pois basta replicar o ambiente de homologação (que já foi testado pelo desenvolvedor) no ambiente de produção, e isso sem se preocupar nas diferenças nos ambiente, pois é o mesmo ambiente.

Outro beneficio que o Docker proporciona é a agilidade no deploy das aplicações, pois não é necessário subir uma instância ou instalar um servidor todo apenas para testar algo, basta criar um container e subir sua aplicação.

Nos próximos posts nós iniciaremos alguns tutoriais que explicarão melhor como podemos integrar de forma mais eficiente o Docker a outras ferramentas, permitindo criar um ecossistema completo de desenvolvimento e integra continua, tendo em vista os benefícios tanta para Dev quanto Ops.

O que são Capabilities

Olá!

Hoje vamos ver algumas features de segurança que pertencem não apenas ao Docker, mas sim ao LXC, são as capabilities.

Em sistemas Unix like, há basicamente duas categorias de processos: processos privilegiados, que executam com ID 0 (superusuário) e os não-privilegiados, que executam com ID maior que 0.

Basicamente os processos privilegiados ignoram todas as verificações de permissões de kernel, enquanto os processos não-privilegiados estão sujeitos a algumas checagens para sua correta execução, normalmente: UID efetivo (usuário dono do arquivo/binário, etc), GID efetivos (grupo dono do arquivo/binário, etc) ou lista de grupo suplementar (mais conhecidas como ACL’s – Access Control List).

Do kernel 2.2 em diante o Linux dividiu as formas tradicionais de privilégios associados ao superusuários em unidades diferentes, conhecidas como capacidades, que podem ser habilitadas e desabilitadas independentemente umas das outras. Essas capacidades são atribuídas por thread, ou seja, threads do mesmo processos podem ter suas capacidades de execução modificadas.

 No Docker é possível modificar essas capacidades, habilitando ou desabilitando conforma sua necessidade, vale lembrar que todo container executa de forma não privilegiada, ou seja, ele tem sua execução restrita, quando é adicionada uma capacidade a execução de um container, é dado o privilegio para que o mesmo possa executar alguma ação como root, isso pode ser um problema de segurança, dependendo do seu ambiente.

Vamos ver algumas capacidades que podem ser atribuídas a um container, e que são normalmente utilizadas:

CAP_SETPCAPModifica capacidades de um processo
CAP_SYS_MODULEInsere ou remove módulos do kernel
CAP_SYS_RAWIOModifica memória do Kernel
CAP_SYS_PACCTConfigura quota de processo
CAP_SYS_NICEModifica prioridade do processo
CAP_SYS_RESOURCESobrescreve os limites de recursos
CAP_SYS_TIMEModifica a hora de sistema
CAP_SYS_TTY_CONFIGConfigura interface tty
CAP_AUDIT_WRITEEscreve logs de auditoria
CAP_AUDIT_CONTROLConfigura auditoria dos subsistema
CAP_MAC_OVERRIDEIgnora politicas de MC do Kernel
CAP_MAC_ADMINConfiguração de MAC
CAP_SYSLOGModifica o comportamento de logs
CAP_NET_ADMINConfigura funções de rede
CAP_SYS_ADMINPossibilita execução totalmente privilegiada.

Agora, para habilitar alguma capacidade (ou CAP) no Docker, pode ser utilizado o parâmetro: –cap-add=NOMEDACAP, algo parecido com isso:

docker run --cap-add=NOMEDACAP -i -t --rm centos /bin/bash

Para remover alguma CAP basta adicionar o parâmetro –drop-cap, ficaria assim:

docker run --cap-add=ALL --cap-drop=NET_ADMIN -i -t --rm centos /bin/bash

Seguindo os parâmetros acima, todas as CAPs serão habilitadas para este container, menos a CAP NET_ADMIN, com isso todas as demais operações serão permitidas ao container, menos as operações de rede, como modificação de ip, configurações de rotas, etc.

Por hoje era isso, fiquem atentos para as novidades!

Administrando um Container

Olá Pessoal!

Hoje vamos fazer algo um pouco mais avançado no Docker, aprenderemos um pouco mais sobre os comandos no Docker, e como podem nos ajudar. Antes vamos definir um plano de ação: Temos um container com Apache dentro, precisamos saber:

1 – Como saber quais containers possuo?

2 – Quais foram os últimos logs desse container?

3 – Em que porta está executando o container?

4 – Que comando tenho que executar para parar e iniciar o container?

5 – Como sei que o container está no ar?

FÁCIL:

Para criar/iniciar um container você pode utilizar o seguinte comando:

docker run -d -p 80:80 httpd

Esse comando fará com que seja iniciado um container utilizando uma imagem pronta do Apache, caso a imagem não seja encontrada localmente, o próprio Docker realizará o download dessa imagem através de seus repositórios oficiais. Ele atribuirá a porta 80 do host para o container, ou seja, quando acesso a porta 80 do host, o que será apresentado é o site que encontra-se dentro do container.

Podemos ainda, mapear uma pasta do host para dentro do container, isso fará com que o container compartilhe com o host uma determinada pasta, veja o comando:

docker run -d -p 80:80 -v /var/www/html:/var/www/html httpd

Por padrão, a pasta mapeada recebe permissão de leitura e escrita, mas é possível fazer com que esse mapeamento seja somente leitura, para isso basta adicionar :ro no final, veja:

docker run -d -p 80:80 -v /var/www/html:/var/www/html:ro httpd

Isso fará com que o container não possa adicionar ou escrever dentro da pasta compartilhada. Agora voltando ao nosso plano de ação, visto que já sabemos como iniciar um container.

1 – Como saber quais containers possuo?

Você pode executar o comando: docker ps -a, isso fará com que seja listado todos os containers que você possui no host onde está sendo executado o comando (ou onde está apontando o Docker Client)

2 – Quais foram os últimos logs desse container?

Na listagem do comando acima, poderá ser visto o id do container, tendo essa informação, basta executar o comando: docker logs containerid . Esse comando retornará na tela os últimos eventos ocorridos dentro do container (mais para frente veremos a diferença nos outputs de logs para um container)

3 – Em que porta está executando o container?

A forma mais simples de saber isso é executando o comando: docker ps, esse comando retornará várias informações dos containers que estão running no momento, entre essas informações podemos capturar em qual porta do host o container está ‘ouvindo’.

4 – Que comando tenho que executar para parar e iniciar o container?

Isso é simples, docker stop e docker start, há opções mais drásticas como docker kill, mas esse último é recomendado apenas em último caso, pois o mesmo fará com que o container seja parado de forma abrupta, podendo causar o corrompimento do filesystem do mesmo.

5 – Como sei que o container está no ar?

O comando docker ps retornará apenas os containers que estão ativos, é claro que apenas isso não quer dizer que sua aplicação/ambiente está funcionando corretamente, um forma de testar isso é acessando seu ambiente de fora, por exemplo, no comando que executamos acima: docker run -d -p 80:80 httpd o mesmo fará com que seja alocado a porta 80 do host para o container, isso quer dizer que caso eu acesse: http://ipdohost estarei acessando na verdade a porta 80 que está dedicada ao container, com isso estarei acessando o site que encontra-se dentro do container, o site acessou? Perfeito, seu container está no ar.

Espero que essas dicas o ajudem a entender um pouco mais o funcionamento de um container, essas são algumas tarefas administrativas que possivelmente serão as mais utilizadas durante o seu convívio com o Docker. Dúvidas, sugestões? nos mande um mensagem e vamos conversando.

Grande Abraço!