Los contenedores Docker tienen su propio núcleo o no?

66

Veo que muchas imágenes de Docker en el repositorio de Docker están hechas con una base de Ubuntu.

Qué significa eso? ¿Cada contenedor incluye una versión reducida del kernel de Linux?

¿Los contenedores se asientan sobre sus propios granos? Pero pensé que los contenedores comparten el núcleo del host (que en algunos casos es boot2docker, una compilación personalizada de Tiny Core Linux y en otros algo como CoreOS).

EDITAR: aclarando un poco la pregunta. Sí, sé que Docker es un contenedor de procesos, no una máquina virtual completa. Pero dado que hay contenedores "Ubuntu" en el registro oficial de Docker Hub y otros sistemas operativos como CentOS, ¿qué significa ejecutar Ubuntu en un contenedor?

Respuesta: Ahh, me di cuenta. Son los procesos terrestres de usuario de Ubuntu, que contienen apt-get y otros procesos de configuración para una compilación de Ubuntu en particular. Del mismo modo para CentOS. Docker no es un proceso único, solo una entrada. Entonces, para estas distribuciones, el punto de entrada es una especie de proceso de inicio que genera otros procesos.

stewart99
fuente
2
"Son los procesos terrestres de usuarios de Ubuntu", no solo procesos, sino también bibliotecas.
osgx

Respuestas:

38

Docker utiliza el núcleo del sistema operativo host, no hay un núcleo personalizado o adicional dentro del contenedor. Todos los contenedores que se ejecutan en una máquina están compartiendo este núcleo "host".

Wikipedia dice http://en.wikipedia.org/wiki/Docker_(software) que

Docker utiliza características de aislamiento de recursos del kernel de Linux, como cgroups y espacios de nombres del kernel para permitir que se ejecuten "contenedores" independientes dentro de una sola instancia de Linux, evitando la sobrecarga de iniciar máquinas virtuales.

cgroups, espacios de nombres y LXC son características del kernel de Linux para aislar grupos de procesos; todavía hay un núcleo único, un planificador único y una instancia del administrador de memoria del núcleo.

Boot2docker y CoreOS son solo distribuciones livianas de Linux con algún núcleo de host; se pueden usar para cargar contenedores Docker.

http://boot2docker.io/

boot2docker es una distribución liviana de Linux basada en Tiny Core Linux hecha específicamente para ejecutar contenedores Docker. Funciona completamente desde RAM, pesa ~ 27MB y arranca en ~ 5s (YMMV).

http://en.wikipedia.org/wiki/CoreOS

Un único host de control (instancia de CoreOS) ejecuta múltiples sistemas aislados de Linux (contenedores), usando Docker como una capa adicional de abstracción e interfaz [14] a las características de virtualización a nivel de sistema operativo subyacentes del kernel de Linux. ... Este enfoque se basa en la funcionalidad cgroups del kernel de Linux, que proporciona aislamiento de espacio de nombres y capacidades para limitar, contabilizar y aislar el uso de recursos (CPU, memoria, E / S de disco, etc.) para las colecciones de procesos.

osgx
fuente
1
Esto no responde la pregunta.
EML
2
EML, ¿qué pregunta? Por defecto, todos los contenedores Docker no tienen núcleos propios. Solo hay un núcleo de host para todos los contenedores Docker.
osgx
claro, su respuesta está bien en la medida de lo posible, pero el OP quería saber por qué debe tener FROMuna imagen base de Ubuntu cuando el host ya está ejecutando Ubuntu. Para responder la pregunta, debe explicar qué es una imagen base.
EML
2
EML, la pregunta se editó con "Aclaración" ( superuser.com/posts/889472/revisions ) después de que se publicara mi respuesta, por lo que es una respuesta a la pregunta original sin aclaración. Si tiene alguna información para compartir sobre imágenes base y núcleos en Docker, agregue otra respuesta.
osgx
17

En casi todos los casos, el núcleo del sistema operativo host se comparte. Para ejecutar un kernel diferente, debe usar la virtualización. Esto es raro y solo se usa cuando es necesario debido a la degradación del rendimiento.

"El contenedor de Docker Engine comprende solo la aplicación y sus dependencias. Se ejecuta como un proceso aislado en el espacio de usuario en el sistema operativo host, compartiendo el núcleo con otros contenedores. Por lo tanto, disfruta de los beneficios de aislamiento y asignación de recursos de las máquinas virtuales, pero es mucho más portátil y eficiente ".

Esto podría ayudar a explicar cómo funciona: ingrese la descripción de la imagen aquí

Fuente: https://www.docker.com/whatisdocker/

JeremiahBarrar
fuente
44
¿Cualquier fuente de "Paquetes puede usar diferentes núcleos"? Docker en sí mismo no puede usar varios núcleos, siempre hay un solo núcleo host. Solo cuando se combina con el hipervisor (virtualización) podemos iniciar varios hosts, cada uno con su propia versión del kernel, y ejecutar un Docker por host virtual; pero para cualquier host habrá un solo kernel para host y para sus contenedores
acoplados
2
¿Qué es el paquete? El contenedor Docker no tiene núcleo en su interior; simplemente se instaló y comenzó en el núcleo que se usa en el host. Entonces: un Docker = un servidor = un núcleo, tal como se muestra en la imagen. No hay forma de usar dos núcleos con un solo motor Docker; Todos los contenedores dentro de este motor utilizarán el mismo núcleo. Creo que la respuesta correcta es "No, los contenedores Docker no pueden usar diferentes núcleos dentro de una sola instancia de Docker Engine"
osgx
1
Cada contenedor de Docker puede ejecutar el código que desee, incluido el software de virtualización que puede cargar cualquier núcleo que su software requiera. Puede ejecutar Windows en un contenedor si lo desea.
JeremiahBarrar
1
JeremiahBarrar, Entendido, gracias por la explicación. ¿Está documentado la ejecución de software de virtualización desde el interior del contenedor Docker y es compatible con Docker? ¿Qué tipo de virtualización funcionará desde Docker (software qemu, qemu + kvm, xen, ...)?
osgx
2
La primera oración es engañosa. El uso de una máquina virtual dentro de un contenedor de algún modo derrota el punto de usar Docker.
user2707671