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

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

Es pronto, pero esta es una buena vista previa de las posibilidades de lo que vendrá. A menudo uso ladrillos LEGO a modo de analogía cuando hablo de sistemas de software. Me gusta la idea de elección, flexibilidad y capacidad de conexión. La elección de su idioma, sistema operativo, método y estilo de implementación, etc. es importante.

Hay una vista previa de una extensión para Visual Studio 2015 (la versión candidata en el momento de escribir este artículo) que agrega compatibilidad con Docker. Si tiene VS2015 RC, puede obtener la extensión Docker aquí. Ciertamente puede administrar las cosas desde la línea de comandos, pero creo que a medida que avance en esta publicación apreciará la conveniencia de esta extensión.

NOTA: También vale la pena señalar que también hay una línea de comando de cliente de Windows para Docker. Puede "choco install docker" y leer sobre esto aquí.

La breve explicación de qué es Docker

Si no está familiarizado con Docker, estos son los conceptos básicos.

  • Máquinas virtuales:probablemente sepa qué es una máquina virtual. Es todo el sistema operativo, toda la computadora, virtualizada. Si tiene una aplicación de 10 megabytes que desea ejecutar, puede terminar colocándola en una máquina virtual de 10 gigabytes y llevándola consigo. Eso brinda una gran seguridad y aislamiento, ya que su aplicación está completamente sola en su propia VM privada, pero es un poco exagerado. Ahora desea implementar 100 aplicaciones y tiene espacio, CPU y otras cosas en las que pensar. Las máquinas virtuales también comienzan lentamente y deben mantenerse activamente.
  • Contenedores de Docker/Linux (y contenedores de Windows "Docker para Windows Server"):los contenedores de Docker son cajas de arena que se ejecutan en el mismo kernel del sistema operativo. Son fáciles de implementar y comienzan rápido. Como efecto secundario de ejecutarse en el mismo kernel, los contenedores le permiten compartir la mayor parte de esos 10 gigabytes (como un número de ejemplo) de software de soporte entre muchas aplicaciones, lo que le brinda menos aislamiento pero también usa MUCHOS menos recursos. Los contenedores se inician rápidamente y los recursos compartidos subyacentes son los que se mantienen y actualizan.

Docker también es una forma de empaquetar una aplicación y distribuirla de manera confiable y reproducible. Entonces se puede decir que Docker es una tecnología, pero también una filosofía y un proceso.

Docker y Visual Studio

Una vez que tenga instalada la extensión Docker para Visual Studio 2015 (versión preliminar), continúe y cree una aplicación ASP.NET 5. Haga clic derecho en el proyecto y presione Publicar.

¿Observa la sección Contenedores de Docker que se ha agregado? Todavía tiene PAAS (Platform as a Service) y también puede publicar en máquinas virtuales dentro de Azure. Selecciona Docker y estarás aquí:

Crearemos una nueva máquina virtual para alojar nuestro material de Docker. Esta máquina virtual será el host de nuestros contenedores. Hoy será una máquina virtual Ubuntu LTS. Tenga en cuenta que el cuadro de diálogo incluye toda la configuración de Docker, puertos, certificados, etc. Podría usar máquinas virtuales existentes, por supuesto.

Si no tiene una máquina virtual, la creación inicial lleva un tiempo (de 5 a 10 minutos o más), así que espere. Si ya tiene uno, o el que creó está listo, continúe.

Tome nota especial de la opción Dockerfile. Por lo general, querrá seleccionar su propio Dockerfile creado manualmente, asumiendo que está haciendo algo más que un Hola mundo como yo.

El Dockerfile de ASP.NET está en GitHub:https://github.com/aspnet/aspnet-docker y en el registro de Docker:https://registry.hub.docker.com/u/microsoft/aspnet/

En la ventana de compilación, verá muchos resultados relacionados con la ventana acoplable. Aquí hay una versión recortada para darle sabor.

