O que é o Docker?

Em um post anterior ficamos conhecedo um pouco da história dos containers Linux. Vimos que containers não é algo relativamente novo. A primeira experiência data-se do ano de 1979 com o Unix V7, mas a primeira implementação sólida e consistente só ocorreu em 2008 com o LXC onde foram utilizados cgroups e namespaces.

Foram então surgindo outras iniciativas até chegarmos em 2013 ao Docker, que foi quando os containers explodiram em popularidade.

Mas afinal, o que é o Docker?

O Docker é uma plataforma open source que facilita a criação e administração de ambientes isolados. Ele possibilita o empacotamento de uma aplicação ou ambiente dentro de um container, se tornando portátil para qualquer outro host que contenha o Docker instalado. O container nada mais é do que um ambiente isolado, disposto em um servidor, que divide um único host de controle. Então, você consegue criar, implantar, copiar e migrar aplicações de um ambiente para outro com maior flexibilidade.

Containers vs VMs

Uma das mais frequentes perguntas sobre o Docker é como o container difere da VM (máquina virtual).

Cada um dos containers e VMs tem seus próprios casos de uso. Muitas implantações de containers usam VMs como sistema operacional host em vez de rodar diretamente no hardware, o que fornece mais uma camada adicional de alta disponibilidade na forma de máquina virtual.

Vamos ver então como e o que torna o container diferente das máquinas virtuais:

Virtualização vs Containers

Se você observar o diagrama de referência acima, a camada de hipervisor está habilitando/dando suporte para criar uma máquina virtual e, da mesma forma, o tempo de execução está permitindo a execução de containers no sistema operacional.

A tabela abaixo mostra de uma forma mais clara as diferenças entre máquinas virtuais e containers:

RecursoMáquina virtualContainer
IsolamentoIsolamento em nível de hardwareIsolamento em nível do SO
Sistema operacionalCada VM tem um sistema operacionalCada container pode compartilhar o sistema operacional
Boot-TimeInicia em minutosInicia em segundos
Compatibilidade do convidadoExecuta qualquer sistema operacional dentro da máquina virtualÉ executado na mesma versão do sistema operacional do host
TamanhoGeralmente alguns GBsOs containers são leves (KBs/MBs)
Armazenamento persistentePodemos usar disco adicional para armazenamento local ou Cluster File System (NFS)Podemos usar disco adicional para armazenamento local ou Cluster File System (NFS)
Tolerância a falhasPodem fazer failover para outro servidor em um cluster, com o sistema operacional da VM reiniciando no novo servidorEm caso de falha de um nó do cluster, todos os containers em execução nele serão recriados rapidamente pelo orquestrador em um outro nó do cluster.
Alta disponibilidadeVMs podem mudar para um novo host facilmenteOs containers são destruídos e recriados em vez de se moverem
Alocação/Consumo de recursosMais uso de recursosMenos uso de recursos

As máquinas virtuais e os containers contrastam de algumas maneiras diferentes, no entanto, a principal diferença é que os containers oferecem uma abordagem para virtualizar um sistema operacional para que várias cargas de trabalho possam ser executadas em um único sistema operacional. Com as VMs, o hardware está sendo virtualizado para executar várias instâncias do sistema operacional. A velocidade, agilidade e portabilidade dos containers os tornam mais uma ferramenta para ajudar a otimizar o desenvolvimento de software.

Docker e sua relação com containers

O Docker utiliza o kernel do Linux e outros recursos como cgroups e namespaces para segregar processos. Assim, eles podem ser executados de maneira independente. As ferramentas de container, incluso o Docker, fornecem um modelo de implantação com base em imagens. Isso facilita o compartilhamento de uma aplicação ou conjunto de serviços, incluindo todas as dependências deles em vários ambientes.

O Docker também automatiza a implantação da aplicação (ou de conjuntos de processos que constituem uma aplicação) dentro desse ambiente de container. Essas ferramentas baseadas nos containers Linux (o que faz com que o Docker seja exclusivo e fácil de usar) oferecem aos usuários acesso sem precedentes a aplicações, além da habilidade de implementar com rapidez e de ter total controle sobre as versões e distribuição.

Vantagens na utilização do Docker

O Docker traz uma API para gerenciamento de containers, um formato de imagem e a possibilidade de usar um registro remoto para compartilhar containers. Este esquema beneficia desenvolvedores e administradores de sistema com vantagens como:

  • Implementação rápida de aplicações: os containers incluem os requisitos mínimos de tempo de execução do aplicativo, reduzindo seu tamanho e permitindo que sejam implementados rapidamente.
  • Portabilidade: um aplicativo e todas as suas dependências podem ser agrupados em um único containers que é independente da versão do host do kernel Linux, distribuição de plataforma ou modelo de implantação. Este container pode ser transferido para outra máquina que executa o Docker e executado lá sem problemas de compatibilidade.
  • Controle de versão e reutilização de componentes: você pode rastrear versões sucessivas de um container, inspecionar diferenças ou reverter para versões anteriores. Os containers reutilizam componentes das camadas anteriores, o que os torna visivelmente leves.
  • Compartilhamento: você pode usar um repositório remoto para compartilhar seu container com outras pessoas. A Docker fornece um registro para este propósito e também é possível configurar seu próprio repositório privado.
  • Leve e sobrecarga mínima: as imagens Docker normalmente são muito pequenas, o que facilita a entrega rápida e reduz o tempo para implantar novos containers.
  • Manutenção simplificada - o Docker reduz o esforço e o risco de problemas com dependências de aplicativos.

Depois de conhecer um pouco mais sobre o Docker, você já deve ter percebido algumas vantagens de sua utilização, como economia de recursos, melhor disponibilidade do sistema, possibilidades de compartilhamento, simplicidade de criação e alteração da infraestrutura, manutenção simplificada (reduzindo o esforço e o risco de problemas com as dependências do aplicativo), entre muitas outras. Em um próximo post vou mostrar algumas alternativas ao Docker que você também deveria conhecer.