¿Los beneficios de desarrollo de usar Docker se niegan cuando se usa Java en comparación con otros lenguajes más cercanos a los binarios de Unix?

53

Tenía un amigo que dijo:

Docker es asombroso. Puede usarlo para replicar la producción y todas sus peculiaridades en su máquina local. Luego puede implementar esa instancia directamente a través de todos los flujos de trabajo de preparación súper rápidos .

Ahora esto sería cierto si los desarrolladores escribieran Ruby, PHP o Go , donde había un enlace binario de dirección al sistema operativo.

Pero cuando se usa Java , ya existe una capa virtual entre el sistema operativo y el lenguaje, lo que hace que la operación sea coherente independientemente del sistema operativo subyacente.

Podría decirse que, en este caso, se niegan los beneficios de ejecutar Docker para desarrolladores localmente para replicar el entorno de producción . (En comparación con Ruby, PHP o Go).

Estoy abierto a la discusión sobre esto y estoy ansioso por escuchar un punto de vista disidente (con evidencia).

¿Los beneficios de desarrollo de usar Docker se niegan cuando se usa Java en comparación con otros lenguajes más cercanos a los binarios de Unix?

ojo de halcón
fuente
34
¿Por qué crees que ruby ​​y php son binarios? Ruby y php son técnicamente aún más virtuales que Java: en Java primero debe compilar y luego ejecutar su programa en una máquina virtual. En Ruby y PHP, envía el código fuente y la máquina virtual lee la fuente directamente.
slebetman
12
"Pero cuando se utiliza Java, ya existe una capa virtual entre el sistema operativo y el lenguaje, lo que hace que la operación sea coherente independientemente del sistema operativo subyacente". LOL. Java inventó "escribir una vez, probar en todas partes".
Andy
2
Java es un objetivo en movimiento. Ocasionalmente, se introducen características que rompen cosas (el endurecimiento de la seguridad hace unos años fueron ejemplos principales) o se encuentra con un error que requiere que use una versión específica. Es mucho más fácil controlar esto en Docker que usar el sistema de empaquetado nativo de la computadora host.
Thorbjørn Ravn Andersen
1
"hacer que la operación sea coherente independientemente del sistema operativo subyacente" Tenga en cuenta que hacer que el tiempo de ejecución del lenguaje se comporte de manera consistente no niega el hecho de que probablemente todavía tenga algunas dependencias externas. Podría ser algo tan simple como usar una ruta de archivo particular para sus registros.
jpmc26

Respuestas:

86

De ningún modo.

Imagine que está ejecutando la versión 1.8.0 de Java tanto en su máquina de desarrollo como en el servidor. Por cierto, estás trabajando simultáneamente en dos proyectos, ambos usando Java.

Un día, se encuentra un error en JVM, y los servidores que ejecutan el primer proyecto en el que está trabajando se migran a 1.8.1. Por cierto, los servidores que ejecutan el segundo proyecto no se ven afectados por el error, y son administrados por un equipo diferente de administradores del sistema, que pueden no estar dispuestos a actualizar a 1.8.1.

Ahora, al menos para uno de los proyectos, está ejecutando una versión diferente de Java.

Es posible que esto no le moleste demasiado (hasta que un servidor migre a 1.9, mientras que el otro mantenga la versión anterior), pero esto significaría que ya no está replicando el entorno de producción en su máquina local, lo que hace posible que sea pequeño errores para arrastrarse.

Si imagina que su sistema de archivos, sus dependencias, su configuración de seguridad, su configuración local y su versión de Linux en sí difieren de la producción, corre el riesgo de escribir código que fallará en la producción. En lugar de correr este riesgo, podría estar utilizando virtualización o Docker, con una pérdida de productividad menor o nula.

Arseni Mourzenko
fuente
20
También este tipo de cosas suceden TODO el tiempo en grandes empresas. No es solo una cosa teórica.
enderland
55
¿Qué haces cuando descubres un error en Docker?
Owen
También Java 9 romperá las cosas. Se necesitará bastante esfuerzo.
Thorbjørn Ravn Andersen
8
@Owen Lo mismo que haces cuando encuentras un error en Java. O en {Linux, Windows}. O en tu CPU .
Kroltan
1
@Trilarion: Sí, aunque principalmente en forma de publicaciones de blog de desarrolladores de la empresa. Dicho esto, cualquiera de los enlaces "Más información" en docker.com/customers proporcionará ejemplos de grandes empresas que usan docker para resolver tales problemas. Dicho esto, por lo general, esas compañías daban por sentado que necesitaban una combinación perfecta entre producción y desarrollo, y lo lograron con máquinas virtuales. Más tarde, se dieron cuenta, "oye, Docker resuelve el mismo problema que las máquinas virtuales, excepto que se ejecuta más rápido y se puede usar para mantener las implementaciones consistentes".
Brian
35

Rara vez despliega una "Aplicación Java". Su aplicación Java tiene muchos programas de soporte diferentes a su alrededor. Utilizamos Apache HTTPD, Apache Tomcat, ActiveMQ para mensajería, un Deamon FTP, MySQL y un puñado de servicios personalizados para integrarse con programas que no funcionan directamente con Java.

Esto ni siquiera entra en el software de desarrollo que lo acompaña: eclipse, ant, adobe flex, groovy, firefox y subversion (me estoy saltando bastantes)

