Trabalhar com container no Linux é sem dúvida nenhuma a melhor forma de empacotar e isolar aplicativos, independente do seu ambiente de desenvolvimento.
Fazer a migração de um aplicativo utilizando container é muito mais fácil, pois você poderá utilizar a tecnologia no seu ambiente de teste, homologação e até em produção.
Quem utiliza containers no Linux terá a habilidade de diminuir conflitos entre equipes de desenvolvimento e outras áreas, com por exemplo a área de infraestrutura.
Hoje temos soluções opensource para trabalhar com containers no Linux, muitas vezes chamado de orquestração de containers no LINUX.
Soluções como Docker, Kubernetes hoje estão sendo utilizadas em grande escala. Outra solução que é muito utilizada por quem trabalha com containers em Linux é a LXC(Linux Containers).
Se você precisar de uma definição rápida sobre o que é um container LINUX: É literalmente um método de virtualização a nível de sistema operacional que permite executar múltiplos Sistemas Linux (denominados containers) usando um único kernel.
Se alguém me perguntar o que é um Container LINUX, eu procuro responder: “É diferente de virtualização de computadores“.
Fique tranquilo, nesse artigo eu irei pontuar muito bem a diferença de virtualização de computadores e a orquestração de containers no LINUX.
Virtualização vs Container no LINUX
Se você acabou de ler a introdução deste artigo reparou na definição rápida sobre containers no Linux. Certo?
Container Linux é literalmente um método de virtualização a nível de sistema operacional que permite executar múltiplos Sistemas Linux (denominados containers) usando um único kernel.
Mas isso não é o mesmo que virtualização?
Não, mas a resposta também poderia ser sim, eu gosto de dizer que é diferente de virtualização.
A principal diferença é que o container no LINUX compartilha o mesmo kernel do sistema operacional e consegue isolar os processos do seu aplicativo do resto do sistema.
Quando falamos em virtualização, temos a presença do HYPERVISOR onde é possível executar vários sistemas operacionais.
Essa imagem acima, demonstra muito bem essa situação, na imagem no lado esquerdo demonstra um sistema com virtualização, rodando 3 máquinas virtuais.
Já no lado direito da imagem temos o sistema utilizando o Container no Linux, repare que não precisamos de várias camadas.
Utilizando Container Linux não é necessário trabalhar com o HYPERVISOR ( que é o software para possibilitar a virtualização, tais como VirtualBox, Vmware Workstation ), só isso já irá reduzir o consumo de recursos do seu computador.
A virtualização executa vários sistemas operacionais diferentes, nesse ponto o Container Linux tem muitas vantagens, pois ele é executado em cima de um único sistema operacional, que é compartilhado com todos os containers.
Exemplo prático para você utilizar container no Linux
Vamos imaginar o seguinte cenário.
Imagine que você contratou um programador para desenvolver um aplicativo, ele trabalha no laptop dele, que tem uma configuração específica.
Então ao conversar com o seu programador, você descobre que o ambiente de desenvolvimento dele, utiliza a versão 5 da linguagem de programação XYZ.
Mas o seu ambiente de produção, já está rodando a versão 7 da linguagem de programação XYZ.
Para evitar qualquer problema na implantação, e no desenvolvimento, o seu programador te informa que irá criar um container no LINUX exatamente com a versão 7 da linguagem de programação XYZ, que é a mesmo do seu ambiente de produção.
Pronto, isso evita qualquer tipo de incompatibilidade entre o desenvolvimento e a implantação do sistema em produção.
Claro que esse é um exemplo muito básico, mas a utilização do container LINUX já se faz necessário, e principalmente resolve um problema sério de incompatibilidade no desenvolvimento do código fonte.
Se você precisar contratar mais um programador, para desenvolver outra parte desse mesmo sistema, seria fácil pegar a imagem do seu container LINUX e enviar para o novo programador.
E o mais interessante, é que esse mesmo container, com todas as bibliotecas necessárias para rodar o seu sistema, que foi desenvolvido por dois programadores poderá também se tornar o seu container LINUX em ambiente de produção.
Pensando já no ambiente de produção da sua aplicação, ele poderá rodar em um servidor com LINUX, em algum serviço cloud que executa container LINUX.
Então, agora que você já sabe que trabalhar com containers no LINUX poderá facilitar muito a sua vida, sendo você programador, empresário, ou administrador de sistema LINUX, vamos falar de soluções para trabalhar com containers.
Como surgiu o conceito dos containers
O que nós chamamos de container LINUX surgiu em 2000 com o FreeBSD jail.
O sistema FreeBSD já tinha uma tecnologia que permite 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, surgiu a primeira implementação de ambiente isolado rodando em LINUX.
Esse projeto foi criado por Jacques Gélinas, e com essa base, foi criado o ambiente de containers LINUX que estamos utilizando hoje.
Só para você ter um idéia, eu comecei a utilizar LINUX em 1999, em 2002 eu já trabalhava 100% com LINUX e o projeto VServer já estava a todo vapor.
Em pouco tempo, o kernel do LINUX começou receber implementações para trabalhar nativamente com o isolamento do sistema operacional
A implementação do kernel com “cgroups”, e “systemd” ajudaram muito na separação eficaz do ambiente rodando em cima do kernel.
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 inclusive é utilizada por várias distribuições do LINUX hoje em dia).
O systemd por sua vez configura o espaço do usuário e gerencia processos, é usado pelo cgroups para dar mais controle sobre os processos isolados. (https://www.freedesktop.org/wiki/Software/systemd/)
Outra implementação do Kernel que ajudou muito no desenvolvimento dos containers em LINUX foi o namespaces de usuários.
Resumindo 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 (https://lwn.net/Articles/528078/)
E claro, não poderia deixar de falar do projeto Linux Containers (LXC), esse é o projeto base.
Hoje se existem muitas soluções para utilizar containers no LINUX com toda certeza devemos muito ao trabalho feito pelo LXC.
Ferramentas, bibliotecas, associações de linguagens, experiência do usuário na utilização de containers foram desenvolvidas por esse projeto.
Contudo, o mercado de hoje é praticamente dominado por uma ferramenta, o docker.
Por que o Docker é sinônimo de container no LINUX?
É muito interessante a história do Docker. (https://www.docker.com/)
Hoje em dia, falar em Container no LINUX e não comentar sobre Docker parece até estranho.
O Docker está para os containers no LINUX assim como, O Apache HTTPd server está para os servidores WEB, ou até mesmo como o Postfix está para os servidores de email. (mas só para constar, o mercado de servidores de email era baseada em sendmail)
Container em Linux iniciou com o projeto VServer em 2001, mas o Docker surgiu somente em 2008.
A tecnologia do Docker é baseada no LXC, mas isso não quer dizer que eles são iguais.
Sim, a ferramenta para gerenciar Container no LINUX mais famosa e mais utilizada hoje em dia é o Docker, tanto que ele faz parte do Open Container Initiative (OCI) (https://www.opencontainers.org/), cujo objetivo é padronizar as tecnologias de containers no setor open source.
Porque utilizar Containers?
Compatibilidade é uma das palavras que definem muito bem a necessidade de utilização de containers no LINUX.
Desenvolver, gerenciar e implantar aplicativos com a facilidade da utilização de imagens de container LINUX é outro nível.
Lembra do nosso exemplo, aquele programador que você contratou, poderá simplesmente gerar uma imagem da aplicação rodando, e pronto.
Você, sendo administrador pode poderá rodar essa imagem no seu servidor em ambiente de produção, quando surgir uma nova versão da aplicação, você precisará apenas repetir esse envio da nova imagem.
E o melhor, executar containers, exigem menos recursos que a execução de máquinas virtuais.
Containers podem ser criados também como microsserviços, onde você poderá ter vários containers, cada um com partes de sua aplicação, dependendo do tamanho do seu sistema.
E você, já está trabalhando com alguma solução de container no LINUX?
Como vimos, qualquer profissional LINUX, ou até mesmo quem trabalha com desenvolvimento poderá tirar proveito dos containers em LINUX.
Se você é um administrador de sistemas LINUX, o conhecimento em containers é mais uma habilidade que você deve considerar.
O uso do Docker é sem dúvida nenhuma a grande revolução do DEVOps atual.
Até a próxima.
Pedro Delfino