VERBOSE: Replacing tokens in Dockerfile: C:\Users\Scott\AppData\Local\Temp\PublishTemp\approot\src\WebApplication6\Properties\PublishProfiles\Dockerfile
VERBOSE: Package output path: C:\Users\Scott\AppData\Local\Temp\PublishTemp
VERBOSE: DockerHost: tcp://hanseldocker.cloudapp.net:2376
VERBOSE: DockerImageName: webapplication6
VERBOSE: DockerPublishHostPort: 80
VERBOSE: DockerPublishContainerPort: 80
VERBOSE: DockerAuthOptions: --tls
VERBOSE: DockerAppType: Web
VERBOSE: DockerBuildOnly: False
VERBOSE: DockerRemoveConflictingContainers: True
VERBOSE: LaunchSiteAfterPublish: True
VERBOSE: SiteUrlToLaunchAfterPublish:
VERBOSE: Querying for conflicting containers which has the same port mapped to the host...
Executing command [docker --tls -H tcp://hanseldocker.cloudapp.net:2376 ps -a | select-string -pattern ":80->" | foreach { Write-Output $_.ToString().split()[0] }]
VERBOSE: Building Docker image: webapplication6
Executing command [docker --tls -H tcp://hanseldocker.cloudapp.net:2376 build -t webapplication6 -f "C:\Users\Scott\AppData\Local\Temp\PublishTemp\approot\src\WebApplication6\Properties\PublishProfiles\Dockerfile" "C:\Users\Scott\AppData\Local\Temp\PublishTemp"]
VERBOSE: time="2015-05-27T10:59:06-07:00" level=warning msg="SECURITY WARNING: You are building a Docker image from Windows against a Linux Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories."
VERBOSE: Sending build context to Docker daemon 28.01 MB
VERBOSE: Step 0 : FROM microsoft/aspnet:vs-1.0.0-beta4
VERBOSE: vs-1.0.0-beta4: Pulling from microsoft/aspnet
VERBOSE: e5c30fef7918: Pulling fs layer
VERBOSE: e5c30fef7918: Pull complete
VERBOSE: e5c30fef7918: Already exists
VERBOSE: Digest: sha256:27fbe2377b5d4e66c4aaf3c984ef03d22afbfee3d4e78e10ff38cac7ff162d2e
VERBOSE: Status: Downloaded newer image for microsoft/aspnet:vs-1.0.0-beta4
VERBOSE: ---> e5c30fef7918
VERBOSE: Step 1 : ADD . /app
VERBOSE: ---> cf1f788321b3
VERBOSE: Removing intermediate container dd345cdcc5d9
VERBOSE: Step 2 : WORKDIR /app/approot/src/WebApplication6
VERBOSE: ---> Running in f22027140233
VERBOSE: ---> 7eabc0da4645
VERBOSE: Removing intermediate container f22027140233
VERBOSE: Step 3 : ENTRYPOINT dnx . Kestrel --server.urls http://localhost:80
VERBOSE: ---> Running in 4810324d32a5
VERBOSE: ---> e0a7ad38eb34
VERBOSE: Removing intermediate container 4810324d32a5
VERBOSE: Successfully built e0a7ad38eb34
The Docker image "webapplication6" was created successfully.
VERBOSE: Starting Docker container: webapplication6
Executing command [docker --tls -H tcp://hanseldocker.cloudapp.net:2376 run -t -d -p 80:80 webapplication6]
Docker container started with ID: 6d4820044df200e87f08cb5becbec879d1b58fcab73145ca3aa99a424c162054
To see standard output from your application, open a command line window and execute the following command:
docker --tls -H tcp://hanseldocker.cloudapp.net:2376 logs --follow 6d4820044df200e87f08cb5becbec879d1b58fcab73145ca3aa99a424c162054
VERBOSE: received -1-byte response of content type text/html; charset=utf-8
Executing command [Start-Process -FilePath "http://hanseldocker.cloudapp.net/"]
Publish completed successfully.

Las partes interesantes son las llamadas a dnx (el host de ejecución de .NET), la advertencia de que comencé en Windows y voy a Linux, así como el hecho de que estamos usando la imagen acoplable "microsoft/aspnet".

En mi ejemplo, tenía VS y la extensión creaba mis certificados. Si quiero conectarme a esta instancia desde la línea de comandos de Windows Docker, debo pasar esos certificados o establecer una variable env. Aquí estoy ejecutando "ps" para ver los contenedores acoplables remotos en esta máquina virtual Azure Linux. El cliente de Docker busca certificados en %USERPROFILE%\.docker, por lo que solo necesita configurar DOCKER_HOST o pasarlo de esta manera.

C:\>docker --tls -H=tcp://hanseldocker.cloudapp.net:2376 ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d4820044df2 webapplication6:latest "dnx . Kestrel --ser 58 minutes ago Up 58 minutes 0.0.0.0:80->80/tcp silly_poincare

Funcionó muy bien. También asegúrese de explorar la carpeta PublishProfiles que se crea en su proyecto de Visual Studio en "Propiedades". Se crea un script de PowerShell y un script de Shell en esa carpeta que puede usar para publicar su aplicación desde la línea de comandos. Por ejemplo:

.\hanseldocker-Docker-publish.ps1 -packOutput $env:USERPROFILE\AppData\Local\Temp\PublishTemp -pubxmlFile .\hanseldocker-Docker.pubxml

o desde Linux:

cd ProjectFolder (like WebApplication/src/WebApplication)
source dnvm.sh
dnu restore --no-cache
mkdir ~/Temp
dnu publish . --out ~/Temp/ --wwwroot-out "wwwroot" --quiet
cd Properties/PublishProfiles
chmod +x ./Docker-publish.sh
./Docker-publish.sh ./Docker.pubxml ~/Temp/

Estoy deseando un futuro lleno de opciones multiplataforma, multiherramientas. Finalmente, aquí hay una gran serie de videos de 7 partes llamada "Docker para desarrolladores de .NET" que debería ver en Channel 9.

Patrocinador: ¡Muchas gracias a Atalasoft por patrocinar el blog y el feed esta semana! Si su empresa trabaja con documentos, definitivamente consulte las herramientas de desarrollo de Atalasoft para visualización, captura y transformación web y móvil. También tienen pruebas gratuitas y un extraordinario equipo de soporte.


Docker
  1. Primeros pasos con Visual Studio Code (VSC) en Linux

  2. Cómo instalar Nextcloud con Docker en su servidor Linux

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

  4. Visual Basic .Net en Linux

  5. ¿Visual Basic es compatible con .NET Core en Linux?

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

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

Soporte oficial para la depuración remota de una aplicación .NET Core Linux en WSL2 desde Visual Studio en Windows

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

Depuración remota de una aplicación .NET Core Linux en WSL2 desde Visual Studio en Windows

Publicación de un sitio web ASP.NET Core en un host de máquina virtual Linux económico