
O que é Docker e como funciona?
docker envia comandos por meio de uma API REST para o daemon dockerd, que
constrói imagens e executa contêineres a partir delas.Por que ele existe. O Docker permite empacotar um aplicativo com todas as suas dependências (bibliotecas, configuração, tempo de execução) em um único artefato — uma imagem — e executá-lo de forma idêntica em um laptop de desenvolvedor, em CI e em produção. Isso resolve o problema clássico de “funciona na minha máquina”.
Contêineres versus máquinas virtuais. Uma VM virtualiza o hardware e envia um sistema operacional convidado inteiro com seu próprio kernel. Um contêiner é um processo isolado que usa o kernel do host. Como resultado, os contêineres são mais leves, iniciam em frações de segundo e utilizam menos recursos. Mas um contêiner não é uma VM leve: ele está vinculado ao kernel do host e seu limite de isolamento é mais fraco que o de uma VM. Uma VM tem isolamento imposto por hardware, enquanto uma vulnerabilidade no kernel compartilhado pode potencialmente escapar de um contêiner – essa é a compensação pela velocidade e densidade. O host deve corresponder ao tipo de contêiner: os contêineres Linux precisam de um kernel Linux, os contêineres Windows precisam de um kernel Windows. No macOS e no Windows, o Docker Desktop executa de forma transparente uma pequena VM Linux (por exemplo, via WSL2), de modo que os contêineres Linux compartilham o kernel dessa VM, não o kernel do seu sistema operacional.
Arquitetura (cliente-servidor). De acordo com a documentação do Docker:
- O cliente
dockeré a principal forma de interação dos usuários com o Docker; comandos comodocker runsão enviados para o daemon. - O daemon
dockerd"faz o trabalho pesado" de construção, execução e distribuição de contêineres e gerencia objetos como imagens, contêineres, redes e volumes. - O cliente se comunica com o daemon por meio de uma API REST por meio de um soquete UNIX ou de uma interface de rede, para que possam ser executados em máquinas diferentes.
- Um registro armazena imagens; o público padrão é Docker Hub.
Imagens e contêineres. Uma analogia útil: uma imagem é como uma classe (ou um programa em disco) e um contêiner é uma instância dela (um processo em execução); você pode iniciar vários contêineres a partir de uma imagem.
- Uma imagem é um modelo somente leitura com instruções para criar um contêiner, criado a partir de camadas. É definido por um Dockerfile; quando você altera, apenas as camadas alteradas são reconstruídas.
- Um container é uma instância executável de uma imagem. No topo das camadas somente leitura da imagem, ele adiciona uma fina camada gravável (cópia na gravação); qualquer coisa escrita lá é perdida quando o contêiner é removido – e é exatamente por isso que os dados persistentes precisam de volumes.
Como funciona o isolamento (nos bastidores). dockerd não chama o kernel diretamente — ele delega o gerenciamento do ciclo de vida do contêiner para containerd, que invoca um tempo de execução OCI; no Docker o padrão é runc, mas o tempo de execução é conectável (crun, gVisor, Kata, etc.). O isolamento real vem dos recursos do kernel Linux:
- namespaces isolam recursos (de acordo com a página man7 existem 8 tipos: PID, rede, montagem, UTS, IPC, usuário, cgroup, tempo). Um processo apenas “vê” seus próprios PIDs, sua própria pilha de rede e assim por diante.
- cgroups (grupos de controle) limitam e contabilizam o uso de recursos (CPU, memória, E/S).
Acompanhamentos comuns. As camadas de imagem são armazenadas em cache; docker compose executa aplicativos de vários contêineres; os dados persistem por meio de volumes (um contêiner é efêmero por padrão); e a OCI padroniza o formato da imagem (especificação de imagem), o tempo de execução (especificação de tempo de execução) e o protocolo de distribuição de registro (especificação de distribuição) — essas três especificações mantêm o ecossistema interoperável.
