Hosteando una aplicación ASPNET Core en Docker
Otros post sobre Docker y ASPNET Core:
El mundo de los contenedores, y claramente Docker es uno de los temas más movidos ultimamente, y en realidad en un tema emocionante que abre bastantes posibilidades a digamos una nueva era de aplicaciones, y si hablamos de microservicios, muy seguramente Docker va a entrar en juego.
Publicar, hostear, correr, dockerizar una aplicación ASPNET Core es bastante sencillo, así que en este post voy a mostrar de forma general como dockerizar una aplicación construida en ASPNET Core paso a paso.
Para ello, voy a partir de una sencilla aplicación ASPNET Core, que tiene un controlador el cual retorna un mensaje, el controlador en mención:
public class HomeController : Controller{public IActionResult Index() => Content(“Running ASPNET Core in Docker”);}
Listo, por el momento es todo lo que nuestra aplicación ASPNET Core va a realizar, el siguiente paso es agregar un archivo con el nombre Dockerfile en la raiz del proyecto, dicho archivo va a tener la instrucciones necesarias luego crear la imagen que ejecutará algún contenedor.
La primera instrucciónpermite definir cual es la imagen base a utilizar, en este caso será microsoft/aspnetcore:2.0, imagen que tiene el net core runtime y los paquetes de aspnet core necesarios.
FROM microsoft/aspnetcore:2.0
Luego tenemos:
COPY output /app
Con COPY, indicamos que debe copiar los archivos de la carpeta output del proyecto en la carpeta /app en el contenedor, por el momento output no existe, pero lo vamos a generar cuando hagamos la publicación del proyecto.
Ahora es necesario definir cuál será el folder de trabajo de la aplicación, para ello usamos WORKDIR:
WORKDIR /app
Ahora, es necesario especificar cual puerto del contenedor va a estar escuchado, en este caso se debe usar EXPOSE:
EXPOSE 80
Y finalmente, con ENTRYPOINT definimos el punto de entrada, o basicamente que se va a ejecutar, y como es una aplicación ASPNET Core usamos dotnet y la dll que se va a generar para nuestro proyecto:
ENTRYPOINT [ “dotnet”, “AspNetAndDocker.dll” ]
Finalmente, Dockerfile debe verse:
FROM microsoft/aspnetcore:2.0COPY output /appWORKDIR /appEXPOSE 80ENTRYPOINT [ “dotnet”, “AspNetAndDocker.dll” ]
El siguiente paso es generar la publicación de la aplicación, para ello hacemos uso de dotnet publish:
dotnet publish --configuration Release --output output
El comando anterior publica la aplicación en modo release y deja los archivos/artefactos en un folder llamado output.
Ya tenemos todo listo, ahora el siguiente paso es crear la imagen de Docker, para ello utilizamos docker build:
docker build . -t demo/aspnetcoreanddocker -f Dockerfile
El comando anterior crear una imagen tomando como base el directorio actual, como nombre demo/aspnetcoreanddocker y con -f le especificamos el nombre del archivo a usar, en este caso Dockerfile.
Ahora, para verificar que la imagen se creó correctamente, al ejecutar docker images deberíamos ver la imagen creada:
Ahora, es necesario crear un nuevo contenedor basado en la imagen creada anteriormente, y en este caso usamos docker create:
docker create -p 3000:80 --name testaspnetdocker demo/aspnetcoreanddocker
Con docker create creamos un nuevo contenedor, el flag -p indica el puerto externo (3000) e interno (80), con -name el nombre del contenedor, y al final el nombre de la imagen a hostear.
Para verificar la creación del contenedor, ejecutados docker ps -a, comando que lista todos los contenedores:
Y finalmente, para ejecutar el contenedor utilizamos docker start container_id, y luego con docker ps visualizamos los contenedores en ejecución:
Para validar, en el browser ir a localhost:3000 y deberíamos obtener el mensaje Running ASPNET Core in Docker
En el siguiente post, vamos a ver como utilizar volúmenes para persistir información cuando trabajamos con Docker.
Puedes acceder al ejemplo en el siguiente link: ASPNET & Docker
Saludos,