En mayo del año pasado, hacer cosas con ASP.NET y Docker estaba en sus inicios. Pero cosas geniales estaban en marcha. Escribí una publicación de blog que muestra cómo publicar una aplicación ASP.NET 5 (5 en ese momento, ahora Core 1.0) en Docker. Más tarde, en diciembre de 2015, nuevas herramientas como Docker Toolbox y Kitematic facilitaron aún más las cosas. En mayo de 2016, Docker para Windows Beta continuó avanzando muy bien.
Quería ver cómo se ven las cosas con ASP.NET Core, Docker y Windows aquí en octubre de 2016.
Instalé estas cosas:
- Comunidad de Visual Studio 2015
- Actualización 3 de Visual Studio 2015
- ASP.NET Core con .NET Core
- .NET Core 1.0.1 - Vista previa de herramientas VS 2015 2
- Docker para Windows (Usé el Canal Beta)
- Herramientas de Visual Studio para Docker
Docker para Windows es realmente agradable, ya que automatiza la configuración de Hyper-V y crea el sistema operativo host de Docker y lo pone todo en marcha. Este es un gran ahorro de tiempo.
Está mi host Linux en el que realmente no tengo que pensar. Haré todo desde la línea de comandos o desde Visual Studio.
Diré Archivo | Nuevo proyecto y cree una nueva aplicación ASP.NET Core que se ejecute en .NET Core.
Luego hago clic derecho y Agregar | Compatibilidad con Docker . Este menú proviene de la extensión Visual Studio Tools para Docker. Esto agrega un Dockerfile básico y algunos archivos docker-compose. Listo para usar, estoy listo para implementar mi aplicación ASP.NET Core en un contenedor Docker Linux.
ASP.NET Core en un contenedor Docker Linux
A partir de mi aplicación ASP.NET Core, me aseguraré de que mi imagen base (que es FROM en Dockerfile) sea la imagen base de ASP.NET Core para Linux.
FROM microsoft/aspnetcore:1.0.1
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
EXPOSE 80
COPY $source .
Luego, dado que no quiero que Docker haga la construcción de mi aplicación todavía, la publicaré localmente. Asegúrese de leer la publicación de blog de Steve Lasker "Creación de imágenes de Docker optimizadas con ASP.NET Core" para aprender cómo hacer que un contenedor de Docker cree su aplicación y el otro la ejecute. Esto optimiza la densidad y los recursos del servidor.
Publicaré, luego compilaré las imágenes y las ejecutaré.
>dotnet publish
>docker build bin\Debug\netcoreapp1.0\publish -t aspnetcoreonlinux
>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnetcoreonlinux latest dab2bff7e4a6 28 seconds ago 276.2 MB
microsoft/aspnetcore 1.0.1 2e781d03cb22 44 hours ago 266.7 MB
>docker run -it -d -p 85:80 aspnetcoreonlinux
1cfcc8e8e7d4e6257995f8b64505ce25ae80e05fe1962d4312b2e2fe33420413
>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1cfcc8e8e7d4 aspnetcoreonlinux "dotnet WebApplicatio" 2 seconds ago Up 1 seconds 0.0.0.0:85->80/tcp clever_archimedes
Y está mi aplicación ASP.NET Core ejecutándose en Docker. Así que estoy ejecutando Windows, ejecutando Hyper-V, ejecutando un host Linux que aloja contenedores Docker.
¿Qué más puedo hacer?
ASP.NET Core en un contenedor Docker de Windows que ejecuta Windows Nano Server
Hay servidor de Windows , hay Windows Server Core que elimina la interfaz de usuario, entre otras cosas, y hay Windows Nano Server lo que reduce a Windows a cientos de megas en lugar de muchos conciertos. Esto significa que hay muchas opciones excelentes según lo que necesite para la funcionalidad y la densidad del servidor. Envíe lo menos posible.
Déjame ver si puedo ejecutar ASP.NET Core en Kestrel bajo Windows Nano Server. Ciertamente, dado que Nano es muy capaz, podría ejecutar IIS dentro del contenedor y hay documentos al respecto.
Michael Friis de Docker tiene una excelente publicación de blog sobre cómo crear y ejecutar su primer contenedor de servidor de Windows Docker. Con el nuevo Docker para Windows, puede hacer clic derecho sobre él y cambiar entre los contenedores de Linux y Windows.
Así que ahora estoy usando Docker con contenedores de Windows. ¡Es posible que no sepa que probablemente ya tenga contenedores de Windows! Se envió dentro de Windows 10 Anniversary Edition. Puede buscar Contenedores en Funciones:
Cambiaré mi Dockerfile para usar la imagen de Windows Nano Server. También puedo controlar los puertos en los que habla ASP.NET si quiero con una variable de entorno y exponer eso dentro de Docker.
FROM microsoft/dotnet:nanoserver
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
ENV ASPNETCORE_URLS http://+:82
EXPOSE 82
COPY $source .
Luego publicaré y construiré...
>dotnet publish
>docker build bin\Debug\netcoreapp1.0\publish -t aspnetcoreonnano
¡Luego lo ejecutaré, mapeando los puertos de Windows afuera al contenedor de Windows adentro!
ACTUALIZAR : Este error se solucionó en la actualización de abril de Windows 10. Detalles aquí Acceso de host local a puertos de contenedores de Windows
Así que ejecutaré mi aplicación ASP.NET Core en Windows Nano Server (nuevamente, para ser claros, ¡esto se ejecuta en Windows 10 y Nano Server está dentro de un contenedor!)
>docker run -it -d -p 88:82 aspnetcoreonnano
afafdbead8b04205841a81d974545f033dcc9ba7f761ff7e6cc0ec8f3ecce215
>docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" afa
172.16.240.197
Ahora puedo acceder a ese sitio con 172.16.240.197:82. Una vez que se solucione el error anterior, será atacado y enrutado como cualquier contenedor.
La mejor parte de los contenedores de Windows es que son rápidos y livianos. Una vez que la imagen se descarga y compila en su máquina, la inicia y la detiene en segundos con Docker.
PERO, también puede aislar contenedores de Windows usando Docker de esta manera:
docker run --isolation=hyperv -it -d -p 86:82 aspnetcoreonnano
Entonces, ahora esta instancia se ejecuta completamente aislada dentro de Hyper-V. Obtienes lo mejor de todos los mundos. Implementación rápida y conveniente, además de un aislamiento fácil y opcional.
ASP.NET Core en un contenedor Docker de Windows que ejecuta Windows Server Core 2016
Luego puedo cambiar el Dockerfile para usar la imagen completa de Windows Server Core. Son 8 gigas, así que prepárate, ya que te llevará un poco descargarlo y extraerlo, pero en realidad es Windows. También puede optar por ejecutar esto como un contenedor o como un contenedor Hyper-V aislado.
Aquí solo cambio el FROM para obtener un Windows Sever Core con .NET Core incluido.
FROM microsoft/dotnet:1.0.0-preview2-windowsservercore-sdk
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
ENV ASPNETCORE_URLS http://+:82
EXPOSE 82
COPY $source .
Luego publicaré, compilaré y ejecutaré nuevamente.
>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnetcoreonnano latest 7e02d6800acf 24 minutes ago 1.113 GB
aspnetcoreonservercore latest a11d9a9ba0c2 28 minutes ago 7.751 GB
Dado que los contenedores son tan rápidos para iniciarse y detenerse, puedo tener una granja web completa ejecutándose con Redis en un contenedor, SQL en otro y mi pila web en un tercero. O mezcle y combine.
>docker ps
CONTAINER ID IMAGE COMMAND PORTS NAMES
d32a981ceabb aspnetcoreonwindows "dotnet WebApplicatio" 0.0.0.0:87->82/tcp compassionate_blackwell
a179a48ca9f6 aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:86->82/tcp determined_stallman
170a8afa1b8b aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:89->82/tcp agitated_northcutt
afafdbead8b0 aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:88->82/tcp naughty_ramanujan
2cf45ea2f008 a7fa77b6f1d4 "dotnet WebApplicatio" 0.0.0.0:97->82/tcp sleepy_hodgkin
Conclusión
Una vez más, consulte el artículo de Michael en el que usa Docker Compose para mostrar la muestra de ASP.NET Music Store con SQL Express en un contenedor de Windows y ASP.NET Core en otro, así como el blog de Steve Lasker (de hecho, todo su blog es oro ) sobre la creación de imágenes Docker optimizadas con ASP.NET Core.
IMAGE ID RESPOSITORY TAG SIZE
0ec4274c5571 web optimized 276.2 MB
f9f196304c95 web single 583.8 MB
f450043e0a44 microsoft/aspnetcore 1.0.1 266.7 MB
706045865622 microsoft/aspnetcore-build 1.0.1 896.6 MB
Steve señala una serie de técnicas que le permitirán aprovechar al máximo Docker y ASP.NET Core.
El resultado de todo esto significa (en mi humilde opinión) que puede usar ASP.NET Core:
- ASP.NET Core en Linux
- dentro de contenedores Docker
- en cualquier Nube
- ASP.NET Core en Windows, Windows Server, Server Core y Nano Server.
- dentro de contenedores de ventanas Docker
- dentro de contenedores Hyper-V aislados de Docker
Esto significa que puede elegir el nivel de soporte de funciones y el tamaño para optimizar la densidad y la conveniencia del servidor. Una vez que todas las herramientas (la gente de Docker con Docker para Windows y la gente de VS con Visual Studio Docker Tools) estén horneadas, tendremos una buena depuración y flujos de trabajo desde el desarrollo hasta la producción.
¿Qué ha estado haciendo con Docker, Containers y ASP.NET Core? Suena apagado en los comentarios.
Patrocinador: ¡Gracias a Redgate esta semana! Descubra la herramienta de comparación de SQL Server más confiable del mundo. Disfrute de una prueba gratuita de SQL Compare, el estándar de la industria para comparar e implementar esquemas de SQL Server.