¿Por qué usamos una Imagen Base del sistema operativo con Docker si los contenedores no tienen un sistema operativo invitado?

Acabo de empezar a estudiar Docker y hay algo que me está confundiendo bastante. Como he leído en el sitio web de Docker, un contenedor es diferente de una máquina virtual. Como entendí, un contenedor es solo una caja de arena dentro de la cual se ejecuta un sistema de archivos aislado completo.

También he leído que un contenedor no tiene un sistema operativo invitado instalado. En su lugar, se basa en el núcleo del sistema operativo subyacente.

Todo eso está bien. Lo que me confunde es que hay imágenes de Docker con nombres de sistemas operativos. Vemos imágenes como Ubuntu, Debian, Fedora, CentOS, etc.

Mi punto es: ¿cuáles son esas imágenes, en realidad? ¿En qué se diferencia la creación de un contenedor basado en la imagen de Debian de la creación de una máquina virtual y la instalación de Debian?

Pensé que los contenedores no tenían instalado un sistema operativo invitado, pero cuando creamos imágenes las basamos en alguna imagen con el nombre de un sistema operativo.

Además, en los ejemplos que vi cuando lo hacemos docker run ubuntu echo "hello world", parece que estamos girando una máquina virtual con Ubuntu y haciendo que ejecute el comando echo "hello world".

De la misma manera cuando lo hacemos docker run -it ubuntu /bin/bash, parece que estamos girando una máquina virtual con Ubuntu y accediendo a ella usando la línea de comandos.

De todos modos, ¿de qué se tratan esas imágenes con nombres de sistemas operativos? ¿Qué tan diferente es ejecutar un contenedor con una de esas imágenes y hacer girar una máquina virtual con el sistema operativo invitado correspondiente?

Es la idea de que nosotros simplemente ¿compartir el kernel con el sistema operativo host (y, en consecuencia, tenemos acceso a los recursos de hardware de la máquina subyacente, sin la necesidad de virtualizar el hardware), pero aún así usar los archivos y binarios de cada sistema diferente en los contenedores para admitir cualquier aplicación que queramos ejecutar?

Dado que todas las distribuciones de Linux ejecutan el mismo kernel de Linux (sí, está un poco simplificado) y difieren solo en el software de espacio de usuario, es bastante fácil simular un entorno de distribución diferente, simplemente instalando ese software de espacio de usuario y fingiendo que es otra distribución. Siendo específico, instalar el contenedor CentOS dentro del sistema operativo Ubuntu significará que obtendrá el espacio de usuario de CentOS, mientras sigue ejecutando el mismo kernel, ni siquiera otra instancia del kernel.

Tan ligero la virtualización es como tener compartimentos aislados dentro del mismo sistema operativo. Por el contrario, la virtualización real es tener otro sistema operativo completo dentro del sistema operativo host. Es por eso que docker no puede ejecutar FreeBSD o Windows dentro de Linux.

Si eso fuera más fácil, puede pensar que docker es un entorno de chroot muy sofisticado y avanzado.

Estaba luchando con la misma pregunta que tú, y esto es lo que he llegado a entender.

No tienes un sistema operativo invitado, tienes razón en eso.

Entonces, ¿por qué basamos el contenedor en una imagen del sistema operativo?

Porque querrías usar algunos comandos como (apt, ls, cd, pwd).Estos comandos son llamadas a archivos binarios que podrían estar disponibles para usted en su sistema operativo host sin que lo instale anything.In para que pueda ejecutar estos comandos dentro de su imagen de docker, debe tener los binarios para ellos dentro de su imagen, debido al aislamiento, no solo ejecuta binarios desde el sistema operativo host.

Vea esta respuesta para comprender mejor por qué necesitamos una imagen base: https://stackoverflow.com/a/62384611

Los contenedores se ejecutan en un solo núcleo. En otras palabras, todos los contenedores tienen un solo núcleo (sistema operativo Host). Mientras que, por otro lado, los hipervisores tienen múltiples núcleos. Cada máquina virtual se ejecuta en un kernel diferente.

Y "docker run ubuntu" es como crear un entorno chroot.

En mi opinión, sus objetivos en la virtualización son la clave. Si necesita bibliotecas, idiomas, etc. en el sistema operativo, por lo que los contenedores del sistema operativo son adecuados para sus necesidades. Pero si su necesidad es solo la aplicación como componentes, no es necesario usar el sistema operativo como imagen base. Creo que este artículo podría explicarlo claramente Operating System Containers vs. Application Containers - RisingStack Engineering