Container

Você sabe o que é um container em Linux? Hoje, vamos mostrar o que são, como funcionam e para que servem esses famosos recursos tecnológicos!


| Se você apoia nosso site, desative o AdBlock quando visitá-lo, inclusive em Mobile!
Os anúncios são poucos e não invasivos. Se quiser contribuir com nosso trabalho, clique em qualquer banner de sua preferência, exceto dos Parceiros. 
Mais detalhes clicando aqui.


1. Introdução

Falar de container é algo relativamente complexo e para isso eu gostaria de contextualizar primeiro. Muito se compara com máquina virtual ou ainda com VPS – Servidor Privado Virtual -. Antes de prosseguir, vamos colocar alguns pingos nos I’s!

1.1 Máquina Virtual

As máquinas virtuais, ou VMs, são uma solução de software conhecida como virtualização. A virtualização é quando se cria uma versão virtual de um hardware. A partir de um software – o hypervisor – é feita a simulação de um hardware, com sistema operacional, dispositivos de armazenamento, placas de rede e outros.

Logo, o hypervisor cria e gerencia máquinas virtuais que estão hospedadas no servidor físico. Ele estabelece limites estritos para essas máquinas, como quantidade de memória RAM usada, espaço em disco, transferência, entre outros. Caso seja necessário, você pode aumentar ou diminuir a quantidade de recursos, caso seja necessário.

Já abordamos máquinas virtuais anteriormente nesta publicação!

1.2 VPS

O Servidor Privado Virtual (VPS), é, nada mais que, uma máquina virtual, gerenciado por um hypervisor que pode ser devidamente configurado de acordo com as suas necessidades.

O uso de VPS é mais econômico do que um servidor dedicado, por consumir uma fração dos recursos do segundo. Com isso você pode rodar vários servidores em um mesmo hardware, diminuindo o custo final.

Cada VPS pode ser um sistema operacional, seja ele Windows, Linux ou até macOS, porém todos rodando ao mesmo tempo em um mesmo hardware.

Porém, uma máquina virtual é muito pesada. Ela roda uma instância totalmente isolada do sistema operacional – kernel + rootfs , aumentando consideravelmente o consumo de recursos de hardware – CPU, memória, I/O. E dessa necessidade de algo enxuto, surgiu o Container.

2. Container

O Container é “mais” que uma máquina virtual e “menos” que um sistema operacional, se for usado de comparação uma configuração direta no hardware. Fica no meio termo, compartilhando recursos de hardware com o sistema base, porém sem virtualização, ou seja, o acesso ao hardware e a sua funcionalidade é direta.

Mas para aprofundar um pouco em containers, vamos contextualizar historicamente!

2.1 História

O que nós chamamos de container – ou contêiner no bom português – surgiu nos anos 2000 com o FreeBSD jail. O sistema FreeBSD já tinha uma tecnologia que permitia particionar o sistema operacional em vários subsistemas, o que eles chamavam de “Jails”.

O principal conceito retirado do “Jails” foi a capacidade de criar processos em ambiente modificado por chroot, sendo que o sistema de arquivos, usuários e rede estão virtualizados.

Com o surgimento do projeto VServer em 2001, desenvolvido por Jacques Gélinas, surgiu a primeira implementação de ambiente isolado rodando em Linux.

Um dos motivos que fundamentaram a implementação dos “namespaces”, do “cgroups”, o próprio LXC e do polêmico “systemd” foram para melhorar a separação eficaz do ambiente rodando em cima do kernel, para fomentar os containers!

Essa implementação do cgroups no kernel controla e limita o uso de recursos por um processo ou grupo de processos, e o systemd é um sistema de inicialização que configura o espaço do usuário e gerencia processos. Se você controlar a inicialização, já imagina o que isso permitirá: Inicializar múltiplos sistemas paralelamente, cada um com suas permissões, dispositivos e usuários!

Já com o namespaces o kernel do LINUX permite que os usuários e grupos podem ter privilégios para realizar determinadas operações dentro de um container, sem ter esses mesmos privilégios fora dele. E claro, não poderia deixar de falar do projeto Linux Containers (LXC), esse é o projeto base.

2.2 LXC

O LXC (Linux Containers) é um projeto composto por bibliotecas e aplicações que fornecem um conjunto de ferramentas de linha de comando para criar e gerenciar a execução de containers no Linux. O LXC é também um software livre, e a maior parte do código é licenciado segundo a licença GNU LGPL (Lesser GPL) versão 2.1.

Comparando em recursos uma máquina virtual ao lado de um Container, observe que a máquina virtual ainda tem a camada do hypervisor + sistema operacional completo executando antes das aplicações e binários/bibliotecas possam executar. No container isso é mais “direto”, gerenciado apenas pelo sistema operacional:

Virtualización de sistemas: máquinas virtuales frente a contenedores

Existe um projeto da Linux Foundation chamado Open Container Initiative que possui o objetivo de definir e manter padrões abertos sobre a tecnologia de containers no Linux.

