Containers são uma forma de virtualização em nível de sistema operacional que permite executar aplicações isoladas dentro do mesmo kernel Linux.
Ferramentas como Docker utilizam recursos nativos do kernel para criar esse isolamento.
Diferente de máquinas virtuais, containers não virtualizam hardware.
Containers vs Máquinas Virtuais¶
| Característica | Container | VM |
|---|---|---|
| Virtualização | Sistema operacional | Hardware |
| Kernel | Compartilhado com host | Kernel próprio |
| Inicialização | Milissegundos | Minutos |
| Consumo de recursos | Baixo | Alto |
| Tecnologia base | Namespaces + cgroups | Hypervisor |
Arquitetura de uma VM:
Hardware
↓
Hypervisor
↓
VM (Kernel + Userspace)
Arquitetura de containers:
Hardware
↓
Linux Kernel
↓
Containers (userspace isolado)
Componentes que tornam containers possíveis¶
O isolamento dos containers é construído usando três mecanismos principais do kernel Linux:
- Namespaces
- cgroups
- Filesystem em camadas (OverlayFS)
Namespaces¶
Namespaces criam uma visão isolada dos recursos do sistema.
Cada container recebe seu próprio namespace, fazendo com que ele acredite estar rodando sozinho no sistema.
Principais namespaces:
| Namespace | Função |
|---|---|
| PID | isolamento de processos |
| NET | isolamento de rede |
| MNT | isolamento de filesystem |
| IPC | comunicação entre processos |
| UTS | hostname |
| USER | usuários e permissões |
PID Namespace¶
Isola os processos.
Dentro do container:
PID 1 -> aplicação principal
PID 2 -> worker
O container não consegue ver processos do host nem de outros containers.
NET Namespace¶
Cada container possui:
- sua própria interface de rede
- tabela de roteamento própria
- portas isoladas
Dentro do container:
eth0
lo
MNT Namespace¶
Isola o sistema de arquivos visível.
/
├── bin
├── etc
├── app
Esse filesystem é montado a partir de camadas de imagem.
cgroups (Control Groups)¶
cgroups são responsáveis por limitar e controlar o uso de recursos do sistema.
Eles controlam:
| Recurso | Função |
|---|---|
| CPU | limitar processamento |
| Memória | limitar RAM |
| Disk I/O | limitar acesso ao disco |
| Network | limitar tráfego |
Exemplo:
Container A
CPU: 1 core
RAM: 512MB
Container B
CPU: 2 cores
RAM: 2GB
Se um container exceder o limite de memória, o kernel pode ativar o OOM Killer.
Filesystem em camadas¶
Containers utilizam filesystem em camadas usando OverlayFS.
Imagem:
Layer 1: base (ex: Ubuntu)
Layer 2: runtime (ex: Python)
Layer 3: aplicação
Quando o container roda:
read-only layers
+
writable layer (container)
Rede entre containers¶
Quando Docker é instalado, ele cria uma bridge virtual chamada:
docker0
Arquitetura típica:
Host
│
├─ docker0 bridge
│ │
│ ├── container A (172.17.0.2)
│ ├── container B (172.17.0.3)
Cada container recebe um IP interno.
Comunicação container → container¶
Se estiverem na mesma rede:
containerA -> containerB
Usando IP interno ou DNS interno.
Comunicação container → host¶
Exemplo:
docker run -p 8080:80 nginx
Fluxo:
host:8080 → container:80
Comunicação container → internet¶
Fluxo típico:
container
↓
veth pair
↓
docker0 bridge
↓
iptables NAT
↓
host network
↓
internet
veth (Virtual Ethernet Pair)¶
Cada container possui um par de interfaces virtuais.
container eth0
│
│ veth pair
│
docker0 bridge
Resumo da arquitetura¶
Um container é construído com:
Namespaces → isolamento
cgroups → controle de recursos
OverlayFS → filesystem em camadas
network namespaces → rede isolada
Tudo rodando no mesmo kernel Linux.
Analogia¶
Kernel Linux = prédio
Cada container = apartamento
Namespaces → paredes que isolam apartamentos\ cgroups → limite de energia de cada apartamento\ network → interfone entre apartamentos
Todos compartilham a mesma infraestrutura.