GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo contenerizar aplicaciones heredadas

Introducción

Las organizaciones de todo el mundo están adoptando un enfoque basado en microservicios e impulsado por contenedores para la entrega de software. Sin embargo, la mayor parte del software se diseñó y escribió antes de que existieran los contenedores modernos basados ​​en imágenes.

Si planea realizar la transición a un modelo de implementación de contenedores de Docker, debe considerar los efectos que tendrá la migración en sus aplicaciones existentes.

Este tutorial describe el trabajo de preparación necesario y los comandos básicos de Docker para contener aplicaciones heredadas.

¿Por qué contener aplicaciones heredadas?

Las empresas que adoptan la implementación de software de contenedores necesitan reestructurar su organización para reflejar los procesos del nuevo flujo de trabajo de contenedores. Analizar los beneficios potenciales de la implementación de contenedores es útil para determinar el mejor enfoque para su aplicación.

Eficiencia y portabilidad

La implementación de contenedores puede ser una solución eficaz, ya que los contenedores suelen comenzar en segundos. La imagen del contenedor contiene todos los archivos binarios, bibliotecas y dependencias, lo que significa que no es necesario agregar configuraciones específicas del entorno. La misma imagen ahora es portátil a través de múltiples sistemas. La imagen está libre de limitaciones ambientales, lo que hace que las implementaciones sean confiables, portátiles y escalables. Al contener las aplicaciones, separa el sistema de archivos y el tiempo de ejecución de su host.

Mantenibilidad y escalabilidad

En lugar de administrar una aplicación monolítica extensa, crea un patrón arquitectónico en el que las aplicaciones complejas consisten en procesos pequeños e independientes que se comunican entre sí mediante API.

Al resolver conflictos de aplicaciones entre diferentes entornos, los desarrolladores pueden compartir su software y dependencias con las operaciones de TI y los entornos de producción. Los desarrolladores y las operaciones de TI están estrechamente vinculados y pueden colaborar de manera efectiva. El flujo de trabajo del contenedor proporciona a Dev Ops la continuidad que necesitan. La capacidad de identificar problemas al principio del ciclo de desarrollo reduce el costo de una revisión importante en una etapa posterior.

Herramientas de gestión de contenedores

Las herramientas de administración de contenedores de terceros proporcionan un mecanismo para redes, monitoreo y almacenamiento persistente para aplicaciones en contenedores. Las aplicaciones heredadas pueden aprovechar los marcos de orquestación de última generación, como Kubernetes.

Estas herramientas mejoran el tiempo de actividad, las capacidades analíticas y facilitan el seguimiento del estado de las aplicaciones.

Plan de Contenedores

Para migrar con éxito sus aplicaciones, debe desarrollar una estrategia que examine las necesidades de sus aplicaciones junto con la naturaleza de los contenedores. A nivel técnico, cualquier aplicación puede desplegarse en un contenedor. Existen varias soluciones posibles para implementar una aplicación heredada en un contenedor:

1. Reescriba y rediseñe por completo su aplicación heredada.

2. Ejecute una aplicación monolítica existente dentro de un único contenedor.

3. Aumente y remodele las aplicaciones para que puedan aprovechar la nueva arquitectura distribuida.

Independientemente de la ruta elegida, es fundamental identificar correctamente si una aplicación es una buena candidata para implementarse en un entorno de contenedor en primer lugar. El enfoque debe estar en la arquitectura, el rendimiento y la seguridad.

Arquitectura

Las aplicaciones deben deconstruirse en servicios individuales para que puedan escalarse e implementarse individualmente. Para utilizar completamente la implementación de contenedores, determine si es posible dividir su aplicación existente en varios contenedores.

Idealmente, un solo proceso debe asignarse a un solo contenedor. Incluso los trabajos cron deben externalizarse en contenedores separados. Esto podría requerir rehacer la arquitectura de su aplicación.

Rendimiento

