Virtualização para contêineres

Concluído

A virtualização usando hipervisores, como o Zen e o Hyper-V, particiona um servidor físico em vários servidores virtuais e isola as cargas de trabalho em execução em cada um. Porém, as VMs também têm suas desvantagens:

Requisitos de recursos: As VMs exigem muita RAM. Se um Windows Server hospedar 10 VMs do Windows, o Windows será carregado na memória 11 vezes: uma cópia para o servidor em si e uma cópia para cada uma das máquinas virtuais. As VMs não podem compartilhar uma única instância na memória do sistema operacional porque a meta da virtualização é criar servidores virtuais que atuem de forma idêntica aos servidores físicos. Duas VMs não podem compartilhar um sistema operacional mais do que dois servidores físicos podem. Isso é verdadeiro independentemente de o sistema operacional ser Windows, Linux ou outro (como macOS).

Capacidade de transporte: as imagens de VM tendem a ser grandes (muitas vezes, com dezenas ou centenas de gigabytes), em parte porque também armazenam uma cópia completa do sistema operacional. Isso limita sua capacidade de transporte. Uma imagem de 1 MB pode ser movida facilmente de um computador para outro, mesmo com uma conexão moderadamente lenta. Uma imagem de VM de 200 GB, por outro lado, não é facilmente movida usando uma conexão de rede comum. Ela pode ser movida usando mídia física, como um pen-drive ou um disco rígido, mas isso representa desafios logísticos em cenários de computação em nuvem em que você não tem acesso aos servidores físicos em um data center.

Tempo de inicialização: inicializar uma VM é como inicializar um computador físico. O hardware virtualizado deve ser ligado e inicializado, o sistema operacional deve ser carregado e inicializado, os drivers de dispositivo devem ser carregados e conectados ao hardware virtualizado etc. Assim, uma VM, uma vez criada, pode exigir um minuto ou mais para iniciar. Embora um tempo de inicialização medido em minutos seja irrelevante em comparação ao tempo necessário para adquirir, instalar e configurar um servidor físico, é uma limitação significativa ao criar VMs em tempo real para atender à demanda crescente ou continuamente criar e destruir VMs para atender a alterações de cargas de trabalho.

Esses são apenas alguns dos motivos pelos quais está ocorrendo ampla adoção de contêineres, não apenas na computação em nuvem, mas também em data centers locais e computadores individuais. Nesta lição, vamos discutir o que são contêineres, como eles funcionam e os benefícios que oferecem. Também apresentamos o Docker, a plataforma de transporte em contêineres mais popular do mundo e apresentaremos algumas maneiras de integrá-lo a plataformas de nuvem populares.

O que é um contêiner?

Os contêineres estão revolucionando a TI e o desenvolvimento de software. Eles permitem agrupar software e arquivos em pacotes independentes conhecidos como imagens de contêiner, que são executadas em computadores diferentes (reais ou virtuais) de maneira consistente e previsível. A descrição a seguir foi extraída do site do Docker:

Um contêiner é uma unidade padrão de software que empacota o código e todas as suas dependências para que o aplicativo seja executado de forma rápida e confiável de um ambiente de computação para outro. Uma imagem de contêiner do Docker é um pacote de software executável leve e autônomo que inclui tudo o que é necessário para executar um aplicativo: código, runtime, ferramentas do sistema, bibliotecas e configurações do sistema.

Enquanto os hipervisores virtualizam o hardware, os contêineres virtualizam os sistemas operacionais. A Figura 7 ilustra as principais diferenças entre VMs e contêineres1. À esquerda, um servidor hospeda uma cópia do sistema operacional e uma cópia do runtime do Docker. Ele também hospeda seis aplicativos em seis contêineres, cada um deles utilizando o sistema operacional do host. À direita, o mesmo servidor hospeda três VMs, cada uma com a própria cópia do sistema operacional. Um determinado servidor normalmente pode hospedar várias vezes mais contêineres do que as VMs devido aos menores requisitos de recursos dos contêineres.

Figure 7: Containers vs. virtual machines

Figura 7: Contêineres vs. máquinas virtuais.

Os contêineres são semelhantes às máquinas virtuais, pois fornecem um ambiente previsível e isolado no qual o software pode ser executado. Porém, uma vez que os contêineres são menores do que as VMs, eles exigem menos RAM e são movidos mais facilmente de um computador para outro. Eles também são iniciados com mais rapidez, geralmente em apenas um ou dois segundos, pois não precisam virtualizar hardware nem carregar e inicializar um sistema operacional. Vários contêineres em execução em um único computador compartilham o mesmo kernel do sistema operacional, mesmo que os próprios contêineres sejam completamente diferentes, ou seja, contenham software diferente e sejam criados usando diferentes imagens de contêiner.

