Ejercicio: Compilación de una imagen de contenedor para el microservicio de .NET

Completado

En este ejercicio, va a crear un punto de conexión de microservicio y lo va a incluir en contenedores mediante el SDK de .NET y Docker.

Nota:

Puede completar este ejercicio en una instancia de GitHub Codespaces que tenga Docker y el SDK de .NET preinstalado. Al usar estas herramientas y técnicas en un entorno de desarrollo propio, asegúrese de tener instalados estos requisitos previos.

Abrir el entorno de desarrollo

Puede optar por usar un codespace de GitHub que hospede el ejercicio, o bien hacer el ejercicio localmente en Visual Studio Code.

Para usar un codespace, cree un codespace de GitHub preconfigurado con este vínculo de creación de codespaces.

GitHub tarda unos minutos en crear y configurar el codespace. Cuando se complete el proceso, verá los archivos de código del ejercicio. El código usado para el resto de este módulo está en el directorio /dotnet-docker.

Para usar Visual Studio Code, clone el repositorio https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative en la máquina local. Después:

  1. Instale cualquier requisito del sistema para ejecutar Dev Container en Visual Studio Code.
  2. Asegúrese de que Docker se está ejecutando.
  3. En una ventana nueva de Visual Studio Code, abra la carpeta del repositorio clonado
  4. Presione Ctrl+Mayús+P para abrir la paleta de comandos.
  5. Buscar: >Contenedores de desarrollo: Recompilar y volver a abrir en contenedor
  6. Seleccione eShopLite - dotnet-docker en la lista desplegable. Visual Studio Code crea el contenedor de desarrollo localmente.

Uso de la publicación de .NET para crear la imagen de back-end de Products

La versión más reciente de .NET 8 mejora la compatibilidad con la contenedorización. Puede usar el comando dotnet publish para crear una imagen de Docker para los microservicios. El comando crea una imagen de contenedor sin raíz que ejecuta servicios en una cuenta de app. La ejecución de contenedores sin raíz es excelente para la seguridad y el rendimiento. El comando sabe cómo elegir la mejor imagen base tras comprobaR la configuración en el archivo del proyecto.

  1. Para crear las imágenes de todos los servicios de eShopLite, vaya a la pestaña TERMINAL y ejecute este comando:

    cd ./dotnet-docker 
     dotnet publish /p:PublishProfile=DefaultContainer
    

    El resultado debe ser parecido a los siguientes mensajes:

    DataEntities -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/DataEntities/bin/Release/net8.0/publish/
    Products -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Products/bin/Release/net8.0/Products.dll
    Products -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Products/bin/Release/net8.0/publish/
    Store -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Store/bin/Release/net8.0/Store.dll
    Store -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Store/bin/Release/net8.0/publish/
    Building image 'store' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'.
    Building image 'products' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'.
    Pushed image 'store:latest' to local registry via 'docker'.
    Pushed image 'products:latest' to local registry via 'docker'.
    

    El comando lee el archivo de solución, ha determinado que contiene tres proyectos, los ha compilado y ha creado imágenes para los proyectos de tienda y productos. Las imágenes se nombran en función de los proyectos y se publican en el registro de Docker local.

  2. Compruebe que las imágenes están disponibles en Docker:

    docker images
    

    El resultado debe ser parecido a los siguientes mensajes:

    REPOSITORY                          TAG       IMAGE ID       CREATED              SIZE
    products                            latest    63614e340088   About a minute ago   293MB
    store                               latest    e9458c3abdb1   About a minute ago   218MB
    

Uso de un Dockerfile para crear la imagen de back-end de Products

