Al desarrollar para el mundo de los contenedores, es fundamental trabajar de forma inteligente. Descubra las mejores prácticas para ello.
En algún momento, su desarrollo pasará de aplicaciones monolíticas tradicionales a microservicios. Eso significa contenedores. El mundo del desarrollo de contenedores es un poco diferente a lo que estamos acostumbrados, lo que significa que muchas de las antiguas mejores prácticas ya no se aplican.
Entonces, si buscas un cambio con respecto al desarrollo de aplicaciones estándar, ¿qué haces? Aprendes lo más rápido que puedes. Y dada la rapidez con la que el mundo del desarrollo está evolucionando en estos días, ese ritmo ha alcanzado una velocidad vertiginosa. Por lo tanto, necesita aprender las mejores prácticas rápidamente o corre el riesgo de ser expulsado del juego o de implementar constantemente aplicaciones que no funcionan, no son confiables, no se pueden escalar o son demasiado inseguras para implementar. ser utilizado en un entorno corporativo.
¿Cuáles son algunas de las mejores prácticas que ya debería adoptar para el desarrollo de contenedores? Veamos algunos de ellos que son más inmediatos y pueden implementarse desde el comienzo de su viaje.
Utilice imágenes estables de entidades conocidas
Esto está en lo más alto de la lista, simplemente porque se ha convertido en uno de los problemas más importantes a los que se enfrenta la seguridad de los contenedores. Todo lo que desarrollas en un mundo en contenedores comienza con una imagen. Puede crear el suyo propio desde cero o tomar la ruta rápida y extraer una imagen de, por ejemplo, Docker Hub. Si opta por la ruta de terceros, siempre debe utilizar únicamente imágenes estables de entidades conocidas.
Digamos, por ejemplo, que desea basar la implementación de un contenedor en la última imagen de Python. Si busca en Docker Hub, encontrará muchas imágenes para Python, pero solo una imagen oficial de los desarrolladores reales de Python. Esta es la imagen que debes usar. Cualquier imagen proveniente de una entidad oficial será marcada como tal. Es importante que utilices únicamente estas imágenes. No extraigas una imagen de una fuente desconocida, porque nunca se sabe lo que podría contener.
Mantenga sus imágenes pequeñas
Es posible que tenga la tentación de formar sus contenedores en una imagen que incluya múltiples recursos. Tenga esto en cuenta: cuanto más grande sea la imagen, más grande será su contenedor. Si basa todos estos contenedores en imágenes más grandes al implementar una aplicación que incluye muchas partes móviles, además de introducir servicios innecesarios, corre el riesgo de acumular una factura de alojamiento en la nube significativamente mayor.
Recuerde, la idea detrás de la contenedorización es lograr una escalabilidad masiva a precios reducidos. Por lo tanto, implementar contenedores basados en imágenes de gran tamaño anula este propósito.
No haga eso. Utilice siempre la imagen (oficial) más pequeña que pueda encontrar. Y si no encuentras una imagen oficial lo suficientemente pequeña, crea la tuya propia. Además, con un panorama más amplio, el plan de ataque puede crecer exponencialmente.
Mantenlo pequeño.
Utilice datos persistentes
Debe evitar almacenar datos en la capa de almacenamiento de un contenedor. ¿Por qué? Dos razones: almacenamiento y accesibilidad. Considere esto: si almacenara datos en la capa de almacenamiento de un contenedor, ese contenedor crecería exponencialmente. Esto no es todo. Si el contenedor falla, ya no se podrá acceder a los datos. En su lugar, deberías almacenar tus datos en volúmenes persistentes.
Al utilizar volúmenes, se asegura de que el tamaño de los contenedores no aumente a medida que se recopilen más datos y que varios contenedores puedan acceder a los datos almacenados.
Emplear CI/CD para pruebas e implementación
Necesitará muchas pruebas. Y la implementación será un tema continuo. Recuerde, cuando coloca una aplicación en contenedores, el objetivo es la automatización. No querrás ralentizar el tiempo de implementación al tener que probar y volver a implementar todo manualmente. En su lugar, adopte un enfoque de integración continua/implementación continua (CI/CD).
Con CI/CD el objetivo es automatizar tanto como sea posible. Una vez que utilice CI/CD para las pruebas y la implementación, descubrirá que todo funciona de manera mucho más eficiente.
Identifique de forma inteligente imágenes de contenedores
Al crear sus propias imágenes (o modificar las que haya extraído), deberá etiquetarlas antes de que puedan volver a cargarse en sus repositorios. Al etiquetar estas imágenes, asegúrese de hacerlo de forma inteligente. No se limite a etiquetar una imagen con "más reciente" o la fecha. Es posible que haya incluido una característica específica en una imagen o haya creado una imagen para un propósito determinado.
Asegúrate de etiquetar estas imágenes para saber siempre su propósito.
Considere la seguridad en cada paso
Con el desarrollo de contenedores, la seguridad comienza desde el punto de partida y nunca se detiene. Esto es especialmente cierto cuando su objetivo es la automatización. En este punto, debe considerar la seguridad como un círculo que rodea todos los aspectos de su implementación.
La seguridad comienza con las imágenes base, pasa por los manifiestos de los contenedores, verifica DevOps, GitOps y las herramientas de automatización, avanza a través de la implementación y regresa a los repositorios que albergan su código. Si considera la seguridad como un componente interminable que debe seguir al contenedor de principio a fin, encontrará que vale la pena utilizar estas implementaciones.
Recuerde, la seguridad en el desarrollo de contenedores nunca descansa.
Una aplicación por contenedor
Si bien puede implementar un único contenedor que albergue todas las aplicaciones necesarias para un servicio, no debería hacerlo. ¿Por qué? La razón principal es que los contenedores de una sola aplicación son más fáciles de escalar. Y dado que la escalabilidad es uno de los principales objetivos de la contenedorización, es obvio.
La escalabilidad es posible porque un administrador de clúster puede implementar más contenedores cuando sea necesario. Por ejemplo, si su aplicación solo requiere más instancias de una base de datos para escalar, si ha movido esa base de datos a un contenedor con otras aplicaciones, el escalado incluirá esas otras aplicaciones, lo cual no es eficiente.
Los contenedores de una sola aplicación también son mucho más fáciles de crear y probar.
Conclusión
Si comienza su viaje de desarrollo de contenedores con estas mejores prácticas, irá con el pie derecho. Por supuesto, siempre hay más prácticas recomendadas, algunas de las cuales vendrán dictadas por el proyecto en cuestión. Pero, en general, lo que ve aquí debería ser útil en la mayoría de las implementaciones de contenedores.