OS Docker Container: ¿cuál es la diferencia con una VM entonces?


10

¿Cuál es el punto de usar un sistema operativo en un contenedor acoplable?

En el repositorio de Docker , encontrará una imagen de Docker de Ubuntu: https://registry.hub.docker.com/_/ubuntu/ Pensé que Docker estaba más en el nivel de "aplicación".

¿Cuál es entonces las diferencias entre un contenedor de acoplador de Ubuntu y una máquina virtual de Ubuntu? Si tiene un sistema operativo completo en un contenedor Docker, ¿no tiene sentido usar Docker entonces?

Gracias

Respuestas:


11

Le faltan conceptos básicos de Docker. Es una cosa completamente diferente.

Lo primero que debe saber es la filosofía de Docker: ejecutar un proceso aislado en un contenedor. No ejecutará un sistema operativo en un contenedor Docker, ejecutará un proceso dentro de un contenedor con un contenido de sistema de archivos raíz basado en una distribución de Linux de su elección. Ubuntu es una elección entre otros.

Ahora debería preguntarse cómo es posible ejecutar un proceso dentro de una imagen base de Linux diferente de la distribución de Linux con la que se ejecuta su host. Para que un sistema operativo se ejecute, básicamente necesita:

  • Un sistema de archivos de arranque: contiene el gestor de arranque y el núcleo que residirá en la memoria una vez cargado. No nos importa esto en el caso de los contenedores Docker porque el núcleo se comparte con el host y es la parte común entre todas las distribuciones de Linux.
  • Un sistema de archivos raíz: contiene la estructura del sistema de archivos. Puede ser diferente de una distribución de Linux a otra. Es de solo lectura hasta que la secuencia de arranque haya terminado.

Docker usa UnionFS para administrar capas de bloques de disco dentro de un contenedor para que pueda apilarlos.

Detrás de escena, utiliza un montaje de unión que permite montar múltiples sistemas de archivos al mismo tiempo, apareciendo como uno virtual completo. De hecho, deja caer la capa de imagen base como modo de lectura-escritura en la parte superior del sistema de archivos raíz base en modo de solo lectura.

Aquí tiene una pila de bloques de disco en capas de manera que la distribución de Linux de la que proviene la imagen base contendría el mismo sistema de archivos una vez instalado en un host real, pero esta vez está dentro de un contenedor.

Lo último que falta ahora es: ¿cómo ejecutas esta cosa aislada?

La respuesta es: espacios de nombres. No entraré en detalles aquí porque se desviaría un poco de la pregunta original. Pero lo que necesita saber es que desde el núcleo 2.4.19, han aparecido espacios de nombres de varios tipos a lo largo de los años. Actualmente están disponibles los siguientes espacios de nombres:

  • IPC: espacio de nombres IPC (comunicaciones entre procesos)
  • MNT: montar el espacio de nombres
  • NET: espacio de nombres de red
  • PID: espacio de nombres pid
  • USUARIO: espacio de nombres de usuario (uid)
  • UTS: espacio de nombres UTS (nombres de host)

Los espacios de nombres son estructuras aisladas dentro del núcleo que permiten que los procesos se ejecuten con un entorno particular. Por ejemplo, el espacio de nombres MNT será la característica clave para ejecutar un proceso en las especificidades del sistema de archivos raíz de la imagen base. El espacio de nombres NET será otra característica clave para que un contenedor tenga interfaces de red específicas para comunicarse con el puente acoplable, etc.

Entonces, sí, el objetivo principal de todo esto es ejecutar una aplicación aislada, enviarla desde su entorno local a la producción fácilmente con una caja llamada contenedor.

Sería una buena idea leer la documentación de la ventana acoplable antes de profundizar en ella.


Gracias, ¿eso significa que una imagen de "Ubuntu" como esta: Registry.hub.docker.com/_/ubuntu no tiene "sentido" por sí misma y sirve como base para un contenedor más definido como un "contenedor nginx"? No sé si tengo sentido?
Michael

Si tu puedes. Eso es exactamente para lo que se usa. Y por lo general, escuchará a personas llamarlas imágenes base por este motivo.
Xavier Lucas

He revisado la documentación y hay una cosa de la que no estoy seguro. Digamos que el tamaño de la imagen de ubuntu es de 140Mb. Luego, otra imagen basada en esta imagen agrega 10 Mb más. Si ejecuto 2 contenedores desde esta imagen, ¿cada contenedor será de 150Mb y necesitaré 300Mb de espacio en disco O el tamaño total permanecerá en 150Mb? Gracias
Michael

Wow, acabo de descargar la imagen oficial de Python y el tamaño virtual es de 802.4 MB. Me llevó un tiempo descargarlo. Si ejecuto 10 contenedores, ¿cuánto espacio ocuparán los contenedores? Gracias
Michael

2
@YAmikep Algunas imágenes pueden ser grandes debido a dependencias que no se limpian correctamente. Si inicia 10 contenedores con la misma imagen, no significa que el espacio en disco utilizado sea 10 veces el tamaño de la imagen. Usted descarga una imagen una vez pero la ejecuta desde múltiples contenedores. Docker usa copia en escritura cuando ejecuta múltiples contenedores desde la misma imagen, lo que básicamente significa que compartirá la imagen entre contenedores y creará una copia privada de un archivo dentro de una imagen solo si el contenedor la agrega / modifica. Por lo tanto, el tamaño real utilizado está vinculado a la actividad dentro de los contenedores, no a cuántas ejecuciones.
Xavier Lucas
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.