Onde tudo começou
Três gerações de infraestrutura
| Servidor físico | Máquina virtual | Container | |
|---|---|---|---|
| Isola | Hardware inteiro | Hardware virtual + SO convidado | Processo (kernel compartilhado) |
| Inicialização | Minutos | Dezenas de segundos | Milissegundos a segundos |
| Tamanho | Disponível no hardware | GB (SO completo) | MB (só app + dependências) |
| Densidade | 1 aplicação por máquina | Dezenas por host | Centenas por host |
| Entrega | Instalação manual | Imagem de VM (AMI) | Imagem OCI versionada em registry |
Do hardware até a aplicação
Uma máquina, um SO. Apps disputam as mesmas bibliotecas e recursos.
Cada VM carrega um SO completo com kernel próprio. Isolamento forte, custo em GB e boot lento.
Cada container leva só a app e suas dependências. O kernel é do host: leve, rápido e denso.
Por que precisamos de containers?
“Na minha máquina funciona”
Versões diferentes de linguagem, bibliotecas e SO entre o notebook do dev, homologação e produção.
Conflito de dependências
Duas aplicações no mesmo servidor precisando de versões diferentes da mesma biblioteca.
Ambientes que divergem
Servidores configurados à mão acumulam ajustes (drift) e ninguém consegue reproduzi-los.
Entrega lenta
Provisionar uma VM levava dias de chamado; o deploy era manual, raro e arriscado.
Recurso ocioso
Um servidor por aplicação, com boa parte da CPU e da memória sem uso.
A resposta
Empacotar a aplicação com tudo o que ela precisa num artefato único, leve e que roda igual em qualquer lugar.
Por que foi adotado em escala
- Experiência simples: o Docker (2013) juntou tecnologias que já existiam no kernel (namespaces, cgroups) numa experiência de três comandos:
build,push,run. - Artefato imutável e portátil: a mesma imagem roda no notebook, no CI, no data center e em qualquer cloud.
- Leve: sobe em segundos e ocupa MB, então dá para rodar muitas réplicas por servidor e criar ou destruir sob demanda.
- Distribuição fácil: registries como o Docker Hub tornaram o compartilhamento de software tão simples quanto um
git pull. - Padrão aberto: OCI (2015) e CNCF garantiram que ninguém ficasse preso a um fornecedor, e o ecossistema cresceu em torno do mesmo formato.
- Encaixe perfeito com cloud e microsserviços: cada serviço vira um container independente, escalado e atualizado separadamente. O Kubernetes (2014) virou o padrão para orquestrar isso.
O que os containers habilitaram no DevOps
| Antes | Com containers | |
|---|---|---|
| Entrega | Pacote gerado a cada ambiente, deploy manual | Build once, deploy many: a mesma imagem passa por todos os ambientes no CI/CD |
| Ambiente | Documento de instalação e servidor configurado à mão | Dockerfile versionado no Git: ambiente como código |
| Rollback | Reinstalar a versão anterior e torcer | Voltar para a tag anterior em segundos |
| Testes | Ambiente de teste compartilhado e disputado | Ambientes efêmeros por branch ou pull request, com dependências reais |
| Times | Deploy do monolito coordenado entre áreas | Microsserviços com ciclos de entrega independentes |
| Operação | Escala e recuperação manuais | Autoescala e auto-reparo com orquestradores; GitOps e Platform Engineering sobre a mesma base |
Container não é DevOps, mas foi o artefato comum que permitiu automatizar o caminho do commit até a produção.