Ejercicio: Personalización de una imagen de Docker para ejecutar una aplicación web propia
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
Si aún no se está ejecutando, inicie Docker en el equipo.
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
Escriba el siguiente comando para abrir el directorio
src
.cd mslearn-hotel-reservation-system/src
En el directorio
src
, escriba los siguientes comandos para crear un archivo denominadoDockerfile
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.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 comandodotnet restore
descarga de NuGet las dependencias que requieren estos proyectos.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.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.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 comandodotnet HotelReservationSystem.dll
. Esta biblioteca contiene el código compilado de la aplicación web.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
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 nombrereservationsystem
. Compruebe que la imagen se compila correctamente. Cuando el proceso finaliza, se muestra una advertencia sobre los permisos de archivos y directorios. Puede ignorar esta advertencia para los fines de este ejercicio. La imagen puede tardar un momento en compilarse.docker build -t reservationsystem .
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
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 esreservations
.docker run -p 8080:80 -d --name reservations reservationsystem
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: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.
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
Escriba el comando siguiente para detener el contenedor reservations:
docker container stop reservations
Elimine el contenedor reservations del registro local.
docker rm reservations
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.