Docker, containers, conteinerização são assuntos muito presentes no dia de quem trabalha com tecnologia atualmente. Nessa série de blogposts vamos entender o que são essas tecnologias e como usá-las.
O QUE É UM CONTAINER?
Quando a gente fala em container, sempre vem a imagem daqueles blocos de metal gigantes, que transportam as nossas comprinhas da china ou de outros países pra cá, mas olha, um container pode ser muito mais que isso.
Então o que é um container? Antes de responder essa pergunta é necessário entender que quando falamos de container, estamos falando de isolamento. Mas como assim isolamento? Quando subimos um container e esse container está rodando na nossa máquina, não existe nenhuma camada de abstração gigante como um hypervisor e desta forma é como se isolassemos um pedaço ali da nossa máquina e o atribuísse para nosso container.
Com esse isolamento temos processos que são somente desse container, mount points, usuários, redes, etc, e outros container não conseguem enxergar nada que não seja nele próprio. Um ponto legal é que conseguimos fazer isolamento de recurso para quando eu quero dedicar um determinado pedaço do meu cpu, da minha memória, da taxa de I/O de input/output para um container.
Então um container é um bloco isolado, que “virtualiza” as nossas aplicações e compartilha o kernel do sistema operacional.
E como funciona o container, pensando na nossa aplicação, seja ela qual for, caso seja necessário alguma bibliotecas, características do sistema operacional, dependencias, o container encapsula tudo para nosso uso e caso a gente precise de mais alguma coisa, ele utiliza o kernel do nosso sistema operacional hospedeiro. Um container não possui um kernel próprio.
CONTAINERS x VM’s
Uma dúvida muito comum é sobre máquinas virtuais e containers. Mas então, um container é uma máquina virtual pequena? A resposta é não, não tem nada haver com VM, por mais que dê a entender ou seja um pouqinho semelhantes.
A máquina virtual emula todo um sistema operacional e muita das vezes com um hardware também, já o container não, podemos pensar nele como a nossa aplicação
FERRAMENTAS E COMPONENTES FUNDAMENTAIS
Para entender mais sobre o funcionamento de containers, precisamos falar um pouco sobre algumas tecnologias, recursos, ferramentas fundamentais no seu uso. Elas são os namespaces, Cgroups e o Union File System.
NAMESPACES
Para falar sobre container, é importante falar sobre namespaces e para entendermos isso melhor, vamos usar uma analogia. Vamos imaginar que você viva com sua família na sua casa e cada integrante tem o seu próprio quarto. Os namespaces são como os quartos, que são espaços separados/isolados para que cada integrante da sua familia possa ter e guardar seus objetos, viver de forma tranquila sem intereferir no espaço dos demais. Então assim, se você precisa de um travesseiro para dormir, você vai até o seu quarto (namespace) para pegar e não no quarto da sua irmã.
Então, podemos ententer que um namespace é uma forma de isolar e separar vários recursos e processos no Linux. E com essa separação, os processos em um namespace são conseguem afetar ou acessar diretamente recursos em outro namespace. Quando muitas aplicações, serviços, programa estão trabalhando ali ao mesmo tempo os namespaces são super uteis para garantir o isolamento e segurança.
No Linux, existem vários tipos de namespace, cada o objetivo de isolar um componente específico:
- PID (Process ID): Não deixa com que processos de um namespace vejam ou interajam com processos de outro namespace.
- Network: Aqui os recursos de rede como regras de firewall, tabelas de roteamento e interfaces são isolados também e assim cada namespace tem uma configuração de rede personalizada e independente.
- Mount: O isolamento também acontece nos pontos de montagem e assim as modificações em um namespace não afetam outros namespaces.
- User: isola os IDs de usuário e grupo para que os processos dentro de um namespace possam ter seus próprios IDs de usuário e grupo sem influenciar os IDs dentro de outros namespaces.
- IPC (Inter-process Communication): Nos namespace de comunicação entre processos isolamento acontece na comunicação dos processos de namespace. Assim não dá pra para que processos em vários namespaces se comuniquem diretamente, isolando os recursos de comunicação entre processos.
- UTS (UNIX Time-sharing System): Aqui cada namespace pode ter seu próprio nome de host e domínio independente e exclusivo.
- Esses namespaces são fundamentais para a criação de ambientes virtuais e contêineres, como Docker e Kubernetes, onde cada contêiner pode ter seu próprio conjunto isolado de recursos e processos, garantindo que os aplicativos e serviços executados em contêineres diferentes não interfiram uns nos outros.
Em resumo, um namespace no Linux é como um “quarto” separado que isola e protege os recursos e processos do sistema, garantindo que cada aplicativo ou serviço possa funcionar de forma independente e segura, sem interferir nos outros.
CGROUPS
Os Cgroups do Linux, uma ferramenta que o kernel tem a seu dispor, possibilitam a regulação e o controle do uso de recursos do sistema. Quando pensamos nos Cgroups, falamos de coisas como a CPU, a memória e a entrada/saída (I/O), todos vitais para a execução de processos ou conjuntos de processos. Com isso, temos uma distribuição de recursos mais justa entre os processos do sistema operacional, evitando que um único processo possa se apropriar de todos os recursos, o que prejudicaria o desempenho de outros programas.
Para compreender melhor vamos usar uma analogia, onde consideremos uma situação em que você está organizando um evento de tecnologia. Nesse evento, ocorrerão diversas palestras sobre tópicos como computação em nuvem, desenvolvimento de software e redes. Cada uma dessas palestras exige recursos específicos — espaços adequados, tempo de apresentação e equipamentos. Os Cgroups atuam como as normas que você, enquanto organizador, implementa para assegurar que cada apresentação obtenha os recursos que necessita sem comprometer as demais.
A seguir, veja alguns exemplos de como os Cgroups são implementados:
- Restrição da CPU: Vamos usar uma analogia comum para entender isso. Imagine ter um editor de texto e um jogo pesado rodando ao mesmo tempo no seu computador. O jogo, por ser mais pesado, tende a consumir mais recursos, deixando pouco para o editor de texto, que pode ficar lento ou até travar. Como se fosse um monte de crianças correndo para pegar o último doce, quem for mais rápido leva! Mas usando os Cgroups, podemos equilibrar essa distribuição de processamento, garantindo que todos os aplicativos funcionem sem problemas.
- Gerenciamento de Memória: Da mesma forma que controlamos o poder de processamento, também podemos administrar o uso da memória usando os Cgroups. Aqui usamos Cgroups para garantir que cada aplicativo use apenas o que precisa, evitando que o sistema fique sobrecarregado.
- Controle de entrada/saída (E/S): Cgroups também permite regular o uso de dispositivos de armazenamento, como SSDs e HDs e com os Cgroups, nós limitamos a taxa de transmissão de dados para que nenhum aplicativo monopolize o acesso aos dispositivos, mantendo o sistema equilibrado e funcionando de maneira eficiente.
- Desta forma, os Cgroups podem ser resumidos como um recurso extremamente útil e adaptável, que habilita o controle e a restrição de uso dos recursos do sistema operacional por processos isolados ou conjuntos de processos. Com isso, se consegue um equilíbrio no desempenho das aplicações, otimizando a estabilidade e eficiência do sistema em seu conjunto.
UNION FILE SYSTEM
O Union File System (UFS) representa uma variedade de sistema de arquivos, que deixa a gente combinar varias camadas de arquivos e diretórios em uma visualização unificada. Ele é majoritariamente empregado em tecnologias de contêineres, como Docker, para a administração eficiente e flexível das camadas de arquivos de um contêiner.
Ao lidar com contêineres, o Union File System possibilita que múltiplas camadas sejam fundidas em uma única imagem de contêiner. Cada camada pode carregar informações específicas, como arquivos de configuração ou bibliotecas de software, e pode ser compartilhado entre contêineres distintos para economia de espaço e tempo.
Resumindo, o Union File System funciona como um manual de receitas multicamadas, onde cada camada equivale a um conjunto de arquivos e diretórios. Ele permite a junção dessas camadas de maneira eficaz e versátil, fornecendo uma visualização unificada dos arquivos e facilitando a administração de contêineres.
BENEFICIOS DE USAR CONTAINERS
O uso de containers nas nossas aplicações no dia a dia deixa tudo mais performático e com menos gasto de recurso.
Um dos maiores pontos benéficos do uso de containers é a portabilidade. Se eu uso um container em um servidor e migro ele para um outro com um outro S.O, ele ainda sim vai funcionar de maneira bem performática. Por ser bem menor e mais simples, é bem mais fácil de movimentar do que uma VM.