java - hub - ¿Debería cada imagen de Docker contener un JDK?
download docker image (4)
Debes aprender Union Filesystem de docker.
El sistema de archivos Union permite que cada capa que se crea sea reutilizada por un número ilimitado de imágenes. Esto ahorra una gran cantidad de espacio en el disco y permite que las imágenes se construyan más rápido ya que solo está reutilizando una capa existente.
Además, la capa superior de lectura / escritura le da la apariencia de que puede modificar la imagen, pero las capas de solo lectura que se encuentran a continuación mantienen su integridad del contenedor al aislar el contenido del sistema de archivos.
Como ejemplo de ahorro de espacio en disco, siempre quiero diseñar las imágenes de mi docker para que sean lo más livianas posible. Digamos que necesito crear un contenedor de volumen de datos con nombre para mis archivos de registro para mi aplicación web. Lo primero que pienso, es qué imagen base puedo usar que sea el peso más ligero para este contenedor de volumen.
Decido usar la imagen tianon / true ya que es superligera con 125 bytes. Pero luego recuerdo que estoy usando una base de Ubuntu para mi aplicación web. Entonces, si ya tengo una imagen de Ubuntu, es mejor reutilizar esa imagen base para mi contenedor de volumen de datos en lugar de crear más capas con el uso de tianon / true.
Entonces, soy muy nuevo en Docker. Déjame explicarte el contexto a la pregunta.
Tengo 10 - 20 aplicaciones de microservicio Spring Boot, cada una de las cuales se ejecuta en diferentes puertos en mi máquina local.
Pero para migrar a Docker, según mi aprendizaje, cada uno de los servicios debe estar en un contenedor de Docker diferente para desplegar o hacer copias rápidamente.
Para cada contenedor de Docker, necesitamos crear una nueva imagen de Docker.
Cada imagen de Docker debe contener un JRE para que se ejecute la aplicación Spring Boot. Es alrededor de 200 MB como máximo. Eso significa que cada imagen de docker es, digamos 350 MB como máximo. Por otro lado, en mi PC local solo tengo un JRE de 200 MB y cada aplicación ocupa solo unos pocos MB de espacio.
En base a esto, necesitaría 600 MB en mi sistema local, pero necesitaría 7 GB para todas las imágenes de Docker.
¿Es este enfoque correcto? ¿Debería agregarse "OpenJDK" de DockerHub a cada imagen?
¿Por qué es grande el tamaño de la imagen incluso si la PC de destino ya tiene el JDK?
Las otras respuestas cubren las capas de Docker bastante bien, así que solo quiero agregar detalles para sus preguntas
¿Es este enfoque correcto? ¿Debería agregarse "OpenJDK" de DockerHub a cada imagen?
Sí. Si no está en la imagen, no estará en el contenedor. Sin embargo, puede ahorrar espacio en el disco reutilizando tantas capas como sea posible. Así que trate de escribir su Dockerfile de "Menos probable que cambie" a "Más probable que cambie". Así que cuando construyes tu imagen, cuanto más a menudo veas "Uso de caché", mejor.
¿Por qué es grande el tamaño de la imagen incluso si la PC de destino ya tiene el JDK?
Docker quiere tener tan poco que ver con el anfitrión como sea posible. Docker ni siquiera quiere tratar con el anfitrión. Lo primero que hace es crear una máquina virtual para esconderse. Las imágenes de Docker suponen que lo único que dará el host es un ram vacío, un disco y una CPU. Así que cada imagen de Docker también debe contener su propio sistema operativo / kernel. (Eso es lo que está haciendo su primer DESDE, seleccionando una imagen de sistema operativo base para usar) Por lo tanto, el tamaño final de la imagen es en realidad la aplicación + herramientas + OS. Sin embargo, el tamaño de la imagen es un poco engañoso, ya que es la suma de todas las capas, que se reutilizan en las imágenes.
(Implícito) ¿Debería cada aplicación / microservicio estar en su propio contenedor?
Idealmente, sí. Al convertir su aplicación en un módulo aislado, hace que sea más fácil reemplazar / equilibrar la carga de ese módulo.
En la práctica, tal vez no (para ti). Spring Boot no es un marco ligero. De hecho, es un marco para la modificación de módulos de su código (Ejecución efectiva de un sistema de control de módulos dentro de un sistema de control de módulos). ¿Y ahora quieres alojar de 10 a 20 de ellos? Probablemente no se pueda ejecutar en un solo servidor. Docker obligará a Spring Boot a cargarse en la memoria por aplicación ; y los objetos no se pueden reutilizar en los módulos ahora, ¡por lo que también deben ser múltiples instancias! Y si está restringido a 1 servidor de producción, la escala horizontal no es una opción. (Necesitará ~ 1GB de HEAP (RAM) por Spring Boot, millaje muy basado en su código base). Y con 10-20 aplicaciones, la refactorización para hacer que la aplicación sea más liviana para la implementación de Docker puede no ser factible / dentro del presupuesto. Sin mencionar que si no puede ejecutar una configuración mínima local para las pruebas (RAM insuficiente), el esfuerzo de desarrollo se volverá mucho más "divertido".
Docker no es un martillo de oro. Pruébelo, evalúe los pros y los contras y decida si los pros valen los contras para usted y su (s) equipo (s).
Tu entendimiento no es correcto.
Las imágenes de Docker se forman con capas; ver el siguiente diagrama:
Cuando instale un JRE en su imagen, supongamos que su suma de comprobación es 91e54dfb1179
en la siguiente imagen, realmente ocupará su disco.
Pero, si todos sus contenedores están basados en la misma imagen y agregan cosas diferentes, dice, su aplicación de microservicio diferente a la capa R / W delgada, todos los contenedores compartirán el 91e54dfb1179
, por lo que no será el n * m relación.
Debe prestar atención al uso de la misma imagen base para todas las aplicaciones Java tanto como sea posible, y agregar cosas diferentes a la capa R / W delgada.
La respuesta de Lagom es excelente, pero me gustaría agregar que el tamaño de los contenedores Docker debería ser lo más pequeño posible para facilitar la transferencia y el almacenamiento.
Por lo tanto, hay muchos contenedores basados en la distribución de Alpine Linux , que son realmente pequeños. Trate de usarlos si es posible.
Además, no agregue todas las herramientas imaginables a su contenedor, por ejemplo, puede hacerlo sin wget ...