Original article: https://www.freecodecamp.org/news/7-cases-when-not-to-use-docker/

Docker es un cambio de juego. Pero no es una solución única para todos.

Docker tiene muchas cosas buenas. Empaca, expide, y ejecuta aplicaciones como una herramienta de contenerización con ligera, portable y autosuficiente. Docker es genial para negocios de todos los tamaños. Cuando trabajas un pedazo de código en un equipo pequeño, elimina el problema "pero funciona en mi computador" . Mientras tanto, empresas usan Docker para construir entregas de ductos de software ágil y ductos para enviar nuevas funciones de forma más rápida y segura.

Con su sistema de contenedores incorporado, Docker es una excelente herramienta para la computación en la nube. A su vez, Docker Swarm promueve la agrupación en clústeres y el diseño descentralizado. Suena demasiado bueno para ser verdad, ¿verdad? Bueno, todavía hay varios casos en los que no se debe usar Docker. Aquí hay siete de ellos.

Veámoslos uno por uno.

No uses Docker si necesitas aumentar la velocidad

Los contenedores Docker son más pequeños y requieren menos recursos que una máquina virtual con un servidor y una base de datos. Al mismo tiempo, Docker utilizará tantos recursos del sistema como lo permita el programador del kernel del alojamiento. No esperes que Docker acelere una aplicación de ninguna manera.

Es más, Docker podría incluso hacerlo más lento. Si estás trabajando con él, debes establecer límites sobre la cantidad de memoria, CPU o bloque IO que puede usar el contenedor. De lo contrario, si el kernel detecta que la memoria de la máquina de alojamiento se está agotando para realizar funciones importantes del sistema, podría comenzar a eliminar procesos importantes. Si se elimina el proceso incorrecto (incluido el propio Docker), el sistema será inestable.

Desafortunadamente, los ajustes de memoria de Docker, la prioridad de falta de memoria en el demonio de Docker (Docker daemon) , no resuelven este problema. Por el contrario, una capa adicional entre una aplicación y el sistema operativo también podría resultar en una reducción de la velocidad. Sin embargo, esta disminución será insignificante. Los contenedores Docker no están completamente aislados y no contienen un sistema operativo completo como cualquier máquina virtual.

No uses Docker si priorisas la seguridad

La mayor ventaja de seguridad de Docker es que divide la aplicación en partes más pequeñas. Si la seguridad de una parte se ve comprometida, el resto de ellas no se verá afectada.

Sin embargo, mientras que los procesos aislados en los contenedores prometen una mayor seguridad, todos los contenedores comparten el acceso a un solo sistema operativo de alojamiento. Corres el riesgo de ejecutar contenedores Docker con un aislamiento incompleto. Cualquier código malicioso puede acceder a la memoria de su computadora.

Existe una práctica popular para ejecutar muchos contenedores en un solo entorno. Así es como haces que tu aplicación esté predispuesta al tipo de ataques de abuso de recursos, a menos que limites las capacidades del contenedor de recursos. Para una máxima eficiencia y aislamiento, cada contenedor debes abordar un área específica de interés.

Otro problema es la configuración predeterminada de Docker: los usuarios no tienen espacios de nombres (namespace) . Los espacios de nombres permiten que los recursos de software usen otros recursos solo si pertenecen a un espacio de nombres específico.

Ejecutar aplicaciones con Docker implica ejecutar el demonio de Docker (Docker daemon)  con privilegios de superusuario (root). Cualquier proceso que salga del contenedor Docker tendrá los mismos privilegios en el alojamiento que tenía en el contenedor. Ejecutar sus procesos dentro de los contenedores como un usuario sin privilegios no puede garantizar la seguridad. Depende de las capacidades que agregue o elimine. Para mitigar los riesgos de ruptura de contenedores de Docker, no debes descargar contenedores listos para usar de fuentes no confiables.

No uses Docker si desarrollas una aplicación GUI de escritorio

Docker no se adapta a las aplicaciones que requieren una interfaz de usuario rica. Docker está destinado principalmente a contenedores aislados con aplicaciones basadas en consola. Las aplicaciones basadas en GUI no son una prioridad, su soporte dependerá del caso y la aplicación específicos. Los contenedores de Windows se basan en Nano o Core Server; no permite a los usuarios iniciar una interfaz basada en GUI o un servidor Docker RDP en el contenedor Docker.

Sin embargo, aún puedes ejecutar aplicaciones basadas en GUI desarrolladas con Python y el marco QT en un contenedor de Linux. Además, puedes usar el reenvío X11, pero esta solución es algo incómoda.

No uses Docker si quieres aliviar el desarrollo y la depuración

Docker fue creado por desarrolladores y para desarrolladores. Brinda estabilidad al entorno: un contenedor en la máquina de desarrollo funcionará exactamente igual en el escenario, la producción o cualquier otro entorno. Esto elimina el problema de varias versiones de programas en diferentes entornos.

Con la ayuda de Docker, puedes agregar fácilmente una nueva dependencia a tu aplicación. Ningún desarrollador de tu equipo necesitará repetir esta manipulación en su máquina. Todo estará funcionando en el contenedor y distribuido a todo el equipo.

Al mismo tiempo, debes realizar una configuración adicional para codificar tu aplicación en Docker. Además, con la depuración de Docker, debes configurar la salida de registros y configurar los puertos de depuración. Es posible que también necesites asignar puertos para sus aplicaciones y servicios en contenedores. Entonces, si tienes un proceso de implementación complicado y tedioso, Docker ayudará mucho. Si tienes una aplicación simple, solo agregas una complejidad innecesaria.

