Docker es muy popular ahora, y la tecnología de contenedores parece ser omnipotente, pero esto es en realidad un malentendido. No te fascinaran por la burbuja de bombo. Este artículo tira la exageración y enumera racionalmente los cinco malentendidos actuales de Docker desde la perspectiva de los programadores de Java para ayudarlo a comprender mejor las ventajas y problemas de Docker.
Dejando de lado la exageración de los medios y los fabricantes, ¿cómo podemos usar Docker de mejor y más racionalmente?
Docker ha atraído mucha atención recientemente, y las razones son obvias. Cómo entregar con éxito el código siempre ha molestado a todos. La tecnología tradicional de contenedores es caótica entre muchas necesidades y plantillas. Docker puede crear contenedores de manera simple y repetida. El uso de Docker permite una entrega de código más rápida y más natural que otros contenedores. ¡Duang, Docker es popular! También hay algunos malentendidos y malentendidos. No confíes en que otros digan que Docker es fácil de usar o no. Pensar en Docker de manera racional e integral por sí mismo lo ayudará a comprender si realmente lo necesita.
Este artículo enumera cinco principales leyes de Docker desde una perspectiva de Java. Pero primero introduzca algún conocimiento de fondo. Para comprender mejor a Docker, consultamos a Avishai Ish-Shalom de pocosbytes, que tiene una amplia experiencia de Docker y también es el organizador de la conferencia de DevOps Days. Hemos enumerado estos malentendidos con él.
Principal malentendido
1. Docker es una máquina virtual ligera
Este es el principal malentendido cuando usted es el Docker principiante. Este malentendido es comprensible, Docker se parece un poco a una máquina virtual. Algunas personas incluso comparan la diferencia entre Docker y las máquinas virtuales en el sitio web de Docker. Sin embargo, Docker no es en realidad una máquina virtual liviana, sino un contenedor de Linux mejorado (LXC). Docker y las máquinas virtuales son completamente diferentes. Si usa contenedores Docker como máquinas virtuales livianas, encontrará muchos problemas.
Antes de usar Docker, debe comprender que hay muchas diferencias esenciales entre los contenedores Docker y las máquinas virtuales.
Aislamiento de recursos: Docker no puede alcanzar el nivel de aislamiento de recursos que una máquina virtual puede proporcionar. Los recursos de la máquina virtual están altamente aislados, y Docker ha necesitado compartir algunos recursos desde su inicio. Estos recursos no pueden ser aislados y protegidos por Docker, como el caché de páginas y el grupo de entropía del núcleo. (Nota: El grupo de entropía del núcleo es interesante, recopila y almacena bits aleatorios generados por las operaciones del sistema. La máquina usará este grupo cuando sea necesario, como relacionado con la contraseña). Si el contenedor Docker ocupa estos recursos compartidos, otros procesos solo pueden esperar antes de que se liberen estos recursos.
Overhead: La mayoría de las personas saben que la CPU y la RAM de una máquina virtual pueden proporcionar un rendimiento físico similar a una máquina, pero hay muchas sobrecargas de IO adicionales. Debido a que se abandona el sistema operativo invitado de máquinas virtuales, el paquete de Docker es más pequeño y requiere menos gastos generales de almacenamiento que las máquinas virtuales. Pero esto no significa que Docker no tenga problemas generales. Los contenedores de Docker aún deben prestar atención a los gastos generales de IO, pero no son tan graves como las máquinas virtuales.
Uso del núcleo: los contenedores Docker y las máquinas virtuales son completamente diferentes en el uso del núcleo. Cada máquina virtual usa un núcleo. Los contenedores Docker comparten núcleos entre todos los contenedores. Los núcleos compartidos traen algunas ganancias de eficiencia, pero a expensas de alta disponibilidad y redundancia. Si se produce un bloqueo de núcleo en una máquina virtual, solo la máquina virtual en este núcleo se verá afectada. Si el núcleo del contenedor Docker se bloquea, todos los contenedores se verán afectados.
2. Docker hace que las aplicaciones sean escalables
Debido a que Docker puede implementar el código en múltiples servidores en muy poco tiempo, naturalmente, algunas personas pensarán que Docker puede hacer que la aplicación sea escalable. Desafortunadamente, esto está mal. El código es la piedra angular de la aplicación, y Docker no reescribe el código. La escalabilidad de una aplicación aún depende del programador. El uso de Docker no facilita automáticamente su código, solo facilita la implementación de los servidores.
3. Docker se usa ampliamente en entornos de producción.
Debido a que Docker está en pleno apogeo, muchas personas creen que Docker puede usarse a gran escala en entornos de producción. De hecho, esto no es correcto. Tenga en cuenta que Docker sigue siendo una tecnología muy nueva, inmadura y en crecimiento, lo que significa que todavía hay muchos errores y características molestos para mejorar. Es cierto que está interesado en nuevas tecnologías, pero es mejor descubrir los escenarios de uso correctos y a qué debe prestarse atención. Ahora, Docker es fácil de aplicar a los entornos de desarrollo. El uso de Docker puede crear fácilmente muchos entornos diferentes (al menos, brinda a las personas la sensación de que pueden crear entornos diferentes), lo cual es muy útil para el desarrollo.
En los entornos de producción, la inmadurez e imperfección de Docker también limitan los escenarios de uso. Por ejemplo, Docker no admite directamente el monitoreo de redes y recursos para múltiples máquinas, lo que hace que sea casi imposible usar en entornos de producción. Por supuesto, hay muchas áreas potenciales, como implementar directamente el mismo paquete desde el entorno de desarrollo hasta el entorno de producción. También hay algunas características de Docker de ejecución que también son útiles para entornos de producción. Pero en general, en el entorno de producción, actualmente no hay más ventajas que ventajas. Esto no significa que no se pueda aplicar con éxito al entorno de producción, pero ahora no se puede esperar que madure y perfecta a la vez.
4. Docker es cruzado
Otro malentendido es que Docker trabaja en cualquier sistema operativo y entorno. Esto puede provenir de una analogía de los contenedores para cargar y descargar productos, pero la relación entre el software y los sistemas operativos no es tan simple y directa como la posición del barco.
De hecho, Docker es solo una tecnología en Linux. Además, Docker se basa en características específicas del núcleo y debe tener la última versión del núcleo. Según las diferencias entre diferentes OSE, si no utiliza las características comunes más bajas entre OSE, encontrará muchos problemas problemáticos. Estos problemas solo pueden tener una incidencia del 1%, pero cuando se despliega en múltiples servidores, el 1% también es fatal.
Aunque Docker solo se ejecuta en Linux, también se puede usar en OS X o Windows. El uso de Boot2Docker ejecutará una máquina virtual Linux en una máquina OS X o Windows, por lo que Docker puede ejecutarse en esta máquina virtual.
5. Docker mejora la seguridad de la aplicación
También es un malentendido que Docker puede mejorar la seguridad del código y el proceso de entrega. Esta es también la diferencia entre un contenedor real y un contenedor en un software. Docker es una tecnología de contenedores que agrega métodos de orquestación. Sin embargo, los contenedores de Linux tienen algunas vulnerabilidades de seguridad que pueden ser atacadas. Docker no agrega capas o parches de seguridad a estas vulnerabilidades. No es una camisa de pantalón que pueda proteger las aplicaciones.
Desde una perspectiva de Java
Algunos desarrolladores de Java han comenzado a usar Docker. Algunas de las características de Docker nos facilitan construir contextos escalables. A diferencia de Uber-Jar, Docker puede ayudarlo a empaquetar todas sus dependencias (incluida JVM) en una imagen lista para liberar. Esto es también lo más fascinante de Docker para los desarrolladores. Sin embargo, esto también traerá algunos peligros ocultos. En términos generales, los programadores deben monitorearlo de diferentes maneras y codificar de manera interactiva, depurarlo, conectarlo, ajustarlo ... Si usa Docker, esto requerirá un trabajo adicional.
Por ejemplo, queremos usar JConsole, que se basa en las funciones JMX, porque JMX necesita redes para usar RMI. No es muy directo si usa Docker, y necesita algunas habilidades para abrir el puerto requerido. Inicialmente descubrimos que el problema era que cuando queríamos construir una aplicación Docker para Takipi, tuvimos que ejecutar un programa de fondo fuera del JVM en el contenedor. Solución detallada en GitHub.
Otro problema grave es que el ajuste de rendimiento de los contenedores Docker es bastante difícil. Al usar contenedores, no sabe cuánta memoria se asignará cada contenedor. Si tiene 20 contenedores, la memoria se les asignará de una manera que no está seguro. Si planea ajustar el montón con el parámetro -xmx, es difícil porque el procesamiento del JVM en el contenedor Docker depende de la capacidad de obtener automáticamente la memoria asignada al contenedor. El ajuste de rendimiento es casi imposible si no sabe cuánta memoria se asigna.
en conclusión
Docker es una tecnología muy interesante y tiene algunos escenarios de uso real y efectivo. Como tecnología emergente, también lleva mucho tiempo resolver las características faltantes y los errores conocidos. Sin embargo, de hecho hay mucha publicidad en este campo ahora. Pero recuerde, la exageración no es un éxito ~
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!