Atualmente existem duas especificações definidas, a Runtime Specification (runtime-spec) que define padrões para gerenciar a execução de containers, e a Image Specification (image-spec), que padroniza o formato das imagens de containers.

Apesar do sucesso do LXC, o mercado de hoje é praticamente dominado por uma ferramenta, o Docker, baseado no LXC.

3. Docker

O termo Docker pode se referir a muitas coisas: um projeto da comunidade open source; as ferramentas resultantes desse projeto; a empresa Docker Inc., principal apoiadora do projeto; e as ferramentas compatíveis formalmente com a empresa. O fato de que as tecnologias e a empresa têm o mesmo nome pode causar uma certa confusão.

De forma resumida:

  • O software de TI “Docker” é uma tecnologia de containerização para criação e uso de containers Linux.
  • A comunidade open source do Docker trabalha gratuitamente para melhorar essas tecnologias para todos os usuários.
  • A empresa Docker Inc. se baseia no trabalho realizado pela comunidade do Docker, tornando-o mais seguro, e compartilha os avanços com a comunidade em geral. Depois, ela oferece aos clientes corporativos o suporte necessário para as tecnologias que foram aprimoradas e fortalecidas.

O Docker utiliza o modelo de container para “empacotar” uma aplicação que, após ser transformada em imagem Docker, pode ser reproduzida em qualquer plataforma; ou seja, caso a aplicação funcione sem falhas em seu notebook, funcionará também em um servidor ou em outro computador comum.

Construa uma vez, execute onde quiser. Essa facilidade é o que o torna uma solução sobre as já existentes soluções: LXC, namespaces, systemd e cgroups! Todas trabalhando juntas, de forma quase automática, permitindo implantar um container em praticamente qualquer ambiente.

E quando se possui um conjunto de Dockers, entra +1 ferramenta na brincadeira!

5. Kubernetes

Por fim, Kubernetes, ou também como descrito K8s, é um sistema de orquestração de containers open-source que automatiza a implantação, o dimensionamento e a gestão de aplicações em containers.

Enquanto que o Docker e o LXC são capazes de criar e executar containers, o Kubernetes é capaz de automatizar o gerenciamento de clusters desses containers, escalando a solução conforme a necessidade de forma mais autônoma, dinâmica e eficiente!

6. Vantagens

Com o que vimos até agora podemos definir que um container:

  • Facilita a distribuição de aplicações e possibilita sua execução em ambientes totalmente diferentes. O processo de atualização de aplicações também fica mais simples, já que para atualizar uma aplicação e suas dependências basta atualizar a imagem do container.
  • É uma solução que escala muito melhor, sendo possível executar e controlar diversas instâncias de um container ao mesmo tempo em lugares diferentes.
  • Se bem configurado, um container pode rodar de forma totalmente isolada do sistema operacional hospedeiro, aumentando a segurança do sistema.
  • Possuem melhor performance e economia de recursos quando comparados à solução de virtualização com máquina virtual tradicional.

6.1 Desvantagens

E claro, existem desvantagens pontuais, entre elas destaco:

  • Se não for devidamente bem configurado, um container pode representar um grande risco á segurança do sistema que o hospeda.
  • Um container só pode executar uma aplicação de sistema desenvolvida para seu sistema hospedeiro!
    Ou seja, você não pode rodar um container Windows dentro de uma máquina Linux, nem um container Linux dentro de uma máquina Windows. Só binários de Windows rodam em containers Windows e binários de Linux rodam em Linux.
    Por isso container não é uma solução viável para casos como substituto ao WINE/Proton para rodar games do Windows no Linux por exemplo.

O Windows Subsystem for Linux da Microsoft é algo mais próximo de uma máquina virtual do que de um container, por executar um sistema operacional completo que consome mais CPU e RAM do que uma mera aplicação. Inclusive é possível instalar containers dentro do WSL2!

6.2 Acho que ja vi isso antes…

Não muito tempo atrás eu falei aqui no site sobre os pacotes SNAP do Ubuntu: São uma forma de criar containers de aplicações, desenvolvido pela Canonical, isolando tudo do resto do sistema e permitindo sua execução independente da distribuição linux! E as vantagens citadas cabem aqui.

De certa forma é uma solução interessante mas como mencionei na publicação, a solução da Canonical é um pouco diferente e tem algumas controvérsias. Os detalhes estão descritos na publicação, clicando aqui.

7. Conclusão

Com certeza a tecnologia container veio para ficar: É versátil, leve, eficiente e possui uma ampla adoção por ser uma solução corporativa para grandes desenvolvedores ou mesmo uma solução mais palpável para pequenos desenvolvedores.

Não é um substituto á máquina virtual, com certeza. Cada um tem seu espaço no mercado! A  questão é saber escolher e adotar aquela solução que for mais conveniente para a ocasião.

Fontes:
e-tinet
redhat1
sergioprado
hostnet
redhat2
stack.desenvolvedor.expert

Deixe um comentário