Definição
Container é um software que empacota um software e todas as suas dependências para que elas sejam distribuídas e, desta maneira, consigam ser executado corretamente em qualquer ambiente para onde ele for levado.
Todo software, para ser executado, precisa que suas dependências sejam instaladas no sistema, por isso, muitas vezes é bem complicado de colocar um software para rodar. Existem ainda o problema das dependências cruzadas, onde você necessita de 2 softwares instalados em um ambiente (Software A e B), em alguns casos, Software A depende de uma biblioteca X, na versão 1.0, já o Software B, depende da versão 1.5 da mesma biblioteca X. Caso estas duas versões da biblioteca X sejam incompatíveis, esta instalação causará problemas e estes softwares não conseguirão ser instalados num mesmo ambiente.
Empresas que desenvolvem software, usualmente possuem vários ambientes diferentes, desde a máquina dos seus desenvolvedores, cada qual com os seus softwares instalados, até ambientes de teste e produção, os quais geralmente são idênticos. Quando um desenvolvedor completa uma tarefa, este código será colocado para rodar, os testes, em um ambiente de teste. Neste passo é possível pegar problemas de incompatibilidade de bibliotecas, mas isso só vai acontecer após o desenvolvedor completar o desenvolvimento.
Como os containers resolvem estes problemas
Conforme mostrado acima, os containers carregam todas as dependências, arquivos e configurações necessárias, para um software rodar. Com isso, é possível replicar o ambiente de produção, em qualquer lugar, inclusive na máquina dos desenvolvedores, e assim evita-se estes problemas de incompatibilidade. Dentro deles, os softwares rodam de uma maneira bem isolada, e muitos problemas de infra estrutura são evitados.
Quando eles surgiram
A história dos containers começa em 1979, com o surgimento de uma ferramenta, no Unix, chamada de chroot, este é considerado o primeiro dos containers. A partir dos anos 2000, com o surgimento do Jails do FreeBSD, do VServer e do Solaris Containers, estes softwares começaram a ficar mais populares e a ganhar novas funcionalidades. Em 2008 surgiu o LXC, que depois foi usado como base, para o software de container mais popular, ou o que mais popularizou a utilização dos containers, que foi o Docker, o qual só foi aparecer em 2013.
Aqui é importante notar que, o Docker nada mais é do que um facilitador da utilização, inicialmente do LXC, que já tinha sido inventado há 5 anos, quando ele surgiu. Mas devido a nova abordagem, como a construção de um ecossistema ao redor dos containers, uma nova maneira de monitorar e um modelo de imagens em camadas, foi o que o fez tão popular.
Esta ferramenta, sem dúvida é muito importante no ambiente de desenvolvimento hoje, pois ela facilitou muito a vida de quem pretende, ou precisa criar uma imagem de um container. Ela é amplamente utilizada pelos provedores de cloud, assim como pelas empresas de desenvolvimento.
Kubernetes, também é uma ferramenta muito importante no ambiente dos containers, por que ela foi criada para orquestrar containers. Com o Kubernetes, conseguimos colocar para rodar, um sistema distribuído, em vários containers, sendo eles réplicas um do outro, ou múltiplas partes do sistema. Através dele é possível configurar quanto cada parte do sistema está rodando, e controlar todos os componentes do sistema.
Um outro fato importante no mundo dos containers, aconteceu quando o Docker abriu o código do seu containerizador, o que se tornou Containerd, e algumas empresas se juntaram em uma associação chamada de CNCF, que hoje dita os padrões dos executores em cloud.
Qual é a diferença entre um Container e uma Máquina Virtual
As máquinas virtuais emulam o hardware, e nelas é possível instalar um Sistema Operacional, em cima do qual, você consegue instalar seus softwares. Já em um container, o Sistema Operacional é emulado, assim é possível você instalar bibliotecas, como se fosse em um Sistema Operacional novo, os containers conseguem isolar áreas da memória, do storage, e os processos que eles acessam, com isso você tem um ambiente isolado.
Para um provedor de Cloud, e para quem usa este tipo de serviço, os containers são muito interessantes, pois uma vez que, se você tiver que usar uma máquina virtual, pra cada um dos seus componentes, cada um deles terá um sistema operacional instalado, e isto ocupará memória e espaço em disco. Cada arquivo dos seus componentes, deverá carregar a instalação do Sistema Operacional e do ambiente do seu aplicativo.
Já em um container não, pois eles rodam sob o mesmo Sistema Operacional e partes deste sistema serão compartilhadas, como o kernel, o que o torna bem mais leve e cada arquivo de container, contém apenas o seu software e as suas dependências. Assim estes arquivos ficam bem menores o que torna mais fácil a sua administração. Dentro de um container, todas as partes compartilhadas do Sistema Operacional, terão acesso somente de leitura, o que garante que os containers não vão interferir nos Sistemas Operacionais hospedeiros, o que foi feito por medida de segurança.
Por serem menores, e mais leves, é muito melhor trabalhar com containers, pois menos dinheiro é gasto com as máquinas e com os dados armazenados, assim usar containers nos seus sistemas é vantajoso tanto para os provedores de cloud, os quais economizam com o hardware, quanto para os clientes, que conseguem ter softwares mais ágeis e um custo menor.
Arquitetura dos Containers
Um container virtualiza um Sistema Operacional, por isso ele consegue compartilhar o Sistema Operacional de uma máquina, em vários ambientes isolados, fazendo com que seja possível executar um software em um ambiente isolado.
Os containers são armazenados em arquivos de imagens, cada imagem contem a instalação dos pacotes necessários para seu software rodar, além de guardar as configurações de qual software será executado por ela.
Estas imagens podem ser publicadas, e existem repositórios públicos destas imagens, o que é uma das vantagens deles. Imagine que você tenha algumas dependências no seu projeto, antes de construir uma imagem do zero, é possível buscar por imagens que contenham estas dependências, e já estejam prontas, assim é só baixar a imagem, e executá-la.
Arquitetura do Docker
O Docker possui um processo que administra e cuida dos containers, este processo é persistente. Existe uma API de comunicação, que pode ser utilizada para enviar comandos para o docker, este processo cuida desta interface. O comando docker é o cliente do docker, o qual é responsável por permitir que o usuário interaja com as imagens dos containers.
Existem três tipos de classes de objeto no ambiente Docker, o container, a imagem e os serviços. O container é responsável por rodar as aplicações, ele é um ambientes padronizado e encapsulado. Eles são administrados pelo cliente ou pela API.
A imagem é um template, somente de leitura, que contem todas as informações necessárias para executar um container, elas são usadas por armazenar e distribuir as aplicações.
Um serviço de Docker permite que os containers sejam executados em diferentes processos, e máquinas, que se comunicam entre si, isso também é conhecido por Swarm.
Duas ferramentas são disponibilizadas pelo Docker, o compose, que é responsável por definir e rodar ambientes de múltiplos containers usando apenas um comando. Com ele é possível disparar comandos para múltiplos containers de uma vez só.
A outra ferramenta disponibilizada é o Swarm, o qual permite uma clusterização nativa de containers do docker. Nesta ferramenta permite rodar vários engines de Docker dentro de um processo de execução só.
Outras vantagens
Por ter apenas o ambiente, é possível construir uma imagem com apenas alguns megabytes, e quanto menor a sua imagem, mais rápido e fácil é para conseguir executá-la.
Com os containers tornou-se possível modularizar ainda mais as aplicações, já que basta produzir uma imagem, com cada módulo do sistema, e colocá-los para executar isolados uns dos outros, ao invés de rodar uma aplicação complexa dentro de uma mesma máquina. Aplicações mais modulares, permitem um monitoramento mais específico e a replicação de cada parte, quando necessário.
Uma máquina virtual, precisa de algum tempo até ser executada, pois o boot consome uma parte de startup, já em um container isto não acontece, a partir do momento que uma imagem começa a ser executada, ela já está executando aquele software para qual ela foi configurada.
Impactos dos containers
Não fossem os containers não seria possível haver a arquitetura serverless, pois nesta arquitetura, grandes máquinas ficam rodando, e cada serviço é um container, que será configurado para executar um serviço em específico. Assim que o serviço é chamado, a imagem do container começa a rodar, ao terminar, o container para, e as imagens são desligadas.
Para conseguir isso, uma série de dispositivos precisaram ser desenvolvidos, em cima dos containers, mas, aqui os orquestradores, tem um papel fundamental, pois eles conseguem ligar, e desligar (orquestrar) as imagens, quando elas forem necessárias. É possível termos máquinas ligadas a repositórios de imagens, e um serviço de fila, distribuindo as chamadas aos serviços entre diversas máquinas, conforme os serviços são chamados, as imagens são baixadas e executadas por estas máquinas, e isto permite que, um grande hardware seja compartilhado por diversos métodos, fazendo com que o custo daquele hardware seja distribuído para todos estes métodos. Assim ao invés de pagar pela execução de uma máquina 24/7, é possível pagar apenas pelo tempo que seu serviço foi executado.
O surgimento deste tipo de serviço, mexeu muito em como os softwares são desenvolvidos, isto impactou em arquitetura, modularização e diversos outros pontos dos sistemas distribuídos.
Kubernetes
Muitas vezes a comparação entre Docker e Kubernetes surge, mas essa comparação não deve ser feita, pois eles são coisas muito diferentes.
Kubernetes é um orquestrador, e com ele podemos criar clusters de imagens de containers rodando, podemos fazer isso em um cluster de máquinas virtuais. Isso é algo bem requisitado, imagine que você tem um cluster de máquinas, e vários clientes, cada um com a sua image de container, isso pode acontecer tanto dentro de uma mesma empresa, quanto em um provedor de serviços de execução.
Com o Kubernetes você controla quais imagens vão rodar onde, e com isso é possível configurar muitos detalhes. No Kubernetes, os containers são agrupados em pods, e através destes pods, é possível configurar quantas instâncias daquela imagem vai rodar, quando e por quanto tempo. Com isso, é possível definir detalhadamente a configuração de uma, ou mais apps.
Não é atoa que o kubernetes foi escolhido para gerenciar clusters em clouds, como o AKS na Azure, na Amazon no EKS, no Google Cloud GKE, na IBM Kubernetes Service, no Alibaba ACK e na Huawei CCE, ou seja todos os provedores cloud proveem, de alguma maneira, um serviço usando o Kubernetes.
Apresentação