Si desea tener más control sobre cómo se compilan las imágenes, puede usar un Dockerfile para crear una imagen para el servicio web de Products.

  1. En el panel EXPLORER, cree un archivo denominado Dockerfile en ./dotnet-docker/Products. El archivo está vacío.

  2. Escriba el siguiente código:

    FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
    
    WORKDIR /DataEntities
    COPY "DataEntities/DataEntities.csproj" .
    RUN dotnet restore
    COPY "DataEntities" .
    RUN dotnet publish -c release -o /app
    

    Después de completar los pasos siguientes, este código configurará la biblioteca DataEntities en la imagen de Docker de Products:

    • Extraiga la imagen mcr.microsoft.com/dotnet/sdk:8.0 y asígnele el nombre build.
    • Establezca el directorio de trabajo dentro de la imagen en /DataEntities.
    • Copie el archivo denominado DataEntities.csproj local en el directorio /DataEntities que ha creado.
    • Llame dotnet restore en el proyecto.
    • Copie todo en el directorio local DataEntities en la imagen.
    • Llame dotnet publish en el proyecto.
  3. Directamente debajo de la última línea, escriba este código:

     WORKDIR /src
     COPY Products/Products.csproj .
     RUN dotnet restore
     COPY Products .
     RUN dotnet publish -c release -o /app
    

    Cuando se invoca, este código realiza los siguientes pasos secuencialmente:

    • Establezca el directorio de trabajo dentro de la imagen en /src.
    • Copie el archivo denominado Products.csproj local en el directorio /src que ha creado.
    • Llame dotnet restore en el proyecto.
    • Copie todo el contenido del directorio Products local en la imagen.
    • Llame dotnet publish en el proyecto.
  4. Directamente debajo de la última línea, escriba este código:

     FROM mcr.microsoft.com/dotnet/aspnet:8.0
     WORKDIR /app
     EXPOSE 80
     EXPOSE 443
     COPY --from=build /app .
     ENTRYPOINT ["dotnet", "Products.dll"]
    

    Cuando se invoca, este código realiza los siguientes pasos secuencialmente:

    • Extraiga la imagen mcr.microsoft.com/dotnet/aspnet:8.0.
    • Establezca el directorio de trabajo dentro de la imagen en /app.
    • Expone los puertos 80 y 443.
    • Copie todo el contenido del directorio app de la imagen build que ha creado en el directorio app de esta imagen.
    • Establezca el punto de entrada de esta imagen en dotnet y pase Products.dll como argumento.

Crear la imagen de Docker

Una vez completado el Dockerfile, el siguiente paso es usarlo para crear una imagen de Docker:

  1. Para crear la imagen del servicio back-end de Products, vaya a la pestaña TERMINAL y ejecute este comando:

    cd ./dotnet-docker 
     docker build -t productsbackend:latest -f Products/Dockerfile .
    

    Esto ejecuta los comandos de Dockerfile en el directorio actual y aplica la etiqueta productsbackend:latest a la imagen resultante.

  2. Después de una salida abundante, se genera la imagen. Al escribir docker images se muestra una lista de todas las imágenes de su codespace, que incluye productsbackend. La otra imagen es la del propio codespace.

    El resultado debe ser parecido a los siguientes mensajes:

    REPOSITORY                          TAG       IMAGE ID       CREATED              SIZE
    products                            latest    63614e340088   10 minutes ago       293MB
    store                               latest    e9458c3abdb1   10 minutes ago       218MB
    productsbackend                     latest   190783f7e06f    About a minute ago   293MB
    

Piense en la diferencia entre usar dotnet publish y tener que crear manualmente los archivos Dockerfile para cada microservicio de las aplicaciones.

Ejecutar el contenedor y probar el servicio

Ahora puede usar la imagen para ejecutar y hospedar el servicio Products.

  1. Para crear y ejecutar un contenedor desde la nueva imagen de productos y exponer el servicio en el puerto 32001, ejecute este comando:

    docker run -it --rm -p 32001:8080  products
    

    O bien, si desea ejecutar la imagen que creó mediante el Dockerfile, ejecute:

    docker run -it --rm -p 32001:8080 productsbackend
    
  2. Para probar el servicio, cambie a la pestaña PORTS y, después, a la derecha de la dirección local del puerto de back-end, seleccione el icono del globo. El explorador abre una nueva pestaña en esa dirección.

    Captura de pantalla que muestra cómo conectarse al servicio de productos back-end.

  3. Para consultar algunos productos, anexe la dirección con /api/product y presione Entrar. Debería ver información del producto indicada en formato JSON.

    [
        {
            "id": 1,
            "name": "Solar Powered Flashlight",
            "description": "A fantastic product for outdoor enthusiasts",
            "price": 19.99,
            "imageUrl": "product1.png"
        },
        {
            "id": 2,
            "name": "Hiking Poles",
            "description": "Ideal for camping and hiking trips",
            "price": 24.99,
            "imageUrl": "product2.png"
        },
        {
            "id": 3,
            "name": "Outdoor Rain Jacket",
            "description": "This product will keep you warm and dry in all weathers",
            "price": 49.99,
            "imageUrl": "product3.png"
        },
        ...
    ]