Ha pasado bastante tiempo desde nuestra receta navideña con Docker. Y han habido muchos e importantes cambios en ASP.NET Core RT:

Vamos a hacer una actualización de este paso a paso para crear y ejecutar una aplicación ASP.NET Core 1.0 RTM en Docker.

¿Te apuntas?

Ingredientes

Para esta receta vamos a necesitar

  • .NET Core SDK Installer (Preview 2)
  • HomeBrew (si eres usuario de OS X)
  • NPM (brew install npm , para OS X. Los usuarios de Windows pueden instalar NPM como parte de Node.JS)
  • Bower (npm install -g bower)
  • Yeoman (npm install -g yo)
  • ASP.NET Generators para Yeoman (npm install generator-aspnet)

Paso 0: Configurando Docker

Primero que nada, vas a necesitar configurar Docker para MacWindows or Linux

Una vez instalado, ¿tengo alguna VM de Docker instalada? Comprobemoslo:

innotech es el nombre de mi máquina Docker. En tu caso, Docker Toolbox seguramente haya creado una que se llama “Default”:

¿No funciona docker-machine? Arranquemos  la VM y evaluemos las variables de entorno para configurar la conexión:

Y comprobemos que Docker está operativo, examinando la información:

Paso 1: Crear una aplicación ASP.NET Core 1.0 con Yeoman

Vamos a crear una aplicación ASP.NET Core con Yeoman. Nuevamente, desde nuestro terminal/consola:

Restauramos y compilamos el proyecto:

Arreglando algunos problemas con yo aspnet

ACTUALIZACIÓN: Este pull request solucionó el problema. Si tienes la última versión de los generadores ASP.NET para Yeoman (yo install generator-aspnet -g) puedes obviar este paso.

La versión actual (ASP.NET Core 1.0 RC-2) de los generadores contienen una versión desactualizada del Dockerfile, que solo funciona con versiones anteriores. Vamos a actualizar el fichero:

Primero de nada, vamos a crear el archivo Dockerile. Con Visual Studio Code (o tu editor preferido) abre el archivo “Dockerfile” que encontrarás en la raíz del proyecto que acabamos de crear con Yeoman, e incluye el siguiente contenido:

Con este Dockerfile, estamos indicando a Docker que debe utilizar la última imagen del container de DotNet, copiar el contenido de nuestro proyecto dentro, restaurar los paquetes y compilar la el proyecto dentro del container, en tiempo de creación de la imagen. Nuestro servidor Kestrel escuchará, por defecto, en el puerto TCP 5000. Como ocurría en la versión RC 1 de ASP.NET, necesitamos formar el puerto en y las   IPs desde la que se va a aceptar tráfico entrante, con el argument –server.urls

Incluir el argument –server.urls es vital para permitir tráfico entrante desde fuera del container. De lo contrario, Kestrel rechaza cualquier conexión que no provenga del propio Container, lo cual es algo poco útil…

Ahora, abramos el archivo project.json y añadamos el paquete Nuget “Microsoft.Extensions.Configuration.CommandLine”:

Y, desde el Terminal/Consola ejecuta:

Y modificamos el archivo Program.cs para leer la configuración desde los argumentos de entrada del programa:

¡Ya estamos casi! Es hora de compilar y ejecutar nuestro container

Compilar y ejecutar

Y ahora, tiempo para Docker. Volvamos a nuestro Terminal y ejecutemos el comando para crear el Container:

Ahora, nuestra imagen de Container está lista para ser desplegada. Comprobemos que está en el listado de imágenes locales:

Para ejecutar una instancia de la imagen:

Para comprobar que el Container se está ejecutando:

Y… finalmente, hora del navegador

http://default:90 (o el nombre de tu docker machine, seguido del puerto :90)

container-1

¡Y aquí está! Tu aplicación ASP.NET Core 1.0 ejecutándose en Docker

Cambios respecto a RC1

Uno de los cambios más significativos desde la versión RC1 de .NET Core, es que ahora todas las aplicaciones, incluye las aplicaciones ASP.NET Core, son aplicaciones de Consola. Si damos un vistazo al proyecto generador yo aspnet, verás que ahora hay un program.cs:

Este fichero tiene un punto de entrada, Main, donde se realiza la inicialización del WebHostBuilder (con Kestrel) dentro.

Así que… ahora puedes Docker cualquier aplicación .NET Core siguiendo este tutorial.

Docker bonus tracks

Bonus 1: ¿Quieres ejecutar más Containers con esta misma imagen? ¡Fácil!

Abre el puerto 91 en tu navegador y listos (Por ejemplo, http://default:91):

container-2

Bonus 2: ¿Arrancar y parar containers existentes? Aquí tienes los comandos (ojo, que estoy utilizando el container name, que puedes sacar del Bonus 3):

Bonus 3: Listar todos los Containers (incluidos aquellos que están parados)

Preguntas frecuentes

A: ¿Tengo que crear una imagen del container cada vez que cambio el código fuente?
Q: Sí.

A: ¿Puedo utilizar volúmenes de Docker para referencer el código fuente en mi máquina física, en lugar de generar imagenes cada vez?
Q: Sí. Pero, ¿porqué no utilizar tu propia máquina para depurar y realia una primera prueba en local, y realizar las pruebas finales con Docker? But why not to use your own machine for debugging and testing, and leave Docker images for the final tests?


Bienvenido al fascinando mundo de los Containers