Personalización de una imagen de Docker para ejecutar una aplicación web propia

Completado

Docker Hub es una fuente excelente de imágenes que le permite comenzar a compilar aplicaciones en contenedores propias. Puede descargar una imagen que proporcione la funcionalidad básica que necesita y, luego, colocar la aplicación propia sobre ella para crear una imagen personalizada. Puede automatizar los pasos para realizar este proceso mediante la escritura de un Dockerfile.

En el escenario de la tienda de ropa en línea, la empresa ha decidido que Docker es una buena idea. El siguiente paso consiste en determinar la forma óptima de incluir las aplicaciones web en contenedores. La compañía pretende construir muchas de las aplicaciones mediante ASP.NET Core. Ha observado que Docker Hub contiene una imagen base que incluye este marco. Como una prueba de concepto, quiere comenzar con esta imagen base y agregar el código de una de las aplicaciones web para crear una imagen personalizada. También quiere que este proceso se pueda repetir con facilidad, para automatizarlo cada vez que se publique una versión nueva de la aplicación web.

En esta unidad, obtendrá información sobre cómo crear una imagen de Docker personalizada y cómo puede automatizar el proceso mediante la escritura de un Dockerfile.

Creación de una imagen personalizada con un Dockerfile

Para crear una imagen de Docker que contenga la aplicación, normalmente empezará identificando una imagen base a la que agregar archivos e información de configuración. El proceso de identificación de una imagen base adecuada normalmente comienza con una búsqueda de imágenes en Docker Hub. Desea una imagen que ya contenga un marco de aplicación y todas las utilidades y herramientas de una distribución de Linux, como Ubuntu o Alpine. Por ejemplo, si tiene una aplicación ASP.NET Core que quiere empaquetar en un contenedor, Microsoft publica una imagen llamada mcr.microsoft.com/dotnet/core/aspnet que ya contiene el runtime de ASP.NET Core.

Puede personalizar una imagen si inicia un contenedor con la imagen base y lo modifica. En general, los cambios implican actividades como la copia de archivos del sistema de archivos local en el contenedor y la ejecución de varias herramientas y utilidades para compilar código. Cuando haya terminado, use el comando docker commit para guardar los cambios en una imagen nueva.

Completar el proceso anterior de forma manual es una operación lenta y propensa a errores. Se podría incluir en script con un lenguaje de script como Bash, pero Docker ofrece una forma más eficaz de automatizar la creación de imágenes a través de un Dockerfile.

Un Dockerfile es un archivo de texto sin formato que contiene todos los comandos necesarios para compilar una imagen. Los Dockerfile se escriben en un lenguaje de scripting mínimo diseñado para compilar y configurar imágenes. Documentan las operaciones necesarias para crear una imagen a partir de una imagen base.

En el ejemplo siguiente se muestra un Dockerfile que crea una aplicación .NET Core 2.2 y la empaqueta en una imagen nueva.

FROM mcr.microsoft.com/dotnet/core/sdk:2.2
WORKDIR /app
COPY myapp_code .
RUN dotnet build -c Release -o /rel
EXPOSE 80
WORKDIR /rel
ENTRYPOINT ["dotnet", "myapp.dll"]

En este archivo se llevan a cabo las siguientes operaciones:

Get-Help Acción
FROM Descarga la imagen especificada y crea un contenedor en función de esta imagen.
WORKDIR Establece el directorio de trabajo actual en el contenedor, que usan los comandos posteriores.
COPY Copia los archivos del equipo host al contenedor. El primer argumento (myapp_code) es un archivo o carpeta en el equipo host. El segundo argumento (.) especifica el nombre del archivo o carpeta que va actuar como destino en el contenedor. En este caso, el destino es el directorio de trabajo actual (/app).
EJECUTAR Ejecuta un comando en el contenedor. Los argumentos del comando RUN son argumentos de línea de comandos.
EXPOSE Crea la configuración de la nueva imagen que especifica qué puertos se van a abrir cuando se ejecute el contenedor. Si el contenedor ejecuta una aplicación web, es habitual exponer el puerto 80.
ENTRYPOINT Especifica la operación que debe ejecutar el contenedor cuando se inicie. En este ejemplo, ejecuta la aplicación recién creada. Especifique el comando que desea ejecutar y cada uno de sus argumentos como una matriz de cadenas.

Por convención, las aplicaciones diseñadas para empaquetarse como imágenes de Docker normalmente tienen un Dockerfile ubicado en la raíz de su código fuente, y casi siempre se denomina Dockerfile.

El comando docker build crea una imagen mediante la ejecución de un Dockerfile. La sintaxis de este comando tiene varios parámetros:

  • La marca -f indica el nombre del Dockerfile que se va a usar.
  • La marca -t especifica el nombre de la imagen que se va a crear, myapp:v1 en este ejemplo.
  • El último parámetro, ., proporciona el contexto de compilación para los archivos de origen para el comando COPY: es el conjunto de archivos del equipo host necesarios durante el proceso de compilación.
docker build -t myapp:v1 .

En segundo plano, el comando docker build crea un contenedor, ejecuta comandos en él y, después, confirma los cambios en una imagen nueva.