- Compreendendo a Tecnologia de Contêineres
- Tecnologia de Contêineres Docker
- Processos Dentro do Contêiner
- O Mecanismo Namespace
- Tecnologia de Namespace do Linux
- Vários Namespaces em Ação
- Mount Namespace
- Network Namespace
- Outros Namespaces
- O Princípio de Implementação dos Contêineres Docker
- Comparando Contêineres com Máquinas Virtuais
- A Virtualização Leve do Docker
- Conclusão
Compreendendo a Tecnologia de Contêineres
Contêineres são um tipo de tecnologia de sandbox. Como o nome sugere, um sandbox é uma tecnologia que pode “empacotar” aplicações como um contêiner, garantindo que as aplicações não interfiram umas nas outras devido a limites estabelecidos. Além disso, as aplicações contidas nesses “contêineres” podem ser migradas e executadas em diferentes ambientes de sistema.Antes de mergulhar nos princípios por trás da tecnologia de contêineres, é essencial entender o conceito de processos. A representação estática de um processo é um programa, normalmente descansando silenciosamente em um disco. Uma vez em execução, ele se transforma na soma dos dados e estados dentro do computador — sua representação dinâmica. A funcionalidade central da tecnologia de contêineres envolve criar um “limite” para os processos, restringindo e modificando seus comportamentos dinâmicos.
Tecnologia de Contêineres Docker
Para a maioria dos contêineres Linux, incluindo o Docker, a tecnologia Cgroups é usada principalmente para impor restrições, enquanto a tecnologia Namespace é o método principal para modificar a visão do processo.Imagine que você tem um projeto Docker rodando em um sistema operacional Linux, por exemplo, Ubuntu 22.04. Vamos criar um contêiner para experimentar:
$ docker run -it busybox /bin/sh
Este comando Docker inicia um contêiner baseado na imagem busybox e executa uma sessão de shell interativa dentro dele.
docker run: Cria e inicia uma nova instância de contêiner.-i: Mantém a STDIN aberta mesmo sem um terminal conectado, permitindo interação com o contêiner.-t: Atribui um pseudo-terminal ou terminal, criando um ambiente de shell interativo./bin/sh: Especifica o comando a ser executado na inicialização do contêiner, que neste caso, inicia uma sessão de shell dentro do contêiner.
Processos Dentro do Contêiner
Assim, a máquina Ubuntu se torna um host, e um contêiner executando /bin/sh opera dentro dele. Este exemplo e seu princípio subjacente devem ser familiares para usuários experientes do Docker. Se você executar o comando ps dentro do contêiner, notará algo intrigante:
/ # ps
PID USER TIME COMMAND
1 root 0:00 /bin/sh
10 root 0:00 ps
Aqui, o /bin/sh inicial executado dentro do Docker é o processo número 1 (PID=1) dentro do contêiner, com apenas dois processos em execução. Isso implica que o /bin/sh e o comando ps que acabamos de executar foram isolados em um ambiente distinto do host.
O Mecanismo Namespace
Como isso é alcançado?Normalmente, quando um programa /bin/sh é executado no host, o sistema operacional atribui a ele um ID de processo, como PID=100, que o identifica de forma única. Ao executar este programa dentro de um contêiner Docker, o Docker aplica uma “ilusão” para que o processo, que na verdade é PID=100, acredite que é o primeiro processo (PID=1). Este mecanismo manipula o espaço de processos das aplicações isoladas, permitindo que elas vejam IDs de processo recalculados.
Tecnologia de Namespace do Linux
O uso de Namespaces é bastante interessante: é apenas um parâmetro opcional para criar novos processos no Linux. A chamada de sistema para criar processos no Linux é clone(), conforme abaixo:
int pid = clone(main_function, stack_size, SIGCHLD, NULL);
Esta chamada cria um novo processo e retorna seu ID de processo, pid. Ao usar a chamada de sistema clone() para criar um novo processo, pode-se especificar o argumento CLONE_NEWPID:
int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL);
O novo processo criado então “verá” um espaço de processo fresco onde seu PID é 1. Esta “ilusão” não altera o PID real no espaço de processo do host, que permanece o valor real, como 100.
Vários Namespaces em Ação
A execução repetida da chamada clone() acima criaria vários PID Namespaces. Cada aplicação de processo do Namespace acredita ser o primeiro processo dentro de seus respectivos contêineres, ignorando o espaço de processo real do host ou os detalhes de outros PID Namespaces. Além do PID Namespace, o Linux oferece os Namespaces Mount, UTS, IPC, Network e User para “obscurecer” vários contextos de processo.
Mount Namespace
- Mount Namespace: Permite que processos isolados vejam apenas os pontos de montagem relevantes para o Namespace atual, ou seja, os processos dentro do contêiner desconhecem outros pontos de montagem no host.
Network Namespace
- Network Namespace: Fornece a processos isolados uma visão dos dispositivos de rede e configurações específicas do Namespace atual. Cada Network Namespace tem seus próprios dispositivos de rede, endereços IP, tabelas de roteamento e números de porta, separados do host e de outros Namespaces.
Outros Namespaces
- UTS Namespace: Isola o nome do nó (hostname) e as informações do nome de host da rede.
- IPC Namespace: Segrega recursos para comunicação entre processos, como filas de mensagens e semáforos.
- User Namespace: Isola IDs de usuário e grupo, permitindo mapear IDs de usuário do contêiner para IDs diferentes no host para maior segurança.
O Princípio de Implementação dos Contêineres Docker
Este é o princípio fundamental de implementação dos contêineres Linux. Assim, o conceito aparentemente complexo dos contêineres Docker envolve essencialmente especificar um conjunto de parâmetros Namespace ao criar um processo de contêiner. Consequentemente, o contêiner só pode “ver” os recursos, arquivos, dispositivos, estados ou configurações limitados pelo Namespace atual, permanecendo completamente alheio ao host e a programas não relacionados.
Comparando Contêineres com Máquinas Virtuais
Contêineres, portanto, são um tipo especial de processo. Ao considerar a ideia de alocar um espaço independente para processos, as máquinas virtuais vêm à mente. Elas simulam hardware através de software Hypervisor, executando um sistema operacional convidado completo para alcançar o isolamento da aplicação. Em contraste, os contêineres Docker alcançam o isolamento através das tecnologias Namespace e Cgroups enquanto compartilham o kernel do sistema operacional do host.
A Virtualização Leve do Docker
O Docker é frequentemente chamado de tecnologia de virtualização “leve” porque utiliza diretamente os recursos do host, sem necessidade de simulação de hardware ou execução de um sistema operacional adicional. Isso resulta em vantagens significativas em relação às máquinas virtuais tradicionais em termos de velocidade de inicialização, utilização de recursos e desempenho.
Conclusão
A tecnologia de contêineres Docker fornece um ambiente isolado, porém leve, para processos de aplicação através das tecnologias Namespace e Cgroups. Esta tecnologia permite que os contêineres iniciem rapidamente, sejam executados de forma eficiente e mantenham isolamento do host e de outros contêineres, tornando-se uma tecnologia indispensável na computação em nuvem moderna e em arquiteturas de microsserviços.
Novita AI, a plataforma única para criatividade ilimitada que dá acesso a mais de 100 APIs. De geração de imagens e processamento de linguagem a aprimoramento de áudio e manipulação de vídeo, pagamento conforme o uso e barato, libera você das preocupações com manutenção de GPU enquanto constrói seus próprios produtos. Experimente gratuitamente.
