Ejercicio: Compilación de una imagen de contenedor para el microservicio de .NET
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:
- Instale cualquier requisito del sistema para ejecutar Dev Container en Visual Studio Code.
- Asegúrese de que Docker se está ejecutando.
- En una ventana nueva de Visual Studio Code, abra la carpeta del repositorio clonado
- Presione Ctrl+Mayús+P para abrir la paleta de comandos.
- Buscar: >Contenedores de desarrollo: Recompilar y volver a abrir en contenedor
- 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.
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.
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.
En el panel EXPLORER, cree un archivo denominado Dockerfile en ./dotnet-docker/Products. El archivo está vacío.
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 nombrebuild
. - 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.
- Extraiga la imagen
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.
- Establezca el directorio de trabajo dentro de la imagen en
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 paseProducts.dll
como argumento.
- Extraiga la imagen
Crear la imagen de Docker
Una vez completado el Dockerfile, el siguiente paso es usarlo para crear una imagen de Docker:
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.
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.
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
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.
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" }, ... ]