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