Os contêineres e as máquinas virtuais não são mutuamente exclusivos. Na verdade, eles frequentemente são usados juntos. Os usuários do Windows que executam o software empacotado em contêineres do Linux executam o Linux em uma VM e hospedam o Docker e o software em contêineres na VM. Na nuvem, os contêineres são hospedados em VMs, assim como outras cargas de trabalho de nuvem.

Os contêineres não substituem as máquinas virtuais nem devem ser considerados um equivalente funcional. Ao contrário das máquinas virtuais, os contêineres não permitem que vários sistemas operacionais sejam executados lado a lado no mesmo computador. Por exemplo, se o computador host executar o Linux, todos os contêineres nesse computador também deverão usar o Linux. (Os usuários do Windows costumam executar contêineres do Linux no Windows, mas isso funciona porque o Docker executa uma VM do Linux no computador com Windows e hospeda os contêineres na VM.) Além disso, como os contêineres não virtualizam o hardware, eles não são apropriados para aplicativos que executam tarefas em nível de sistema envolvendo interação direta de hardware. Uma maneira fácil de considerar isso é que os hipervisores virtualizam todo um computador, incluindo hardware, enquanto os contêineres virtualizam o software e usam o sistema operacional do host como a plataforma do sistema operacional.

Docker

O Docker é de longe a plataforma de contêiner mais popular. Ele é um software livre gratuito executado em todas as principais distribuições do Linux, bem como no Windows Server 2016. Em 2015, o Docker doou a especificação de imagem de contêiner e o código de runtime para a OCI (iniciativa de contêiner aberto) para ajudar a padronizar e aumentar o ecossistema do contêiner. Em 2017, o Docker doou um runtime de contêiner padrão do setor para a CNCF (Cloud Native Computing Foundation). Esse runtime foi criado com ênfase em simplicidade, robustez e portabilidade.

A Figura 8 mostra como um sistema que executa aplicativos em contêineres do Docker é arquitetado. Ele começa com o cliente do Docker, que é uma ferramenta usada para criar, executar e gerenciar contêineres e imagens de contêiner. (Uma imagem de contêiner constitui um blueprint para um contêiner em execução, apenas uma imagem de VM define o que é carregado em uma VM em execução.) Existem vários clientes do Docker, incluindo a própria interface de linha de comando do Docker, que é executada em todos os sistemas operacionais populares, e o Kitematic, que apresenta uma interface gráfica do usuário e é executado no Windows e no macOS. A Docker adquiriu o Kitematic em 2015 e o integrou à Docker Toolbox, que está disponível gratuitamente.

Figure 8: Docker architecture

Figura 8: Arquitetura do Docker.

Depois que uma imagem de contêiner é criada, ela é carregada em um repositório em um registro de contêiner. A finalidade de um registro de contêiner é armazenar imagens de contêiner e disponibilizá-las de forma pública ou privada. O Docker oferece o próprio registro de contêiner baseado em nuvem conhecido como Docker Hub, que fornece aos usuários repositórios públicos ilimitados gratuitos e um repositório privado gratuito. Ele também permite, e inclusive incentiva, que outras pessoas criem registros próprios e ofereçam o Registro do Docker de software livre para auxiliar em seus esforços. Essa é uma das razões pelas quais os principais provedores de serviços de nuvem, incluindo Amazon, Microsoft e Google, conseguiram oferecer registros compatíveis com o Docker em suas plataformas de nuvem.

Um contêiner é iniciado usando o cliente do Docker para emitir um comando ao daemon do Docker e especificar a imagem da qual o contêiner deve ser criado. (Um daemon é um programa executado em segundo plano no computador host.) Em seguida, o daemon cria um contêiner e carrega a imagem nele. Uma vez em execução, um contêiner pode ser iniciado e interrompido emitindo comandos do cliente do Docker. O cliente do Docker e o daemon do Docker não precisam residir no mesmo computador. Em um cenário típico, o cliente é executado em um computador, enquanto o daemon é executado em um servidor remoto e o cliente usa o protocolo SSH (Secure Shell) para transmitir comandos para o daemon.

Serviços de contêiner em computação em nuvem