Determine si su aplicación tiene requisitos de hardware específicos. Los contenedores usan funciones de Linux que dividen el kernel subyacente. Puede ser necesario configurar contenedores individuales con parámetros únicos o proporcionar recursos específicos.

Además, tenga en cuenta que Docker no tiene un init daemon para limpiar los procesos zombie. Asegúrese de proporcionar uno como PUNTO DE ENTRADA en su dockerfile. Considere dumb.ino como una posible solución ligera.

Seguridad

Los contenedores ofrecen menos aislamiento que las máquinas virtuales y es importante definir el nivel de seguridad que necesita su aplicación. Configure restricciones estrictas de cuentas de usuario y de servicio. Mantenga los secretos y las contraseñas aislados de las imágenes de su contenedor, cumpla con los principios de privilegio mínimo y mantenga una defensa en profundidad para proteger los clústeres de Kubernetes.

Requisitos de memoria persistente

En la orquestación de contenedores, todos los datos persistentes no se guardan dentro de la capa de escritura de los contenedores. En cambio, los datos permanentes se guardan en volúmenes persistentes claramente definidos. Este enfoque garantiza que los datos permanentes no aumenten el tamaño de un contenedor y existan independientemente del ciclo de vida del contenedor.

Si los datos permanentes de su aplicación heredada se distribuyen por el sistema de archivos o se escriben en rutas compartidas con la propia aplicación, le recomendamos que reestructure la aplicación para que escriba todos los datos permanentes en una sola ruta en el sistema de archivos. Eso simplificará la migración de datos de aplicaciones a un entorno en contenedores.

Externalizar servicios

Identifique los servicios locales que pueden externalizarse y ejecutarse en contenedores separados. Busque los servicios de almacenamiento en caché y de base de datos, que se pueden externalizar más fácilmente. Como alternativa, es posible que desee utilizar los servicios administrados en lugar de configurarlos y administrarlos usted mismo.

Preparar imagen para múltiples entornos

Se espera que utilice una única imagen de Docker en un entorno de desarrollo, control de calidad y producción. Tenga en cuenta las variables de configuración específicas del entorno. Si identifica alguno, deberá escribir un script de inicio que actualizará los archivos de configuración de la aplicación predeterminada.

Implementar aplicación heredada en contenedores

Suponiendo que Docker esté funcionando en su sistema, hay varias formas de crear una imagen de Docker:

  1. Utilice una imagen vacía y agregue capas adicionales importando un conjunto de archivos externos.
  2. Use la línea de comando para ingresar comandos individuales de Docker de forma interactiva y crear una nueva imagen con docker commit .
  3. Emplee una herramienta de administración de configuración sofisticada (p. ej., como Puppet y Chef) para implementaciones complejas.
  4. Utilice una imagen base existente y especifique un conjunto de comandos en un Dockerfile .

Los Dockerfiles son un excelente punto de partida para comprender cómo usar un tiempo de ejecución de contenedor para crear una imagen. Si comete un error, puede modificar fácilmente el archivo y crear una nueva imagen de contenedor con un solo comando.

Archivo Docker de aplicación heredada

Un Dockerfile es un archivo de texto simple con un conjunto de comandos que se ejecutan en orden estricto. Los Dockerfiles generalmente se basan en imágenes existentes, con solo algunas configuraciones adicionales. Use su interfaz de línea de comandos para crear un directorio que contenga los archivos que necesita para su compilación:

mkdir ImageForLegacyApp
cd ImageForLegacyApp

Una vez que comienza el proceso de compilación, los archivos dentro de ese directorio se envían al demonio Docker. Al restringir la cantidad de archivos, aceleramos el proceso de compilación y ahorramos espacio en disco.

Use su editor de texto preferido para codificar o programar (usamos vim) para crear un Dockerfile vacío, dentro de ImageForLegacyApp directorio:

vim Dockerfile

Las siguientes instrucciones de compilación son para una aplicación PHP simple. Empezamos tirando un sistema operativo con PHP y Apache instalado.

