¿Por qué utilizamos una imagen base del sistema operativo con Docker si los contenedores no tienen sistema operativo invitado?

84

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?

usuario1620696
fuente
2
En mi opinión, sus objetivos en virtualización son las claves. Si necesita bibliotecas, idiomas, etc. en el sistema operativo, los contenedores del sistema operativo son adecuados para sus necesidades. Pero si su necesidad es solo la aplicación como componentes, no es necesario utilizar el sistema operativo como imagen base. Creo que este artículo podría explicarlo claramente blog.risingstack.com/…
metamorph

Respuestas:

68

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.

drogadicto
fuente
3
Entonces, ¿por qué puedo alojar mi código de golang compilado en el contenedor Scratch vacío, porque el código compilado solo necesita el núcleo?
Francis Norton el
Entonces, ¿cómo sabe el SO huésped usar el núcleo del SO host (y cómo hacerlo)? AFAIK, las bases de imágenes del acoplador utilizan imágenes estándar del sistema operativo. En su ejemplo, ¿no es como si hubiera una compilación CentOS personalizada que sabe usar el núcleo del padre? ¿O es tan simple como un truco del sistema de archivos (aufs) en el que Docker redirige las lecturas / arranque de los invitados (CentOS) al host (Ubuntu)? En ese caso, el invitado (CentOS) instalaría su propia copia de / boot, pero ¿nunca se leería?
James S
Me gusta tu explicación, pero ¿cómo explicas la ejecución de contenedores Linux en Windows? ¿Server 2016 y Windows 10 contienen un kernel de Linux para permitir el uso de Docker? ¿Es por eso que esas versiones son necesarias?
duct_tape_coder
Esto es simple: merey se ejecuta bajo la pila de virtualización completa de Hyper-V, dentro de una máquina virtual Linux nativa: docs.microsoft.com/en-us/virtualization/windowscontainers/… .
drookie
1

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.

Shiv sandhu
fuente