Embora os usuários sejam livres para adotar uma abordagem de IaaS a contêineres criando VMs e instalando o runtime do Docker neles, os provedores de serviços de nuvem, reconhecendo a importância de contêineres, oferecem serviços de PaaS para dar suporte a aplicativos em contêineres na nuvem. O Azure oferece instâncias de contêiner do Azure, que fornecem um ambiente robusto, escalonável e fácil de usar para hospedar aplicativos em contêineres, bem como o Registro de Contêiner do Azure, que permite que as imagens de contêiner sejam hospedadas no Azure, em vez de no Docker Hub ou outros registros externos, e carregadas rapidamente em Instâncias de Contêiner do Azure. A Amazon oferece o AWS ECR (Elastic Container Registry) e o AWS ECS (Elastic Container Service), enquanto o Google oferece Registro de Contêiner e Contêineres no Mecanismo de Computação.

A Figura 9 ilustra como o ECR e o ECS da Amazon trabalham juntos para fornecer uma pilha do Docker baseada em nuvem para a hospedagem de contêineres e imagens de contêiner2. As imagens de contêiner são criadas e carregadas no ECR, que é um registro de contêiner compatível com o Docker semelhante ao Docker Hub. (As imagens de contêiner executadas na AWS não precisam ser armazenadas no ECR, mas armazená-las oferece várias vantagens, incluindo controle de acesso refinado usando a identidade AWS, criptografia automática, suporte o controle de versão de imagens de contêiner e carregamento mais rápido, especialmente se as imagens de contêiner forem armazenadas e executadas no mesmo data center.) De lá, as imagens são carregadas em contêineres hospedados no ECS ou em outros serviços de nuvem.

Figure 9: Containers in AWS

Figura 9: Contêineres na AWS.

O Registro de Contêiner do Azure e o as Instâncias de Contêiner do Azure funcionam da mesma forma, mas usam o Microsoft Entra em vez da Identidade da AWS para controlar o acesso às imagens de contêiner. Uma diferença entre o suporte de contêiner na AWS e no Azure é que a AWS usa uma combinação de software livre e tecnologia proprietária, enquanto a pilha de contêiner do Azure é de 100% compilada usando software livre. Assim, qualquer ferramenta que funcione com o Docker também funcionará com o Azure. Além disso, o Azure Cloud Shell e a CLI do Azure apresentam comandos para compilar e gerenciar imagens de contêiner do Docker. Esses comandos não eliminaram totalmente a necessidade de clientes do Docker, mas cobrem os casos de uso mais comuns e são otimizados para o Azure.

Mais recentemente, os provedores de serviços de nuvem começaram a adicionar suporte a contêineres a serviços de PaaS selecionados. O Azure, por exemplo, oferece o Aplicativo Web para Contêineres do Azure, que é, essencialmente, o Serviço de Aplicativo do Azure com a capacidade adicional de carregar software de uma imagem de contêiner. A Amazon adotou etapas semelhantes para integrar contêineres do Docker ao Elastic Beanstalk.

Orquestração de contêiner

O Docker fornece a infraestrutura para a criação e a execução de contêineres, mas é necessário um nível mais alto de supervisão para orquestrar as ações de contêineres e dimensionar cargas de trabalho em contêineres da mesma forma que as VMs são dimensionadas. Embora exista uma variedade de ferramentas de orquestração de contêineres, o setor foi amplamente estabelecido no Kubernetes, que cresceu de um projeto de software livre do Google, como o orquestrador preferencial. Hoje, os principais provedores de serviços de nuvem oferecem implementações gerenciadas do Kubernetes que facilitam a execução de contêineres em suas plataformas e a sua gestão com o Kubernetes. O "EKS" na Figura 9 representa o Serviço Kubernetes Elástico. O Azure oferece um serviço complementar chamado AKS (Serviço de Kubernetes do Azure), enquanto o Google Cloud Platform oferece o Mecanismo do Kubernetes.

Referências

  1. Docker (2019). O que é um contêiner?https://www.docker.com/resources/what-container.

Amazon (2019). Como o Amazon ECS funciona. https://aws.amazon.com/ecs/.

Verificar seu conhecimento

1.

Quais das afirmações a seguir sobre contêineres não é verdadeira?

2.

Você está tentando decidir se um aplicativo que sua empresa criou e deseja replicar deve ser hospedado em uma VM ou em um contêiner. Ele é um aplicativo Web executado no Linux e no Node.js. No entanto, em vez de armazenar dados no sistema de arquivos local, o aplicativo armazena dados no Armazenamento de Blobs do Azure. Este aplicativo é um candidato transporte em contêineres?

3.

Qual é a diferença entre um contêiner e uma imagem de contêiner?