Escuché sobre Docker hace algunos días y quería cruzar.
Pero, de hecho, no sé cuál es el propósito de este "contenedor".
¿Qué es un contenedor?
¿Puede reemplazar una máquina virtual dedicada al desarrollo?
¿Cuál es el propósito, en palabras simples, de usar Docker en las empresas? ¿La ventaja principal?
Respuestas:
VM: con el software de VM, por ejemplo, Ubuntu se puede instalar dentro de Windows. Y ambos correrían al mismo tiempo. Es como construir una PC, con sus componentes centrales como CPU, RAM, discos, tarjetas de red, etc., dentro de un sistema operativo y ensamblarlos para que funcionen como si fuera una PC real. De esta manera, la PC virtual se convierte en un "invitado" dentro de una PC real que con su sistema operativo, que se llama host.
Contenedor: es el mismo que el anterior, pero en lugar de utilizar un sistema operativo completo, eliminó los componentes "innecesarios" del sistema operativo virtual para crear una versión mínima del mismo. Esto llevó a la creación de LXC (Linux Containers). Es más rápido que las VM Machines.
Docker: un contenedor de Docker , a diferencia de una máquina virtual y un contenedor, no requiere ni incluye un sistema operativo separado. En cambio, se basa en la funcionalidad del kernel de Linux y utiliza el aislamiento de recursos.
Propósito de Docker: su enfoque principal es automatizar la implementación de aplicaciones dentro de contenedores de software y la automatización de la virtualización a nivel de sistema operativo en Linux. Es más liviano que los contenedores estándar y se inicia en segundos.
(Tenga en cuenta que no se requiere un sistema operativo invitado en el caso de Docker)
fuente
[Tenga en cuenta que esta respuesta se centra en los contenedores de Linux y es posible que no se aplique completamente a otros sistemas operativos. ]
Es una aplicación : un contenedor es una forma de ejecutar aplicaciones que están aisladas unas de otras. En lugar de virtualizar el hardware para ejecutar múltiples sistemas operativos, los contenedores se basan en virtualizar el sistema operativo para ejecutar múltiples aplicaciones. Esto significa que puede ejecutar más contenedores en el mismo hardware que las máquinas virtuales porque solo tiene una copia del sistema operativo en ejecución y no necesita preasignar los núcleos de memoria y CPU para cada instancia de su aplicación. Al igual que cualquier otra aplicación, cuando un contenedor necesita la CPU o la memoria, las asigna y luego las libera cuando termina, lo que permite que otras aplicaciones usen esos mismos recursos limitados más adelante.
Aprovechan los espacios de nombres del kernel : cada contenedor de forma predeterminada recibirá un entorno donde los siguientes son espacios de nombres:
/
en el contenedor serán diferentes/
a los del host.Cada uno de estos espacios de nombres también evita que un contenedor vea cosas como el sistema de archivos o los procesos en el host, o en otros contenedores, a menos que elimine explícitamente ese aislamiento.
Y otras herramientas de seguridad de Linux : los contenedores también utilizan otras características de seguridad como SELinux, AppArmor, Capabilities y Seccomp para limitar a los usuarios dentro del contenedor, incluido el usuario root, para que no puedan escapar del contenedor o impactar negativamente en el host.
Empaquete sus aplicaciones con sus dependencias para la portabilidad : Empaquetar una aplicación en un contenedor implica ensamblar no solo la aplicación en sí, sino todas las dependencias necesarias para ejecutar esa aplicación, en una imagen portátil. Esta imagen es el sistema de archivos base que se utiliza para crear un contenedor. Debido a que solo estamos aislando la aplicación, este sistema de archivos no incluye el kernel y otras utilidades del sistema operativo necesarias para virtualizar un sistema operativo completo. Por lo tanto, la imagen de un contenedor debe ser significativamente más pequeña que la imagen de una máquina virtual equivalente, lo que agiliza la implementación en los nodos de la red. Como resultado, los contenedores se han convertido en una opción popular para implementar aplicaciones en la nube y centros de datos remotos.
Depende : si su entorno de desarrollo está ejecutando Linux y no necesita acceso a dispositivos de hardware, o es aceptable tener acceso directo al hardware físico, entonces encontrará una migración a un contenedor de Linux bastante sencilla. El objetivo ideal para un contenedor de ventana acoplable son aplicaciones como las API basadas en web (por ejemplo, una aplicación REST), a las que se accede a través de la red.
Desarrollo u operaciones : Docker generalmente se lleva a un entorno en una de dos rutas. Desarrolladores que buscan una manera de desarrollar y probar localmente su aplicación más rápidamente, y operaciones que buscan ejecutar más carga de trabajo en menos hardware de lo que sería posible con máquinas virtuales.
O Devops : uno de los objetivos ideales es aprovechar Docker inmediatamente desde la herramienta de implementación de CI / CD, compilando la aplicación y construyendo inmediatamente una imagen que se implementa en desarrollo, CI, producción, etc. Los contenedores a menudo reducen el tiempo para mover la aplicación desde el registro del código hasta que esté disponible para la prueba, lo que hace que los desarrolladores sean más eficientes. Y cuando se diseña correctamente, la misma imagen que fue probada y aprobada por los desarrolladores y las herramientas de CI se puede implementar en producción. Dado que esa imagen incluye todas las dependencias de la aplicación, el riesgo de que algo se rompa en la producción que funcionó en el desarrollo se reduce significativamente.
Escalabilidad : un último beneficio clave de los contenedores que mencionaré es que están diseñados para la escalabilidad horizontal en mente. Cuando tiene aplicaciones sin estado bajo una carga pesada, los contenedores son mucho más fáciles y rápidos de escalar debido a su tamaño de imagen más pequeño y a la reducción de la sobrecarga. Por esta razón, verá que los contenedores están siendo utilizados por muchas de las empresas más grandes basadas en la web, como Google y Netflix.
fuente
Las mismas preguntas me golpearon la cabeza hace unos días y lo que encontré después de meterme en ello, entendamos en palabras muy simples.
Tomemos un ejemplo de que estamos desarrollando una aplicación utilizando los servicios nodeJs, MongoDB, Redis, RabbitMQ, etc. [puede pensar en otros servicios].
Ahora nos enfrentamos a las siguientes cosas como problemas en el desarrollo de aplicaciones y el proceso de envío si nos olvidamos de la existencia de Docker u otras alternativas de aplicaciones de contenedores.
Compatibilidad de servicios (nodeJs, mongoDB, Redis, RabbitMQ, etc.) con el sistema operativo (incluso después de encontrar versiones compatibles con el sistema operativo, si sucede algo inesperado relacionado con las versiones, entonces debemos volver a revisar la compatibilidad y solucionarlo).
Si dos componentes del sistema requieren una biblioteca / dependencia con diferentes versiones en la aplicación en el sistema operativo (eso necesita una revisión cada vez en caso de un comportamiento inesperado de la aplicación debido al problema de la versión de la biblioteca y la dependencia).
Lo más importante es que si una nueva persona se une al equipo, nos resulta muy difícil configurar el nuevo entorno, la persona tiene que seguir un gran conjunto de instrucciones y ejecutar cientos de comandos para finalmente configurar el entorno. Y lleva tiempo y esfuerzo.
Las personas deben asegurarse de que están usando la versión correcta del sistema operativo y verificar las compatibilidades de los servicios con el sistema operativo, y cada desarrollador debe seguir esto cada vez que se configura.
También tenemos diferentes entornos como desarrollo, prueba y producción . Si un desarrollador se siente cómodo usando un SO y otro se siente cómodo con otro SO Y en este caso, no podemos garantizar que nuestra aplicación se comportará de la misma manera en estas dos situaciones diferentes .
Todo esto nos dificulta la vida en el proceso de desarrollo , prueba y envío de las aplicaciones.
Por lo tanto, necesitamos algo que maneje los problemas de compatibilidad y nos permita realizar cambios y modificaciones en cualquier componente del sistema sin afectar a otros componentes.
Cómo resuelve Docker los problemas anteriores
Podemos ejecutar cada componente de servicio (nodeJs, MongoDB, Redis, RabbitMQ) en diferentes contenedores con sus propias dependencias y bibliotecas en el mismo SO pero con diferentes entornos.
Solo tenemos que ejecutar la configuración de la ventana acoplable una vez, luego todos los desarrolladores de nuestro equipo pueden comenzar con el comando simple de ejecución de la ventana acoplable, hemos ahorrado mucho tiempo y esfuerzos aquí :) .
Espero que esto sea de ayuda.
fuente
Permítanme intentar brindar respuestas lo más simples posible:
¿Qué es un contenedor?
En pocas palabras: un paquete que contiene software . Más específicamente, una aplicación y todas sus dependencias agrupadas. Un entorno de aplicaciones normal, no acoplado, se conecta directamente al sistema operativo, mientras que un contenedor Docker es una capa de abstracción del sistema operativo.
Y un contenedor se diferencia de una imagen en que un contenedor es una instancia de tiempo de ejecución de una imagen , similar a cómo los objetos son instancias de clases en tiempo de ejecución en caso de que esté familiarizado con OOP.
Tanto las máquinas virtuales como los contenedores Docker son técnicas de virtualización, ya que brindan abstracción sobre la infraestructura del sistema.
Una máquina virtual ejecuta un sistema operativo "invitado" completo con acceso virtual a los recursos del host a través de un hipervisor. Esto significa que la máquina virtual a menudo proporciona al entorno más recursos de los que realmente necesita. En general, las máquinas virtuales proporcionan un entorno con más recursos de los que necesitan la mayoría de las aplicaciones. Por tanto, los envases son una técnica más ligera. Los dos resuelven problemas diferentes.
La contenerización va de la mano con los microservicios. Los servicios más pequeños que componen la aplicación más grande a menudo se prueban y se ejecutan en contenedores Docker. Esto facilita las pruebas continuas.
Además, dado que los contenedores de Docker son de solo lectura, aplican un principio clave de DevOps: los servicios de producción deben permanecer inalterados
Algunos beneficios generales de usarlos:
fuente