GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Exploración de ASP.NET Core con Docker en contenedores de Linux y Windows

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!

NOTA: Hay un error a partir de este escrito que afecta la forma en que Windows 10 se comunica con los contenedores a través de "NAT" (traducción de direcciones de red), de modo que no puede acceder fácilmente a http://localhost:82 como usted (y yo) queremos. Hoy tienes que darle directamente a la IP del contenedor. Informaré una vez que escuche más sobre este error y cómo se soluciona. Aparecerá en Windows Update algún día. La solución consiste en obtener la dirección IP del contenedor de la ventana acoplable de esta manera:docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" HASH

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 .

NOTA: Escuché que es probable que las imágenes de .NET Core en Windows Server Core desaparezcan. Tiene más sentido que .NET Core se ejecute en Windows Nano Server u otras imágenes ligeras. ¡Usará Server Core para cosas más pesadas, y Server es bueno porque significa que puede ejecutar aplicaciones .NET Framework "completas" en contenedores! Si REALMENTE desea tener .NET Core en Server Core, puede crear su propio Dockerfile y crear fácilmente una imagen que tenga las cosas que desea.

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.


Docker
  1. ¿Qué es Docker (y los contenedores de Linux?)

  2. Optimización de los tamaños de imagen de ASP.NET Core Docker

  3. Cómo escribir un demonio de Linux con .Net Core

  4. Copie el archivo de Linux a Windows Share con C# (.NET core)

  5. Cifre un disco duro externo con acceso de lectura y escritura tanto en Windows como en Linux

Creación, ejecución y prueba de .NET Core y ASP.NET Core 2.1 en Docker en una Raspberry Pi (ARM32)

Contenedores Docker y Linux en Windows, con o sin máquinas virtuales Hyper-V

.NET y Docker

ZEIT ahora implementa aplicaciones web ASP.NET Core de código abierto con Docker

Publicación de una aplicación ASP.NET 5 en Docker en Linux con Visual Studio

Mover un ASP.NET Core de Azure App Service en Windows a Linux probando primero en WSL y Docker