Decidi criar meu próprio runtime de contêineres por diversão e, embora ainda esteja no começo, aprendi que o Docker é estranho. Aqui estão algumas coisas esquisitas que aprendi sobre o Docker.
Contêineres não são reais. Diferentemente das VMs, contêineres são apenas processos com restrições especiais. Seu kernel ainda executa esse processo, e você pode encontrá-lo em /proc. Não existe um único recurso de contêineres no Linux — contêineres são, na verdade, 5 recursos diferentes do kernel Linux vestidos com um sobretudo. Os namespaces escondem o que o host e o contêiner podem ver, os cgroups limitam o uso de recursos, e uma mágica de rede isola a rede de um contêiner.
As imagens são apenas pastas. O Docker as coloca em algum lugar e chama chroot (ou pivot_root) para transformar essa pasta na nova raiz do contêiner. Go é meio que uma linguagem terrível para um runtime de contêineres. O runtime do Docker, runc, é escrito em Go, e as escolhas de design do Go o tornam menos adequado. O runtime do Go é nativamente multithreaded, mas muitas syscalls do Linux precisam de um ambiente com uma única thread, então o runc tem um módulo em C que roda antes de o Go ser inicializado. O Go também não tem fork, então o runc executa /proc/self/exe para aproximar um fork.
O Docker exige root. Muitas APIs do kernel Linux exigem root, por isso o daemon do Docker normalmente roda como root. Runtimes sem root podem ter que reimplementar toda a pilha de rede em userspace. Aprender é divertido! Escrever sua própria versão de uma ferramenta que você usa é uma ótima forma de entendê-la.
Fonte: Hacker News · Resumido por HeadlinesBriefing