No uses Docker si necesitas usar diferentes sistemas operativos o kernels

Con las máquinas virtuales, el hipervisor puede abstraer un dispositivo completo. Puede usar Microsoft Azure para ejecutar ambas instancias de Windows Server y Linux Server al mismo tiempo. Sin embargo, la imagen de Docker requiere el mismo sistema operativo para el que se creó.

Hay una gran base de datos de imágenes de contenedores Docker: Docker Hub. Sin embargo, si se creó una imagen en Linux Ubuntu, solo se ejecutará en el mismo Ubuntu.

Si una aplicación se desarrolla en Windows, pero la producción se ejecuta en Linux, no podrás usar Docker de manera efectiva. A veces, es más fácil configurar un servidor si tiene varias aplicaciones estáticas.

No uses Docker si tienes muchos datos valiosos que almacenar

Por diseño, todos los archivos de Docker se crean dentro de un contenedor y se almacenan en una capa de contenedor de escritura. Puede ser difícil recuperar los datos del contenedor si un proceso diferente los necesita. Además, la capa de escritura de un contenedor está conectada a la máquina host en la que se ejecuta el contenedor. Si necesitas mover los datos a otro lugar, no puedes hacerlo fácilmente. Más que eso, todos los datos almacenados dentro de un contenedor se perderán para siempre una vez que el contenedor se apague.

Primero debes pensar en formas de guardar tus datos en otro lugar. Para mantener los datos seguros en Docker, debes emplear una herramienta adicional: Volúmenes de datos de Docker. Sin embargo, esta solución sigue siendo bastante torpe y necesita ser mejorada.

No uses Docker si estás buscando la tecnología más fácil de administrar

Al ser introducido en 2012, Docker sigue siendo una nueva tecnología. Como desarrollador, es posible que debas actualizar las versiones de Docker con regularidad. Desafortunadamente, la compatibilidad con versiones anteriores no está garantizada. Además, la documentación se está quedando atrás con respecto al avance de la tecnología. Como desarrollador, tendrás que resolver algunas cosas tú mismo.

Además, las opciones de monitorización que ofrece Docker son bastante pobres. Puedes obtener una visión rápida de algunas estadísticas simples. Sin embargo, si deseas ver algunas funciones de monitoreo avanzadas, Docker no tiene nada que ofrecer.

También, en el caso de una aplicación grande y compleja, la implementación de Docker tiene un costo. Crear y mantener la comunicación entre numerosos contenedores en numerosos servidores requerirá mucho tiempo y esfuerzo. Sin embargo, existe una herramienta útil que facilita el trabajo con aplicaciones Docker de varios contenedores: Docker Compose. Docker Compose define servicios, redes y volúmenes en un solo archivo YAML.

No obstante, el ecosistema de Docker está bastante fracturado: no todos los productos de contenedores compatibles funcionan bien entre sí. Cada producto está respaldado por una determinada empresa o comunidad. La competencia acalorada entre ellas produce incompatibilidad.

Para concluir

Los profesionales de KeenEthics disfrutan trabajar con Docker y, a menudo, lo usan para el desarrollo de aplicaciones. A pesar de algunos inconvenientes, puedes usarlo fácilmente para ejecutar y administrar aplicaciones en paralelo en contenedores aislados.

Instalar una aplicación puede ser tan simple como ejecutar un solo comando – <docker run>. Docker también proporciona un entorno de aislamiento limpio y original para cada prueba, lo que lo convierte en una herramienta importante y útil para las pruebas de automatización.

Las características de Docker ofrecen beneficios en términos de administración de dependencias y seguridad. Mejorado con herramientas tan útiles como Docker Hub, Docker Swarm y Docker Compose, Docker es una solución popular y fácil de usar.

A pesar de todos los beneficios de Docker, no debes usarlo para contener todas y cada una de las aplicaciones que desarrolles.

Recuerda: Docker cambia las reglas del juego. Pero no es una solución única para todos.

Docker tampoco es la única herramienta de este tipo en el mercado. Las alternativas de Docker son rkt, pronunciado como 'rocket', Linux Containers u OpenVZ. Cada uno de estos con sus ventajas y desventajas es bastante similar a Docker. La creciente popularidad y las tasas de uso de Docker se deben únicamente a la decisión de las empresas de adoptarlo.

Antes de saltar a conclusiones sobre si debe usar Docker o no, investiga los requisitos del proyecto. Habla con tus compañeros de equipo o compañeros y permítales que te ayuden a decidir cuándo usar Docker,  y cuándo no usar contenedores y si es uno de esos casos de uso de Docker.

Te guste o no, esta tecnología tiene futuro. Hay algunos desarrolladores y agencias de desarrollo que odian a Docker y tratan de eliminarlo de todos sus proyectos en curso. Al mismo tiempo, hay especialistas que contienen todo lo que pueden porque ven a Docker como una panacea. Tal vez, no deberías unirte a ninguno de los campos. Mantente imparcial, mantente objetivo y toma una decisión dependiendo de la situación en particular.

Tienes una idea para un proyecto Docker?

Mi empresa KeenEthics es un equipo de desarrolladores de aplicaciones web experimentados. En caso de que necesites un presupuesto gratuito de un proyecto similar, no dudes en ponerte en contacto.

P.S.

Además, me gustaría decir "gracias" a Alex Pletnov por ser coautor de este artículo, así como a los lectores por leer hasta el final.