O que são os containers? Uma introdução ao Docker
Tags: docker, containers, beginners, devops
Published: 2024-02-12 15:11:48

## 📦 O que é _container_?

_Containers_ são como a mais nova moda no mundo da tecnologia, uma **evolução da virtualização que permite rodar várias versões de um sistema operacional, cada uma na sua caixinha, no mesmo _host_**. A popularidade chegou com o Docker em 2013, que trouxe uma interface amigável e uma plataforma para compartilhar _containers_ prontos para uso. Nascidos no universo Linux, os _containers_ são baseados em tecnologias como `namespaces`, `cgroups` e `chroot`. O que são elas?

- Os `namespaces` garantem que **cada _container_ tenha sua visão particular do sistema operacional**, como se fosse um adolescente em seu quarto. Isso inclui seu próprio espaço de nomes de processo, rede e sistema de arquivos montado. 🏘️

- Os `cgroups`, ou grupos de controle, são como a mamãe Linux **controlando o uso de recursos** (como CPU, memória, disco I/O, rede, etc.) de um conjunto de processos, garantindo que ninguém passe dos limites. 🧐

- O `chroot` é como se fosse um truque de mágica que muda o diretório raiz percebido por um processo, fazendo com que o processo e seus descendentes **vejam um pedaço do sistema de arquivos como se fosse todo o sistema de arquivos**, tipo um tour guiado com acesso VIP.🚪

Confuso? 🫠 Vamos à um exemplo então:
Agora imagine que você está numa festa 🥳, nela há um buffet de mini pizzas individuais para cada convidado. Cada mini pizza é como um "_container_", com sua própria "visão" da pizza (seus próprios ingredientes), isolada das outras, tipo os `namespaces`. Além disso, é preciso garantir que cada pizza tenha uma quantidade equilibrada de ingredientes, tipo os `cgroups`, que controlam o uso de recursos de cada _container_. Por último, cada mini pizza está em sua própria bandeja de papel, o que impede que os ingredientes de uma pizza entrem em contato com os de outra. Isso é parecido com o `chroot`, que dá um nível extra de isolamento. 🍕😋

Então, a **computação em _container_ permite que você rode várias versões isoladas do sistema operacional no mesmo _host_, cada uma com seus próprios recursos e isolada das demais**, assim como você pode preparar várias mini pizzas, com suas especificidades, numa única festa. Ao contrário das máquinas virtuais (VMs), que emulam um ambiente completo, incluindo um sistema operacional convidado, os _containers_ compartilham o _kernel_ do sistema operacional hospedeiro, o que os torna mais leves e eficientes em termos de recursos. Essa abordagem oferece um equilíbrio entre isolamento e eficiência, sendo ideal para ambientes de desenvolvimento e implantação de aplicativos modernos.

✨ PS.: Um mantra para sempre te acompanhar quando te perguntarem **qual a diferença entre _máquina virtual_ (VM) e _container_ (Docker)**, tenha em mente que:

> Na máquina virtual você emula um novo sistema operacional dentro do sistema operacional do _host_. Já no _container_ você emula somente as aplicações e suas dependências.

## O que é o Docker?

Docker é uma plataforma de código aberto que foi lançada em 2013 por uma empresa chamada dotCloud, que depois se tornou Docker Inc. 👩‍💻 O Docker foi **construído com base na tecnologia de containerização do Linux, que já existia há um bom tempo, mas que ainda não tinha uma interface amigável** nem uma maneira padronizada de distribuir e rodar _containers_.

O Docker chegou e transformou a tecnologia de _containers_ em algo mais amigável e acessível. Ele se tornou um verdadeiro mágico da tecnologia, **empacotando software em pequenas unidades chamadas _containers_**. Esses _containers_, como vimos, são essas pequenas caixinhas que incluem tudo o que o software precisa para funcionar: código, tempo de execução, ferramentas do sistema, bibliotecas e configurações. É como se cada _container_ fosse uma pequena casa, com tudo o que você precisa para viver com conforto e autonomia. 🏡

### Todo mundo tem um passado...

Antes do Docker, já existiam algumas tecnologias que também trabalhavam com a ideia de isolar processos. Vamos falar um pouco sobre elas. Temos algumas como a LXC (Linux Containers), a Jails, a Solaris Zones e a VPS (Virtual Private Server).

A LXC, ou Linux _Containers_, é uma tecnologia que permite a criação e execução de múltiplas instâncias isoladas do Linux no mesmo _host_. É como se cada instância fosse um apartamento em um grande prédio, cada um com suas próprias características e configurações. 🏢

Jails é uma tecnologia introduzida pelo sistema operacional FreeBSD. Ela permite a execução de várias instâncias isoladas do FreeBSD no mesmo _host_, como se fossem várias casas geminadas compartilhando o mesmo terreno. 🏘️ 

Solaris Zones, também conhecido como Solaris Containers, é uma tecnologia do sistema operacional Solaris. Ela permite a execução de múltiplas instâncias isoladas do Solaris no mesmo _host_, como se fossem várias cabanas em uma ilha. 🛖🏝️ 

Já a VPS (Virtual Private Server) é uma tecnologia que permite a execução de múltiplas instâncias isoladas de um sistema operacional em um único servidor físico. É como se fossem várias lojas em um shopping, cada uma com seu próprio espaço. 🏬 

O Docker, por sua vez, pegou essas tecnologias existentes e deu um passo adiante. Ele introduziu uma camada de abstração e automação que torna o processo de criação, implantação e execução de aplicações em _containers_ muito mais simples e eficiente. Além disso, **o Docker introduziu um formato padronizado para a distribuição de aplicações em _containers_,** facilitando o compartilhamento e a colaboração, como se fosse uma rede social de _containers_.

Bom, espero que tenha gostado do artigo e que esclareça suas dúvidas dos princípios de Docker e o porquê é tão popular (e exigido para vagas em tech). 😄

Um curso que me ajudou muito a entender, criar este artigo e usar o Docker nos meus projetos foi o [Docker Essentials da LinuxTips](https://www.linuxtips.io/course/docker-essentials). É gratuito e qualidade de primeira! 🥇