Por que containers?

Standard

Introdução

Container tem sido uma palavra muito usada ultimamente nos meios mais técnicos, principalmente aqueles que estão sendo motivados pela cultura DevOps, mas toda novidade sempre vem acompanhada daquela dúvida: “por que devo usar?”.

Esse artigo tem como objetivo apresentar alguns dos motivos que tem feito o modelo de containers ser um sucesso e tentar sanar algumas das principais dúvidas que recebemos sobre esse assunto.

O que são os containers?

É uma nova forma de abstração de infraestrutura que atua na virtualização a nível do sistema operacional, ou seja, eles – os containers – criam uma espécie de “caixa” que pode encapsular praticamente qualquer processo, por conta disso o nome container. Essas caixas normalmente contém apenas um serviço em execução, e são isoladas no processamento, memória RAM, disco e rede.

os-virtualization

Resumidamente, a tecnologia de containers permite que você execute processos isolados dentro do mesmo sistema operacional. O mais interessante é a possibilidade do processo executar em um Ubuntu Server, um outro rodar em um Fedora, quando na verdade todos estão sendo executados de fato em um host com Debian instalado.

A principio, essas execuções em distribuições diferentes podem confundir um pouco, mas é bastante simples. Basta você lembrar que as distribuições GNU/Linux nada mais são do que disposições distintas de arquivos e pastas no filesystem, certo? Com isso em mente, o que temos no container são os arquivos espalhados da forma que a distribuição escolhida especifica, ou seja, com seus binários, arquivos de configuração, pastas e afins. Com isso o processo executa em uma composição de arquivos isolada, criando uma camada de abstração.

Vale ressaltar que não é possível virtualizar sistemas operacionais distintos, ou seja, não será possível executar containers Windows em um GNU/Linux, infelizmente.

Qual diferença para uma máquina virtual?

Avaliando rapidamente, o modelo de container se parece um pouco com a virtualização de máquinas, embora sejam bem distintos.

docker_vs_vmware

Uma das diferenças é que no caso das máquinas virtuais existe o papel do Hypervisor, que virtualiza o hardware e entrega um sistema completo, com seu próprio sistema operacional, pilha de rede própria, sistemas de arquivo e afins. A máquina é isolada por inteiro e não há praticamente compartilhamento algum entre os ambientes virtuais.

No modelo de containers, o isolamento é feito a nível do sistema operacional, e assim todos os ambiente compartilham o mesmo kernel, ou seja, é utilizado a mesma pilha de rede e outros dispositivos para uso de recurso de hardware. Ao contrário do modelo de máquinas virtuais, o produto entregue para uso não é uma máquina completa e sim um processo em execução isolado virtualmente.

Economia de recurso

Para explicar a economia de recurso, precisamos contextualizar a diferença entre imagens e containers.

De forma bem resumida, imagem é uma definição de ambiente em formato “somente leitura” e o container é uma imagem em execução, que nesse momento cria uma camada extra para armazenar os dados referente aquela determinada execução, uma vez que esses dados não são armazenados na imagem.

docker-imageExiste a possibilidade de configurar que uma determinada imagem dependa da outra, nesse caso é criada uma pilha de imagens. Todas elas montadas como somente leitura para formar um container. Com isso é possível montar a mesma pilha de imagens para containers distintos, que nesse caso, economizará o recurso de disco compartilhado entre os ambientes.

docker-filesystems-multilayerImagine um ambiente formado por uma imagem Debian, Apache e módulo PHP. Caso você precise 20 containers dessa pilha de imagens, você não gastará o recurso multiplicado por 20, o espaço em disco utilizado será referente apenas aos arquivos temporários e logs de cada container, e nesse caso, esses dados serão armazenados nessa camada extra de cada container.

Facilidade no uso

Na hipótese dos containers Docker, a grande facilidade é uso da sua nuvem pública, onde está disponível diversas imagens prontas para uso. Para baixar um determinado ambiente basta um comando:

# docker pull <imagem>

Para iniciar essa imagem é também muito simples:

# docker run -d <imagem>

Então ele serve pra tudo?

Não! Nenhuma solução serve para todas as situações. Containers são muito bons para disponibilizar e atualizar serviços, principalmente web. Para situações que demandam configuração complexa de rede e demandam diversas portas para comunicação, o container não é indicado, mas em muitos casos ainda pode ser usado.

Vale a pena frisar que o container não é uma máquina mais leve que uma máquina virtual convencional. É um processo em execução, e a solução projetada precisa considerar isso, pois criar um container pensando em máquina é um erro que normalmente inviabiliza o uso efetivo das facilidades do container.

 

 

  • Pingback: Por que containers? - Peguei do()

  • Joao Mortani

    Boa tarde,
    Minha duvida é: O containers seria a melhor solução para gerenciar a infra de um servidor com diferentes aplicações, mesmo que elas ainda utilizem as memas tecnologias como por exemplo nginx e php? E também seria uma boa forma de atualizar recursos por exemplo php de uma aplicação e as outras da maquina não?!

    Parabens pelo blog, otimo lugar para quem quer aprender sobre DevOps e sua cultura.
    Abs

    • Gomex

      “O containers seria a melhor solução para gerenciar a infra de um servidor com diferentes aplicações, mesmo que elas ainda utilizem as memas tecnologias como por exemplo nginx e php?”

      A melhor, depende do contexto, mas seria uma boa solução sim. Usando tecnologias diferentes, você poderia isolar ambas em containers distintos e isso além de proporcionar segurança iria facilitar a atualização do seu host, por exemplo. A atualização dos containers também seria simples, uma vez que você poderia simplesmente fazer o pull das imagens e reiniciar os containers em esquema de alta disponibilidade.

      “E também seria uma boa forma de atualizar recursos por exemplo php de uma aplicação e as outras da maquina não?!”

      Linguagens interpretadas, como o PHP, são ótimas para usar com containers, pois usando mapeamento de volume, o container seria a infraestrutura web para suportar esse código, ou seja, seria o seu servidor web, módulos necessários para esse código e configurações específicas do seu ambiente.

      Resumindo, container é sim uma boa escolha para seu ambiente, mas depende muito do seu contexto, conhecimento do docker e possibilidade de tentar um modelo novo.

      Obrigado pelo elogio 🙂

  • Cléber

    Estamos pensando em disponibilizar diferentes versões internas para testes do sistema em formato de containers.

    Teríamos muitas versões de diversos clientes que ficariam standby e acionadas no momento necessário (correção de bugs e equipe de testes).

    Isso seria uma boa estratégia?

    • Gomex

      Isso seria uma ótima estratégia. Levando em consideração que o container pode ser iniciado em segundos, a depender da solução adotada, você pode criar imagens e iniciar os container com base na demanda mesmo 🙂

  • Hoygenis Dantas

    Que show, vlw!