Acabo de comenzar a estudiar Docker y hay algo que me resulta bastante confuso. Como leí en el sitio web de Docker, un contenedor es diferente de una máquina virtual. Como entendí, un contenedor es solo un sandbox dentro del cual se ejecuta un sistema de archivos aislado completo.
También he leído que un contenedor no tiene un SO 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 realmente? ¿Cómo es diferente crear un contenedor basado en la imagen de Debian que crear una máquina virtual e instalar Debian?
Pensé que los contenedores no tenían un SO invitado instalado, pero cuando creamos imágenes las basamos en alguna imagen que lleva el nombre de un SO.
Además, en los ejemplos que vi cuando lo hacemos docker run ubuntu echo "hello world"
, parece que estamos girando una VM 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 VM con Ubuntu y accediendo a ella usando la línea de comandos.
De todos modos, ¿cómo se llaman esas imágenes después de los sistemas operativos? ¿Qué tan diferente es ejecutar un contenedor con una de esas imágenes y hacer girar una VM con el SO invitado correspondiente?
Es la idea de que simplemente compartamos el kernel con el sistema operativo host (y, en consecuencia, tenemos acceso a los recursos de hardware subyacentes de la máquina, sin la necesidad de virtualizar el hardware), pero aún utilizamos los archivos y binarios de cada sistema diferente en los contenedores en orden para admitir cualquier aplicación que queramos ejecutar?
fuente
Respuestas:
Dado que todas las distribuciones de Linux se ejecutan del mismo modo (sí, es un poco simplificado) el kernel de Linux y difieren solo en el software de usuario, es bastante fácil simular un entorno de distribución diferente, simplemente instalando ese software de usuario y fingiendo que es otra distribución. Siendo específico, la instalación del contenedor CentOS dentro del sistema operativo Ubuntu significará que obtendrá la tierra de usuario de CentOS, mientras sigue ejecutando el mismo núcleo, ni siquiera otra instancia del núcleo.
Entonces, la virtualización ligera es como tener compartimentos aislados dentro del mismo sistema operativo. La virtualización real contraria 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 chroot muy sofisticado y avanzado.
fuente
Los contenedores se ejecutan en un solo núcleo. En otras palabras, todos los contenedores tienen un solo núcleo (Host OS). Mientras que, por otro lado, los hipervisores tienen múltiples núcleos. Cada máquina virtual se ejecuta en un núcleo diferente.
Y "docker run ubuntu" es como crear un entorno chroot.
fuente