Concrete Logo
Hamburger button

Uma análise sobre o Docker

  • Blog
  • 23 de Agosto de 2015
Share

Recentemente, Jonh Fink, da Universidade McMaster, publicou o artigo “Docker: um SaaS, framework de virtualização em nível de sistema operacional”. Esse post tem por objetivo fazer um resumo comentado do texto, que basicamente apresenta o Docker e faz um comparativo com tecnologias de virtualização a nível de máquina, como VirtualBox, VMWare, KVM, Xen, entre outros.

Basicamente, o Docker é uma implementação open source de uma virtualização a nível de sistema operacional (operating system level virtualization). Logo na introdução, o autor mostra uma breve evolução das tecnologias de virtualização, desde o início do chamado “senso moderno” de virtualização – na década de 1960 – com as VMs para as máquinas IBM System/360, passando pelo VMWare, VirtualBox, tecnologias de emulação até chegar no Docker.

Ao se pensar em virtualização, é importante perceber que cada instituição tem o seu ambiente relativamente particular de virtualização: a começar por qual será a finalidade do referido sistema, passando por qual tecnologia utilizará, quais aplicações e quais bibliotecas.

Docker

Esquemas típicos de virtualização de bibliotecas utilizam principalmente virtualização a nível de máquina: atentam em “emular” tanto quanto possível um sistema computacional de software: interface de rede, RAM, HD, gráficos, espaço em disco, Swap, processador e outros periféricos, tanto quanto se conseguir. Um problema desta abordagem é o fato de ela utilizar intensamente demasiado recurso do sistema operacional guest (resource-intensive) e ser ineficiente, dependendo das condições de contorno do sistema.

O autor apresenta o maior problema da virtualização a nível de máquina (tradicional): os recursos da máquina guest são limitados. Ele afirma que uma solução pensada foi o compartilhamento de recursos entre os hosts e o guest, dando aí origem à virtualização a nível de sistema operacional. Todavia, ele destaca que: “(…) that flexibility comes at a cost” (esta flexibilidade tem um custo). Como as instâncias host precisam compartilhar o kernel, suas possibilidades de virtualização são limitadas. Por exemplo, não se pode subir um sistema 64bits em um kernel 32bits.

É justamente neste contexto que surge o Docker. Também ele, como já havia sido mencionado, é uma virtualização a nível de sistema operacional. Todavia, ele faz uso de parte do conceito de Software como Serviço, frequentemente chamado SaaS (Software as a Service), o que é um método de entrega que provê acesso remoto ao software e suas funções, baseado em tecnologias como as de web-services. Ele surgiu em sistemas GNU-Linux e engloba tecnologias já existentes (copy-on-write union filesystems e Linux Containers, por exemplo). Suas principais características são: ser centrado no desenvolvedor (é uma ferramenta de linha de comando, pouco amigável para o usuário), portabilidade para deployment (o que é muito útil para continuous delivery), é versionável, reutilizável, developer oriented workflow e possui uma semelhante à do GIT.

Discussão

A primeira questão que surge é a respeito da diferença entre system-level virtualization e machine-level virtualization. Em poucas palavras, o que diferencia o primeiro do segundo é o compartilhamento dos recursos do guest. O sistema virtualizado em nível de sistema operacional compartilha os recursos, enquanto na virtualização a nível de máquina o sistema host executa como se estivesse executando em um hardware idêntico àquele virtualizado pelo hipervisor.

Tal qual um Linux Container Engine, o Docker também faz uso da biblioteca Linux Containers (lxc) ao invés de métodos de virtualização tradicionais. A lxc utiliza o mesmo kernel do servidor host, tornando tudo muito rápido. Um container é um processo isolado por meio de namespaces + chroot. Por esse motivo, fazer o “start” de um container é muito rápido, tanto quanto iniciar um processo novo.

O foco do Docker é rodar aplicações, e não emular a máquina. Em outras palavras, o foco é no software. Se isso por um lado é vantajoso, também tem seu preço (“There ain’t no such thing as a free lunch”). “O fato de usar o mesmo kernel do host dá um bom ganho de performance. Porém, criar um container novo consiste em criar um novo ‘chroot’, o que exige muito I/O, podendo tornar o processo lento”. É justamente aí que se destaca o Docker. Ele é uma ferramenta para simplificar e dar mais poderes aos containers. Ele traz o conceito de imagem, fazendo com que cada novo container seja um “diff” de outro container base. Para facilitar o entendimento, pode-se pensar em uma máquina virtual, porém menor, mais rápida e com tempo de startup/shutdown praticamente zero.

O Docker se apresenta como uma excelente ferramenta dentro do seu universo: um sistema em containers. Os containers são como caixas nas quais o desenvolvedor pode colocar o básico de um sistema operacional compatível com o kernel da máquina guest. Ele é mais leve que máquinas virtuais que trabalham a nível de máquina e é totalmente maleável, permitindo ser dimensionado a partir do laptop para a nuvem (cloud). Isso o torna excelente para aplicações como disponibilização de um servidor de serviços SOA ou REST, para testes de regressão ou para testes funcionais, para backup de um serviço web e para criar ambientes enxutos de desenvolvimento. Todavia, fora de seu universo ele é totalmente inútil. Para fazer, por exemplo, testes de performance, ele é totalmente inviável por não utilizar uma camada de hipervisor que virtualiza um hardware, mas compartilhar o hardware do guest. Nesse caso, os testes se tornariam não significativos.

O Docker é já uma ferramenta bastante evoluída e tem sido, no mercado, uma tecnologia de vanguarda na área de DevOps, sendo utilizada por muitas empresas, como Google, Yahoo e Microsoft, dentro da metodologia ágil. Neste post, o Wesley Silva ensinou como colocar sua aplicação dentro de um container, de forma semelhante ao que o autor usou como exemplo no artigo.

Outra característica conceitual do Docker é sua perfeita adaptação com a tecnologia de microservices. Embora seja permitido instalar diversas aplicações em um único container, na prática o Docker tem sido utilizado no mercado para oferecer em um container uma única aplicação como um serviço. Por fim, algo ainda a se considerar é que o Docker não suporta todas as aplicações. Ressalta o autor que, “portar aplicações exóticas para o Docker ainda não é um procedimento fácil”.

Mais a respeito do Docker pode ser visto no site oficial, que inclusive oferece um curso completo e gratuito, e nessa documentação do Diego Garcia, que também é bastante interessante. Soluções semelhantes ao Docker já surgem, por exemplo, para executar um Windows (que não compartilha do Kernel do GNU Linux, onde roda o Docker). Uma delas é o Vagrant.

Conclusão

O Docker é uma ferramenta leve e developer-centric que permite executar máquinas virtuais instantaneamente em comandos de linha, compartilhando recursos do sistema guest. Dentro de seu universo de ação (focado na aplicação), ele se apresenta como uma ótima ferramenta. Todavia, fora desse universo ainda tem poucas aplicações. Prefiro, por isso, dizer que ele não é a evolução da virtualização, apenas em determinado aspecto.

Concorda, discorda, ficou alguma dúvida ou tem algo a acrescentar? Utilize os campos abaixo!