Docker, que es y para que sirve

111

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?

mfrachet
fuente

Respuestas:

115

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. ggg

(Tenga en cuenta que no se requiere un sistema operativo invitado en el caso de Docker)

JerryGoyal
fuente
1
Intenté buscar recursos con respecto al flujo de trabajo de desarrollo e implementación de Docker, pero parece que no puedo encontrar nada. Pongamos por ejemplo que tengo un entorno lampp con laravel + angular4. ¿Comparto cierto archivo con mis compañeros de equipo? ¿Cómo edito la fuente de la aplicación (php html js / ts) si la coloco dentro de un contenedor? ¿Podemos seguir usando git / svn en nuestro código fuente?
anaval
13
VM significa "máquina virtual". No es necesario llamarlo "Máquina VM" porque entonces se convierte en "Máquina virtual". :)
Dzhuneyt
32

[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. ]

¿Qué es un contenedor?

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:

  • Montaje: los sistemas de archivos, /en el contenedor serán diferentes /a los del host.
  • PID: ID de proceso, pid 1 en el contenedor es su aplicación iniciada, este pid será diferente cuando se vea desde el host.
  • Red: los contenedores se ejecutan con su propia interfaz de bucle invertido (127.0.0.1) y una IP privada por defecto. Docker utiliza tecnologías como las redes puente de Linux para conectar varios contenedores en su propia LAN privada.
  • IPC: comunicación entre procesos
  • UTS: esto incluye el nombre de host
  • Usuario: opcionalmente, puede cambiar todas las identificaciones de usuario para que se compensen con las 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.

¿Puede reemplazar una máquina virtual dedicada al desarrollo?

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.

¿Cuál es el propósito, en palabras simples, de usar Docker en las empresas? La ventaja principal ?

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.

BMitch
fuente
2
+1 Estoy completamente de acuerdo con su respuesta, especialmente con la parte "¿Puede reemplazar las máquinas virtuales?". Veo muchos comentarios en otros lugares que enfatizan que Docker no es una máquina virtual, pero, por experiencia, para muchos casos de uso funciona igual de bien o incluso es una mejor alternativa. Sin embargo, ¿qué quiere decir cuando dijo "aceptable tener acceso directo al hardware físico"?
Tyress
2
@tyress si su host es Linux, puede montar dispositivos directamente en un contenedor Linux. Lo he visto hacer con dispositivos de sonido, pero se puede agregar cualquier cosa en / dev. Esto evita el aislamiento de algunos contenedores, pero tiene sentido para tareas específicas como aplicaciones de escritorio.
BMitch
esto es increíble. No pensé en eso.
Tyress
@BMitch: respuesta muy limpia y elegante, gracias !! Creo que ahora puedo visualizar qué es el contenedor ... sin embargo, sería genial si pudieras actualizar tu respuesta sobre cómo se relaciona el contenedor con la ventana acoplable. En comparación con el contenedor y la máquina virtual, ¿Docker es equivalente a hipervisor?
rahulaga_dev
1
Docker es una herramienta que implementa contenedores, además de proporcionar el resto del ecosistema necesario, como el registro en Docker Hub y entornos de escritorio que integran una VM para ejecutar contenedores Linux.
BMitch
6

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.

¿Por qué uno pensaría en Docker y contenedores cuando todo parece estar bien con el proceso actual de arquitectura y desarrollo de aplicaciones?

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.

  1. 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).

  2. 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).

  3. 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.

  4. 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.

Ahora pensamos en Docker porque su propósito es contener las aplicaciones y automatizar la implementación de aplicaciones y enviarlas muy fácilmente.

ingrese la descripción de la imagen aquí

Cómo resuelve Docker los problemas anteriores

  1. 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.

  2. 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í :) .

Por lo tanto, los contenedores son entornos aislados con todas las dependencias y bibliotecas agrupadas con sus propios procesos e interfaces y montajes de red .

Todos los contenedores utilizan los mismos recursos del sistema operativo, por lo que tardan menos en arrancar y utilizan la CPU de forma eficiente con menos costes de hardware.

Espero que esto sea de ayuda.

Siyaram Malav
fuente
2

Permítanme intentar brindar respuestas lo más simples posible:

Pero, de hecho, no sé cuál es el propósito de este "contenedor".

¿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.

¿Puede reemplazar una máquina virtual dedicada al desarrollo?

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.

¿Cuál es el propósito, en palabras simples, de usar Docker en las empresas? ¿La ventaja principal?

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:

  • Gran aislamiento de servicios
  • Gran manejabilidad ya que los contenedores contienen todo lo que la aplicación necesita
  • Encapsulación de tecnología de implementación (en los contenedores)
  • Uso eficiente de recursos (debido a la virtualización del sistema operativo liviano) en comparación con las VM
  • Despliegue rápido
Joel H
fuente