Decidí crear mi propio runtime de contenedores por diversión, y aunque todavía estoy en las primeras etapas, he aprendido que Docker es extraño. Aquí hay algunas cosas extrañas que aprendí sobre Docker.
Los contenedores no son reales. A diferencia de las VM, los contenedores son solo procesos con restricciones especiales. Tu kernel sigue ejecutando ese proceso, y puedes encontrarlo en /proc. No existe una única funcionalidad de contenedores de Linux: los contenedores son realmente 5 funcionalidades distintas del kernel de Linux con un disfraz. Los namespaces ocultan lo que el host y el contenedor pueden ver, los cgroups limitan el uso de recursos, y una magia de red aísla la red de un contenedor.
Las imágenes son solo carpetas. Docker las coloca en algún lugar y llama a chroot (o pivot_root) para convertir esa carpeta en el nuevo directorio raíz del contenedor. Go es una especie de lenguaje terrible para un runtime de contenedores. El runtime de Docker, runc, está escrito en Go, y las decisiones de diseño de Go lo hacen menos adecuado. El runtime de Go es nativamente multihilo, pero muchas llamadas al sistema de Linux necesitan un entorno de un solo hilo, así que runc tiene un módulo en C que se ejecuta antes de que Go se inicialice. Go tampoco tiene fork, por lo que runc hace exec de /proc/self/exe para aproximar un fork.
Docker requiere root. Muchas APIs del kernel de Linux requieren root, por lo que el demonio de Docker normalmente se ejecuta como root. Los runtimes sin root pueden tener que reimplementar toda la pila de red en espacio de usuario. ¡Aprender es divertido! Escribir tu propia versión de una herramienta que usas es una gran forma de aprender sobre ella.
Fuente: Hacker News · Resumido por HeadlinesBriefing