Se necesita entre un día completo y una semana para configurar una nueva estación de trabajo; hemos discutido mudarse a Docker para simplificar este problema. Sería increíble si pudiéramos implementar de manera confiable una nueva estación de trabajo en un par de horas.

Sin mencionar el hecho de que cuando implementamos necesitamos mantener más de - 20 servidores; ¡Docker está empezando a parecer un buen negocio!

(20 parece bastante doloroso para una aplicación que solo se ejecuta en un solo servidor a la vez ... pero multiplique ese servidor por clústeres (x2), prueba / puesta en escena / prod (x3), interno / externo (x2) y sitio primario / sitio de copia de seguridad (x2) y llegas allí bastante rápido)

Bill K
fuente
¿Por qué no hacer imágenes?
Dmitry Kudriavtsev
Esperamos que. Somos un pequeño equipo que intenta agregar características a un sistema muy usado / importante y no tenemos suficiente control sobre los servidores para dictar su implementación. Sin embargo, podría usarlo para desarrolladores, ya estamos bastante limitados a 32 MB de RAM: supongo que correr desde una imagen acoplable tendrá algo de sobrecarga ... pero nuestro plan es avanzar en esa dirección.
Bill K
Me refería a las estaciones de trabajo
Dmitry Kudriavtsev
Tiempo y memoria: ya tenemos que dejar piezas para ejecutar en nuestras estaciones de trabajo de 32 gb (los servidores de 64 gb funcionan bien). Sin embargo, hemos experimentado un poco y podemos intentarlo la próxima vez que necesitemos construir una nueva estación de trabajo de desarrollo.
Bill K
8

Esta pregunta también sería pertinente para Golang, donde puede extraer binarios estáticamente vinculados y ejecutarlos en algún lugar, en lugar de Python o C ++, donde generalmente tiene una gran cantidad de bibliotecas vinculadas, lo que lleva a las personas a construir un contenedor acoplable desde el entorno de desarrollo.

Hay dos puntos para responder aquí:

Uno: tiene que haber una mejor manera , y la hay: puede construir contenedores acoplables más pequeños (y más eficientes) utilizando solo el entorno de instalación, lo que conlleva ventajas similares como en el caso de Golang-with-environment frente a Golang-just -binarios contenedores. En el caso de Java, puede crear un tarro gordo o una aplicación instalable que contenga todos los tarros de la biblioteca y un script de shell; en el caso de Python, podría usar auditwheel para construir ruedas independientes que sean independientes del entorno de construcción (y podría usar C ++ con enlaces estáticos para casi el mismo efecto).

Dos: ¿para qué necesitas docker? En la tierra de Java, puede hacer mucha separación entre los diferentes componentes mediante el uso de cargadores de clases, pero el punto principal es lo que está alrededor de la aplicación Java. Ninguna aplicación Java se ejecuta por sí sola; si no se ejecuta en Docker, generalmente tendría que ser supervisada por supervisor o systemd o similares. Ingrese a la nube de Kubernetes, Marathon o Docker, que usa la abstracción de contenedor para virtualizar no el host en sí, sino que virtualiza toda la red de tal manera que simplemente pueda implementar contenedores y se ejecuten en algún host aleatorio.

Los microservicios generalmente se ejecutan en nubes basadas en acopladores porque le permite tratar a sus hosts acoplables como ganado, no como mascotas, y de manera similar con las aplicaciones acopladas. Por supuesto, esta abstracción se vuelve permeable tan pronto como monte los volúmenes del host en la ventana acoplable y necesite ejecutar contenedores de la ventana acoplable exactamente en el host que tiene estos volúmenes. Algunas personas se vengan de eso.

Yannick
fuente
5

Esta es una muy buena pregunta, pero después de trabajar con Docker, la cambiaría:

¿Los beneficios de la JVM son negados por la contenedorización (por ejemplo, Docker)?

Los contenedores realmente desafían muchos de los supuestos que tengo sobre el desarrollo que provienen de mi experiencia. Por ejemplo, si alguien codificara una ruta de acceso a un archivo de recursos en una aplicación, muchos desarrolladores experimentados sabrían que esto es problemático y usted debe hacerlo configurable. Pero si está apuntando a un contenedor, ¿es este realmente el caso? Cuando construye el contenedor, le dice cuáles son las estructuras de directorios. Estás configurando la ruta allí. Entonces, ¿debería configurarlo dos veces? Cual es el beneficio? Si no los haces coincidir, no funcionará así que ... ¿SECO?

Recientemente creé una aplicación prototipo con Java y Docker que esencialmente observaba los eventos de GC y cuando la parte anterior del montón alcanzaba un porcentaje umbral, se cerraba. Docker (modo enjambre) luego giraría uno nuevo. Esencialmente, eliminó la necesidad de ciclos GC principales en la JVM y permitió que Docker los administrara. No funcionó tan bien como esperaba (los clientes vieron cierto impacto del cierre), pero fue lo suficientemente funcional como para hacer una demostración en vivo a una multitud.

Realmente deberías probar los contenedores si tienes curiosidad. Realmente es una tecnología disruptiva y tendrá que enfrentarse a ella. Docker es un gran lugar para comenzar, pero hay al menos otra alternativa viable que es buena para todos, la OMI.

JimmyJames
fuente
"... pero hay al menos otra alternativa viable que es buena para todos" Entonces, ¿cuál podría ser esta otra alternativa viable?
Trilarion
@Trilarion rkt (o cohete) . Actualmente es compatible con Kubernetes junto con Docker.
JimmyJames