Hola Mundo de .NET Core y Docker con VS
Tweet Sat 28 January 2017Hoy quiero compartir cómo se puede crear una Hola Mundo con .NET Core pero que se ejecuta dentro de un contenedor Docker y no sólo eso, podremos incluso depurar la API con Visual Studio (VS) explicare lo fácil que es subir una imagen lista para un entorno de producción, así que vamos a empezar.
¿Qué necesito tener primero?
Para que esta demostración funcione debes tener instalado lo siguiente en tu computadora (estoy utilizando Windows 10):
- Visuatl Studio 2017 RC, puedes descargarlo aquí
- Docker para Windows, puedes descargarlo aquí
- Si estás utilizando más de una unidad de disco en tu computadora e instalaste docker en una unidad diferente a los archivos de proyecto de VS, debes compartir esa unidad en Docker, puede hacerlo puedes seguir esta guía aquí. Lee esta parte de nuevo, es posible que no pueda debuggear la API en VS si no lo haces.
Una vez que tengas todo instalado/configurado, puedes continuar.
Crear un Hola Mundo
No sólo vamos a crear una API sencilla (seguro ya sabrás cómo hacerlo), sino que también me voy a centrar en cómo integrar Docker a tu proyecto.
- Abre su VS como Administrador (clic derecho y "Ejecutar como Administrador")
- Ve a Archivo -> Nuevo -> Proyecto
- Selecciona Plantillas -> Visual C# -> .NET Core y luego "ASP.NET Core Web Application (.NET Core)"
- Pon un nombre al proyecto (en mi caso "HelloDocker"), elige la ubicación de los archivos y luego haz clic en "Aceptar"
Después de esto, deberías ver otra pantalla donde necesitas habilitar el soporte para docker (puedes hacerlo más tarde también).
- Elija "API Web" en "Plantillas ASP.NET Core 1.1"
- Marque la casilla "Enable Docker Support" y haga clic en "OK"
Vamos a esperar un poco y deberás ver algo como esto:
¿Qué hay de nuevo aquí? Si te das cuenta ahora tienes una nueva sección en la solución llamada "docker-compose" y dentro de tu proyecto tienes un "Dockerfile". No voy a explicar por qué tiene esos archivos y qué hacen (para obtener más detalles, ve [aquí] (https://docs.microsoft.com/en-us/dotnet/articles/core/docker/visual-studio -herramientas-para-acoplador)). Ahora, veamos la magia al depurar el API.
- Abre el archivo ValuesController.cs (Controllers/ValuesController.cs)
- Pon un breakpoint en la línea donde devuelve una lista de valores (línea #16)
- En el explorador de la solucion, ve a "docker-compose", haz clic derecho y luego Depurar -> Iniciar nueva instancia. Si lo haces en el proyecto, lanzará el IIS Express y eso no es lo que queremos ahorita. Deberás comenzar a ver cómo se está construyendo la imagen copiando todos los binarios dentro del contenedor.
- Cuando termine, lanzará una nueva ventana en tu navegador
- En la misma ventana, ve a la URL /api/values y VS captará esa llamada en el breakpoint que pusimos
Ahora, aqui es donde puedes comenzar a gritar emocionado sobre lo que acaba de suceder (yo lo hice). Si no captaste por que, déjame explicar lo que acaba de suceder: VS construyó un contenedor con el código que tienes en el proyecto, luego lanzó el contenedor y lo adjuntó a tu VS para que puedas depurarlo. Esto significa que no sólo estás probando localmente sino que estás probando de la misma manera que el API se ejecutará en el servidor de producción. Eso es realmente impresionante, me encantó.
Cierra la boca ahora, por favor, tenemos que hacer algunas cosas para terminar la demo :) ... En la misma línea del breakpoint, vamos a agregar un nuevo valor, vamos a empujar esto a la Docker Hub.
¿Qué pasa con la publicación en el servidor de producción?
Yo sé, esa fue mi primera pregunta, así que abramos la terminal (yo uso Powershell) y vamos a hacerlo, pero primero, tenemos que compilar el API en modo Release.
- En VS, cambia la configuración de Debug a modo Release y compila la solución de nuevo. ¿Por qué? Comenzará a crear la imagen para un entorno de producción (nunca publicas tus API en modo Debug, ¿verdad?) y elige la mejor imagen base del contenedor que el equipo de Microsoft ha configurado para esos entornos, por lo que no es la misma imagen base que usamos para depurar nuestro código. Más información [aquí] (https://docs.microsoft.com/en-us/dotnet/articles/core/docker/building-net-docker-images)
- Abre tu terminal y ejecuta "docker images"
Ahora, ves que he marcado el que tiene el tag "latest", que es la que necesitamos usar para producción, la otra (con el tag "dev") es la que está para desarrollo. Ok, vamos a subirlo al Docker Hub.
- Inicia sesión con tu cuenta de Docker Hub aqui (si no tiene una, crea una por favor)
- Ahora, vamos a crear un repositorio público, el mío se llama "hellodocker"
- Vuelve a tu terminal y ejecuta el comando "docker images"
- Copia el IMAGE ID de hellodocker con la tag latest y crea una nueva tag con el nombre de tu repositorio que acabas de crear. En mi caso, necesito ejecutar esta "docker tag 95904eeb5775 christianhxc/hellodocker"
- Lista las imágenes y ahora debes ver la que acabas de crear
- Inicia sesión de tu repositorio docker ejecutando "docker login"
- Sube la imagen, en mi caso corrí "docker push christianhxc/hellodocker", espera un poco y deberías ver la imagen en Docker Hub (podría tomar algún tiempo para verlo)
¿Cómo ejecutar el contenedor sin VS?
Simplemente abres tu terminal y ejecutas el siguiente comando:
docker run -d -p 8000:80 christianhxc/hellodocker
Abres tu navegador en http://localhost:8000/api/values y ve la ultima version de tu API
Así que eso es todo, ahora puedes crear fácilmente aplicaciones .NET Core con soporte para Docker :)