O que e Docker-in-Docker? Executando Docker dentro de um continer
O Docker-in-Docker (DinD) executa um daemon completo do Docker dentro de um continer, para que um job de CI conteinerizado possa construir e executar imagens proprias.
Jobs de CI frequentemente rodam dentro de um continer, mas ainda precisam construir imagens Docker. Isso e um problema do ovo e da galinha: o job precisa do Docker, mas ja esta dentro de um continer. O Docker-in-Docker resolve isso executando um daemon aninhado - embora uma abordagem mais simples de compartilhamento de socket costume ser preferivel.
A abordagem do daemon aninhado
O DinD executa o dockerd dentro do continer do job (comumente via a imagem docker:dind). O job conversa com esse daemon interno, que constroi imagens isoladas do host. Normalmente exige um continer privilegiado.
A alternativa de socket-mount
Em vez de aninhar, voce monta o socket do Docker do host (/var/run/docker.sock) no job. Os comandos docker do job entao controlam o daemon do host. E mais leve, mas o job compartilha o daemon do host e seu limite de seguranca.
Trade-offs
- DinD: melhor isolamento, mas precisa de modo privilegiado e e mais lento.
- Socket mount: rapido e simples, mas isolamento mais fraco.
- Builders rootless ou sem daemon (BuildKit, Buildah) evitam ambas as armadilhas.
Por que os builders sem daemon estao em alta
Ferramentas como o BuildKit (via buildx) e o Buildah conseguem construir imagens OCI sem um daemon privilegiado, contornando boa parte da historia de seguranca e complexidade do DinD. Muitos pipelines agora os preferem.
DinD na CI
Em muitos runners gerenciados voce pode construir imagens diretamente porque o Docker ja esta disponivel no runner, evitando por completo daemons aninhados. Isso mantem os builds mais simples e rapidos do que configurar o DinD.
Principais conclusões
- O DinD executa um daemon do Docker aninhado para que um job conteinerizado possa construir imagens.
- Montar o socket do host e mais simples, mas compartilha o limite de seguranca do daemon do host.
- Builders sem daemon (BuildKit, Buildah) cada vez mais evitam todo o problema.