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

Completado

Un Dockerfile contiene los pasos para compilar una imagen de Docker personalizada.

Decide implementar una de las aplicaciones web de su organización con Docker. Selecciona una aplicación web sencilla que implementa una API web para un sitio web de reservas de hotel. La API web expone operaciones POST y GET de HTTP para crear y recuperar las reservas del cliente.

Nota:

En esta versión de la aplicación web, las reservas no se conservan realmente y las consultas devuelven datos ficticios.

En este ejercicio, creará un Dockerfile para una aplicación que no tiene uno. Después, compilará la imagen y la ejecutará de forma local.

Creación de un Dockerfile para la aplicación web

  1. Si aún no se está ejecutando, inicie Docker en el equipo.

  2. En una ventana del símbolo del sistema en el equipo local, ejecute el comando siguiente para descargar el código fuente de la aplicación web.

    git clone https://github.com/MicrosoftDocs/mslearn-hotel-reservation-system.git
    
  3. Escriba el siguiente comando para abrir el directorio src.

    cd mslearn-hotel-reservation-system/src
    
  4. En el directorio src, escriba los siguientes comandos para crear un archivo denominado Dockerfile y abrirlo en el Bloc de notas:

    copy NUL Dockerfile
    notepad Dockerfile
    

    Nota:

    De forma predeterminada, el comando notepad abre un archivo de texto. Asegúrese de guardarlo como tipo de archivo Todos los archivos sin extensión de archivo. Para comprobarlo, abra la carpeta src en el Explorador de archivos y seleccione Ver > Mostrar> Extensiones de nombre de archivo. Si es necesario, cambie el nombre del archivo y quite .txt del nombre.

  5. Agregue el código siguiente al Dockerfile:

    FROM mcr.microsoft.com/dotnet/core/sdk:2.2
    WORKDIR /src
    COPY ["/HotelReservationSystem/HotelReservationSystem.csproj", "HotelReservationSystem/"]
    COPY ["/HotelReservationSystemTypes/HotelReservationSystemTypes.csproj", "HotelReservationSystemTypes/"]
    RUN dotnet restore "HotelReservationSystem/HotelReservationSystem.csproj"
    

    Este código incluye comandos para capturar una imagen que contiene el SDK de .NET Core Framework. Los archivo de proyecto para la aplicación web (HotelReservationSystem.csproj) y el proyecto de biblioteca (HotelReservationSystemTypes.csproj) se copian en la carpeta /src del contenedor. El comando dotnet restore descarga de NuGet las dependencias que requieren estos proyectos.

  6. Anexe el código siguiente al final del Dockerfile:

    COPY . .
    WORKDIR "/src/HotelReservationSystem"
    RUN dotnet build "HotelReservationSystem.csproj" -c Release -o /app
    

    Estos comandos copian el código fuente de la aplicación web en el contenedor y, después, ejecutan el comando dotnet build para compilar la aplicación. Los archivos DLL resultantes se escriben en la carpeta /app del contenedor.

  7. Anexe el comando siguiente al final del Dockerfile.

    RUN dotnet publish "HotelReservationSystem.csproj" -c Release -o /app
    

    El comando dotnet publish copia los archivos ejecutables para el sitio web en una carpeta nueva y quita todos los archivos intermedios. Después, los archivos de esta carpeta se pueden implementar en un sitio web.

  8. Anexe los comandos siguientes al final del Dockerfile.

    EXPOSE 80
    WORKDIR /app
    ENTRYPOINT ["dotnet", "HotelReservationSystem.dll"]
    

    El primer comando abre el puerto 80 del contenedor. El segundo comando se mueve a la carpeta /app que contiene la versión publicada de la aplicación web. El último comando especifica que cuando se ejecute el contenedor debe ejecutar el comando dotnet HotelReservationSystem.dll. Esta biblioteca contiene el código compilado de la aplicación web.

  9. Guarde el archivo y cierre el editor de texto. Asegúrese de guardarlo como tipo de archivo Todos los archivos sin extensión de archivo.

Compilación e implementación de la imagen con el Dockerfile

  1. En el símbolo del sistema, ejecute el comando siguiente para compilar la imagen para la aplicación de ejemplo mediante el Dockerfile. No olvide . al final del comando. Este comando compila la imagen y la almacena de forma local. A la imagen se le asigna el nombre reservationsystem. Compruebe que la imagen se compila correctamente. Cuando finalice el proceso, se mostrará una advertencia sobre los permisos de archivos y directorios. Puede ignorar estas advertencias para los fines de este ejercicio. La imagen puede tardar un momento en compilarse.

    docker build -t reservationsystem .
    
  2. Ejecute el comando siguiente para comprobar que la imagen se ha creado y almacenado en el Registro local:

    docker image list
    

    La imagen tendrá el nombre reservationsystem. También tendrá una imagen denominada microsoft/dotnet:

    REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
    reservationsystem   latest              d2501f0f2ced        About a minute ago   1.76GB
    

Prueba de la aplicación web

  1. Escriba el código siguiente para ejecutar un contenedor en el que se use la imagen reservationsystem. Docker devolverá una cadena larga de dígitos hexadecimales. El contenedor se ejecuta en segundo plano sin ninguna interfaz de usuario. El puerto 80 del contenedor se asigna al puerto 8080 del equipo host. El nombre del contenedor es reservations.

    docker run -p 8080:80 -d --name reservations reservationsystem
    
  2. Abra un explorador web y vaya a http://localhost:8080/api/reservations/1. Debería ver un objeto JSON que contiene los datos de la reserva número 1 similar al siguiente resultado:

    Screenshot of the hotel reservations system web app running in a browser.

    Reemplace el "1" al final de la dirección URL de localhost por un número de reserva diferente (como 2 o 20) para ver los detalles de la reserva correspondiente.

  3. Ejecute el siguiente comando para ver el estado del contenedor:

    docker ps -a
    

    La salida muestra lo siguiente para todos los contenedores disponibles:

    • ID. DE CONTENEDOR
    • IMAGEN
    • COMANDO
    • HORA DE CREACIÓN
    • STATUS
    • PUERTOS
    • NAMES

    Compruebe que el valor de STATUS del contenedor es Up.

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
    07b0d1de4db7        reservationsystem   "dotnet HotelReserva…"   5 minutes ago       Up 5 minutes        0.0.0.0:8080->80/tcp   reservations
    
  4. Escriba el comando siguiente para detener el contenedor reservations:

    docker container stop reservations
    
  5. Elimine el contenedor reservations del registro local.

    docker rm reservations
    
  6. Mantenga reservationsystem en el registro local. Usará esta imagen en el siguiente ejercicio.

¡Enhorabuena! Ha creado una imagen para la aplicación web y la ha ejecutado mediante un contenedor de Docker.