FROM php:apache

FROM es la primera instrucción en el Dockerfile. Define la imagen base, en este ejemplo Debian OS con PHP y Apache instalados. Si desea una versión específica de una imagen base, asegúrese de usar la etiqueta correspondiente (por ejemplo, php:7.0-apache ).

COPY ./var/www/html

Utilice el COPY comando para copiar su código PHP a la imagen. Usa el ADD comando en su lugar si la extracción de alquitrán es necesaria.

WORKDIR /var/www/html

Esto define la carpeta de trabajo. Todos los comandos posteriores se aplicarán a esta carpeta.

EXPOSE 80

Configure el puerto para que la aplicación escuche con EXPOSE dominio. Una vez que inicia la imagen y vincula la que se está ejecutando con otro contenedor, el puerto expuesto está disponible para el otro contenedor como si estuviera en el mismo sistema local.

CMD [“php”, “./legacy_app.php”]

Usa el CMD comando para identificar el comando predeterminado que se ejecutará desde la imagen, junto con las opciones que desea pasarle. Solo puede tener una línea CMD en un Dockerfile.

LABEL version="1.1"

Usamos la LABEL instrucciones para agregar metadatos a la imagen. Además de la etiqueta que asigne, la imagen extraerá todas las etiquetas asignadas a la imagen principal invocada con el FROM comando.

Creación de una imagen de Docker

Hemos definido con éxito las instrucciones dentro del Dockerfile. Inicie el proceso de compilación ingresando el siguiente comando en su terminal de comando:

docker build -t legacyapp [location_of_Dockerfile]

Durante el proceso de construcción, cada imagen recibe una identificación única. Para ubicar e identificar fácilmente la imagen en un registro, use -t Comando para nombrar la imagen. En este ejemplo, la imagen se llamará legacyapp .

docker build -t legacyapp .
  1. La docker build El comando le indica al demonio Docker que cree una imagen basada en el Dockerfile.
  2. La ruta proporcionada a la docker build El comando se utiliza para cargar archivos y directorios.
  3. Cada paso de compilación está numerado a medida que el demonio Docker continúa con la ejecución de los comandos del Dockerfile.
  1. Cada comando da como resultado una nueva imagen. Y la identificación de la imagen se presenta en pantalla.
  2. Cada contenedor acoplable intermedio se elimina antes de continuar con el siguiente paso para conservar espacio en disco.

La imagen de Docker está lista y ha recibido una referencia de ID única. Además, no usamos una etiqueta de versión, por lo que Docker etiquetó automáticamente la imagen como :latest .

Ejecutar una imagen de Docker

La imagen ahora está lista para ser implementada. La docker run el subcomando inicia el contenedor:

sudo docker run --name apache2 legacyapp

El --name El argumento proporciona al contenedor un nombre único, mientras que legacyapp El argumento representa el nombre de la imagen acoplable estática que creamos.

Para ver una lista de contenedores que se han iniciado y eliminado, escriba el siguiente comando:

docker ps -a

El resultado proporciona una descripción general junto con el ID y el estado del contenedor.

Vaya a localhost para verificar si el servidor Apache está sirviendo su aplicación correctamente.


Linux
  1. Cómo mejorar el tiempo de inicio de la aplicación en Linux

  2. Cómo usar Podman dentro de un contenedor

  3. Cómo cambiar las aplicaciones predeterminadas de Debian

  4. Cómo instalar la aplicación Spotify en Linux

  5. ¿Cómo limitar el uso de la memoria de la aplicación?

Cómo agregar una aplicación en la lista de aplicaciones abiertas con Ubuntu

¿Cómo agregar una aplicación a la lista de aplicaciones abiertas con?

Cómo crear un contenedor de aplicaciones Django Docker

Cómo usar SSH en un contenedor Docker

Cómo implementar aplicaciones completas rápidamente con las plantillas de aplicaciones de Portainer

Cómo gestionar contenedores Docker