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:
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:
Recurso | Máquina virtual | Container |
---|---|---|
Isolamento | Isolamento em nível de hardware | Isolamento em nível do SO |
Sistema operacional | Cada VM tem um sistema operacional | Cada container pode compartilhar o sistema operacional |
Boot-Time | Inicia em minutos | Inicia em segundos |
Compatibilidade do convidado | Executa qualquer sistema operacional dentro da máquina virtual | É executado na mesma versão do sistema operacional do host |
Tamanho | Geralmente alguns GBs | Os containers são leves (KBs/MBs) |
Armazenamento persistente | Podemos 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 falhas | Podem fazer failover para outro servidor em um cluster, com o sistema operacional da VM reiniciando no novo servidor | Em 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 disponibilidade | VMs podem mudar para um novo host facilmente | Os containers são destruídos e recriados em vez de se moverem |
Alocação/Consumo de recursos | Mais uso de recursos | Menos 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.