IMPORTANT NOTE : .NET Core Container Images now Published to Microsoft Container Registry

THIS IS AN IMPORTANT ANNOUNCEMENT: Microsoft is now publishing .NET Core container images to Microsoft Container Registry (MCR).

Note that Microsoft will continue to maintain Docker Hub repo pages so that you can discover and learn about .NET Core images. The Docker Hub website URLs you’ve used for Microsoft repos will continue to work, and forward to updated locations on Docker Hub.

Important :

  • Microsoft also made other changes to the images we publish, described in this post.
  • You will need to change FROM statements in Dockerfile files and docker pull commands as a result of these changes. 3.0 references need to be changed now. Most 1.x and 2.x usages can be changed over time. The new tag scheme is decribed in this post and are provided at the microsoft-dotnet-core repo, Microsoft new home on Docker Hub.

For more informations, please refer to this post on .NET Blog.

Le premier Afterworks MS à Koné

La première édition des Afterworks MS en Province Nord se sont déroulés à Koné ce Lundi 07/08. Devant l’engouement des personnes présentes pour ce type d’événement, les Afterworks sur Koné devraient être réitérer avec un contenu plus spécifique (et moins dense) dans une prochaine édition.

Un grand merci à la CCI de Koné pour le prêt de la salle (et pour nous avoir attendu en fin de journée) et pour accompagner ces initiatives communautaires depuis maintenant plus d’un an.

Comme convenu, nous avons pu partager notre expérience et expertise des technologies Office 365, SharePoint 2016, Visual Studio & .NET, Docker et Windows Container.
Si vous avez des questions sur ces technologies, si vous souhaitez savoir comment nous les déployons chez nos clients ou dans nos sociétés, n’hésitez pas à nous contacter.

Speakers : Sylver Schorgen (SF2i) et Julien Chable (NC IT – MVP Office Server et Development)

Les slides des sessions sont disponibles ci-dessous :
• Office 365 : https://fr.slideshare.net/secret/16KvWXBVppVgUG
• Nano Server : https://fr.slideshare.net/…/prsentation-nano-server-ms-afte…
• SharePoint 2016 : https://fr.slideshare.net/…/prsentation-sharepoint-2016-786…
• Visual Studio et .NET Core : https://www.slideshare.net/…/visual-studio-2017-launch-keyn…
• Docker :
https://www.slideshare.net/…/introduction-devops-containari…
https://www.slideshare.net/…/lcosystme-docker-pour-les-dev-…

Image may contain: one or more people, people sitting, table, living room and indoor

Fail to pull Windows Core/Nano Server container images with Docker for Windows ‘unknown blob’

During my last session preparation, I switched Docker for Windows to use Windows containers, to be honest I don’t have use it for some times (my nested virtualized Windows Server 2016 do the job) and I had the following error when downloading the microsoft/nanoserver image : unknow blob

image

The issue may be that your Docker for Windows daemon is not completely switch to Windows container. So execute the following line to switch it : & ‘C:\Program Files\Docker\Docker\DockerCli.exe’ –SwitchDaemon

Then pull your image again and things should work :

image

Déployer un site ASP.NET Core dans un conteneur Nano Server

Avec l’arrivée de Windows Server 2016, les entreprises se voit maintenant dotées d’un nouveau type de conteneur : les conteneurs Windows (exécutant Windows Server Core et Nano Server). A l’instar des conteneurs Linux, les conteneurs Windows possèdent leurs propres images disponible sur le Docker Hub. L’agnosticité de Docker (peu importe le fournisseur ou la technologie sous-jacente) et les capacités multiplateforme de .NET Core vont nous permettre de migrer une application ASP.NET Core existante s’exécutant dans conteneur Linux (cf dernier post) vers Nano Server sous Windows Server 2016.

Migrer vers un conteneur Windows

Lors du dernier post sur le sujet, nous avions vu comment déployer une application ASP.NET MVC Core dans un conteneur Linux. Voici le Dockerfile (que j’ai nommé Dockerfile.nanoserver permettant d’avoir un Dockerfile par type de conteneur) permettant de déployer la même application dans un conteneur Windows :

[code language= »csharp » highlight= »1″]
FROM microsoft/dotnet:nanoserver
 
COPY . /app
WORKDIR /app
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
 
EXPOSE 5000/tcp
ENTRYPOINT ["dotnet", "run", "–server.urls", http://*:5000]
[/code]

Constat : la seule différence à ce fichier Dockerfile est l’image de base (microsoft/dotnet:nanoserver) qui spécifie que nous souhaitons utiliser l’image .NET Core sous Nano Server. C’est aussi simple que ça ! (pour une application .NET Core en tout cas).

En quelques étapes :

  • Exécuter la même commande de Build pour construire votre image : docker build –t <votre tag> –f Dockerfile.nanoserver .

image

  • Démarrer un conteneur avec la commande : docker run –d –p 5000:5000 <votre tag>
  • Ouvrez un navigateur web et naviguez vers votre conteneur : http://<ip de votre conteneur/serveur Windows Server 2016>:5000

Exécuter l’application dans un conteneur Hyper-V

Le conteneur Windows Hyper-V apporte une couche d’isolation et de sécurité supplémentaire à l’application. Le choix entre un conteneur Windows “simple” et un conteneur virtualisé Hyper-V se fera en fonction de vos besoins, ce dernier fournissant une isolation du kernel et une séparation entre le niveau/version des patchs de l’hôte et de l’application.

La ligne de commande est similaire, nous précisons simplement le niveau d’isolement :

  • Démarrer un conteneur avec la commande incluant le paramètres isolation : docker run –d –p 5000:5000 –isolation=hyperv <votre tag>
  • Ouvrez un navigateur web et naviguez vers votre conteneur : http://<ip de votre conteneur/serveur Windows Server 2016>:5000

Container everywhere !

L’introduction des conteneurs Windows avec l’arrivée de Windows Server 2016 annonce une adoption du conteneur encore plus importe que celle actuellement avec les conteneurs Linux : containarization d’applications anciennes ou déploiement d’applications IIS avec le .NET Framework (avec Windows Server Core), déploiement Apps/IIS/AD DS/Hyper-V/etc (avec Nano Server), etc. L’adage Docker “Build, Ship and Run any app, Everywhere” n’a jamais eu autant de sens !

Découvrir Nano Server avec Azure

Vous souhaitez tester ou découvrir Nano Server ? Vous disposez d’un compte Azure ? Oui, alors vous n’avez plus d’excuse, cela ne devrait pas vous prendre plus de 5 minutes.

1. Connectez-vous sur le portail d’administration Azure (http://portal.azure.com)

2. Effectuer une recherche ‘Nano server’ dans les services Azure et vous devriez avoir un résultat similaire à celui-ci :

image

3. Cliquez dessus et en bas de page, cliquez sur Créer (mode classique ou Resource Manager, ce dernier étant à privilégier pour les nouvelles ressources)

image

image

4. Configurer la machine avec vos paramètres spécifiques. Pour une démonstration j’ai opté pour la tarification A0 De base ou Standard (cliquez sur Afficher tout en haut à droite si le mode de tarification n’est pas affiché). Evidemment, à dimensionner en fonction de vos besoins.

5. Une fois la machine virtuelle créée (ce qui ne devrait pas être long) et afin de pouvoir déployer un site ASP.NET (Core ou 4.5), vous devez ajouter un point de terminaison pour le port 80 (port privé 5004 dans mon cas) :

image

6. Il ne vous reste plus qu’à vous connecter à votre nouveau Nano Server via une session distante PowerShell (cf. ce post pour l’utilisation de New-PSSession).

Tour d’horizon de Nano Server (partie 2) : déployer un projet web ASP.NET 5

Dans le précédent post, nous avons créer notre première image Nano Server. Dans ce post nous allons créer une image Nano Server comprenant un serveur web IIS pleinement fonctionnel et y déployer un site ASP.NET 5.

IMPORTANT : ce post a été réalisé avec la CTP 4 de Windows Server 2016. Il sera mis à jour ultérieurement.

IMPORTANT : Le site ASP.NET 5 s’exécute directement sur Nano Server (VM ou physique) mais pas dans un container. Dans un prochain post, nous verrons comment faire tourner un projet web ASP.NET 5 dans un container (déploiement qui sera certainement privilégiée par Microsoft). Attention, la différence de procédure peut-être importance, que vous soyez ou non dans un container.

Voici l’état de la documentation d’aujourd’hui sur http://aspnetmvc.readthedocs.org :

image

Alors prenez ce guide en attendant que la documentation soit complétée pour déployer et exécuter une application ASP.NET 5 sur Nano Server.

Création de l’image NanoServer avec IIS

Nous avons deux options pour installer IIS sur un Nano Server : hors ligne (Nano Server est éteint) ou en ligne (Nano Server est en cours d’exécution). Dans ce post nous allons utiliser l’installation hors ligne et créer une image directement avec IIS intégré (nous aurions également pu ajouter IIS à une image déjà existante).

1. Reprenez les étapes de création de la partie 1 de cette série, à l’étape 5 exécutez à la place la ligne de commande suivante : New-NanoServerImage -MediaPath D:\ -BasePath .\Base -TargetPath ‘.\NanoImage\NanoVM.vhdx’ -GuestDrivers –EnableRemoteManagementPort –Language en-us –ComputerName NanoServerNode1 –Packages Microsoft-NanoServer-IIS-Package –ReverseForwarders

A propos du package ReverseForwarders : Pour pouvoir exécuter HttpPlatformHandler et Kestrel (c’est à dire libuv.dll) sur Windows Server, vous allez devoir ajouter un package ReverseForwarders. Les appels à kernel32.dll et advapi32.dll (DLLs qui n’existent pas dans Nano Server) seront ainsi redirigés vers les nouvelles de ces APIs qui ont été déplacés dans d’autres composants. Ce package n’est pas installé par défaut dans Nano Server (alors que c’est le cas sur Win10 IoT) puisque l’objectif est de n’avoir que le strict minimum d’embarqué, il vous faut donc le rajouter.

Création de la machine virtuelle Hyper-V Nano Server

Créer une nouvelle machine virtuelle Hyper-V et connectez une machine virtuelle avec ce nouveau VHD. Vous devriez voir la recovery console.

image

Exemple de script PowerShell de création de VM :

New-VM -VHDPath ‘.\NanoImage\NanoVM.vhdx’ -MemoryStartupBytes 512MB -Name NanoServerNode1 -Generation 2

Set-VMMemory -VMName NanoServerNode1 -DynamicMemoryEnabled $True -MaximumBytes 512MB -MinimumBytes 256MB

Set-VMProcessor -Count 2 -VMName NanoServerNode1

Note : N’oubliez pas mettre le bon switch virtuel pour avoir du réseau et vous connecter à la VM (cf étape suivante pour le vérifier).

Vérifier le fonctionnement de IIS

1. La première chose à faire est de récupérer l’adrese IP de la machine, pour cela, deux options :
– Récupérer l’IP depuis la console de restauration (recovery console) en vous connectant sur la machine et en vous authentifiant
– Récupérer l’IP depuis Hyper-V avec la ligne de commande suivante :  Get-VM –name <Nom de votre VM>| Select -ExpandProperty networkadapters | Select IPAddresses

image

2. Connectez vous avec un navigateur web sur cet IP, vous devriez observer une page de bienvenue IIS :

image

Vous voilà avec un serveur IIS fonctionnel.

Se connecter à Nano Server

Bien qu’il existe plusieurs façons de pouvoir se connecter à distance avec Nano Server, nous allons utiliser le module de gestion IIS PowerShell pour gérer notre serveur IIS. Tout d’abord

1. Pour pouvoir vous connecter au Nano Server avec une session PS, vous devez d’abord l’ajouter dans la liste des hôtes de confiance.  Exécuter la commande PowerShell (toujours dans une console en tant qu’administrateur) : Set-Item WSMan:\localhost\Client\TrustedHosts « <IP de votre serveur> »

image

2. Exécutez la ligne de commande suivante dans PowerShell :
$session = New-PSSession –ComputerName <IP de votre serveur> –Credential Administrator
Enter-PSSession $session

Un prompt vous demandera le mot de passe de l’administrateur.

image

3. (facultatif )Dans la session distante, importez le module de gestion IIS puis récupérer les sites IIS avec les commandes :
Import-Module IISAdministration
Get-IISSite

image

Vous êtes connectez à Nano Server, nous allons pouvoir créer le projet ASP.NET 5 et le déployer.

Création du projet ASP.NET 5

Nano Server ne contient pas de Framework .NET justement parce que celui-ci possède trop de dépendance avec Windows et qu’il fallait couper sévèrement dans les composants. Néanmoins, pour faire fonctionner Powershell, Nano Server utilise une partie de .NET Core (la version open source et portable du framework .NET) mais qui ne suffira pour exécuter votre application.

Note : vous pouvez aussi récupérer le projet ASPNET5WebHello.

Installer la dernière version de .NET Core

Avant de créer votre projet ASP.NET 5 sur votre machine de développement, assurez vous que vous avez bien la dernière version de .NET Core (surtout en ces temps de Beta et RC) avec la commande : dnvm list

image

Si vous n’avez pas la dernière version (ou disons la version que vous souhaitez déployer) de la Core CLR (et en version x64, Nano Server ne s’exécutant qu’en 64 bits), exécuter le commande :

dnvm install latest –r coreclr –arch x64 –alias coreclr-latest

image

image

Projet ASP.NET 5 avec Visual Studio 2015

Dans Visual Studio 2015 (toutes éditions confondues) :

1. Créez un nouveau projet Visual C# > Web > ASP.NET Web Application :

image

2. Choisissez ASP.NET 5 Preview Templates :

image

3. Dans les propriétés du projet, vérifiez que la cible du DNX est bien celle que vous souhaitez :

image

Dans l’onglet de Debug (pour les tests sur l’environnement de développement) :

image

4. Lancez l’application (F5), pour voir un magnifique texte “hello world” apparaître dans votre navigateur.

image

5. Avant de publier votre application, il reste un détail important (sans quoi Nano Server ne servira pas vos pages web) : remplacez l’URL du projet. Dans le fichier project.json, changer la ligne :

« commands »: {
« web »: « Microsoft.AspNet.Server.Kestrel server.urls=
http://localhost:5000″
  },

par

« commands »: {
« web »: « Microsoft.AspNet.Server.Kestrel server.urls=
http://<ip de votre serveur Nano Server>:5000″
  },

Enregistrez les modifications du fichier.

6. Nous allons maintenant pouvoir publier l’application web sur notre disque dur avant de copier les fichiers vers Nano Server. Ouvrez une console PowerShell dans le répertoire de votre projet :

image

Dans la console excutez les commandes suivantes pour restaurer les packages (normalement Visual Studio a dû le faire pour vous mais nous ne sommes jamais trop prudent) et publier l’application avec le runtime dnx-coreclr-win-x64.1.0.0-rc1-update1  :

dnu restore
dnu publish –out <chemin vers répertoire de sortie>–runtime C:\Users\<nom de l’utilisateur>\.dnx\runtimes\dnx-coreclr-win-x64.1.0.0-rc1-update1

Remarque : Publiez votre projet si possible à la racine d’un disque, la technique de copie à suivre ne permettra pas les chemins d’accès de plus de 260 caractères.

6. Vous devriez avoir dans votre répertoire cible, un contenu similaire à celui-ci :

image

Publication du projet vers Nano Server

A ce stade, la seule option que j’ai trouvé pour publier le site est de faire un copier/coller du répertoire publié vers IIS sur le Nano Server. La possibilité d’utiliser un WebDeploy n’est aujourd’hui pas supporté sur le IIS de Nano Server.

Remarque : pour procéder à la copie vers une session distante, si vous êtes sur Windows 8.1 ou 7, vous devrez installer Windows Management Framework 5.0.

Nous allons donc procéder à une copie entre le système de fichier de la machine de développement et le serveur Nano Server :

– Ouvrez une session avec :  $session = New-PSSession –ComputerName <ip de voter serveur> –Credentials Administrator

image

– Exécutez la commande de copie : Copy-item –ToSession $session –Path <chemin vers votre projet publié> –Destination C:\Users\Administrator\Documents –Recurse

image

La copie des fichiers devraient prendre un peu de temps. Les fichiers de votre projet sont maintenant publiés sur Nano Server.

Configurer le pare-feu de Nano Server

Nous avons configurer le site sur le port 5000 qui n’est pas encore ouvert (les ports HTTP et HTTPS sont déjà ouverts). Pour ouvrir le port 5000, vous avez deux options : la ligne de commande ou la console de restauration (recovery console) :

netsh advfirewall firewall add rule name= »HTTP (5000) » dir=in action=allow protocol=TCP localport=5000

image

Démarrer le site web

Le démarrage va être effectuer via le fichier web.cmd qui a été créé lors de la publication du projet. Ce fichier contient les commandes nécessaires pour démarrer votre projet en analysant le fichier project.json.

Naviguez dans le répertoire approot de votre projet et exécuter le fichier web.cmd pour démarrer le serveur :

image

image

Ouvrez un navigateur avec l’adresse http://<ip de votre serveur>:5000 , et voilà :

image

Important : une fois que vous aurez lancé la commande web.cmd, vous devriez observer un écran noir dans votre machine virtuelle. Une fois le serveur arrêté (Ctrl+C), la recovery console réaffichera l’écran en cours. Nous verrons dans un prochain post comment faire éviter cela.

 

Nano Server est définitivement le futur du serveur IIS pour les applications ASP.NET 5. Bien que cette édition soit pour le moment assez limitée en termes d’interface et d’outil de gestion, Microsoft devrait améliorer cet aspect là dans les prochaines versions de son OS.

A ce stade, le manque de documentation se fait sentir ! La communauté et Microsoft devrait combler cette lacune rapidement au vu de l’engouement pour Nano Server. Tous les contributeurs de docs.asp.net sont les bienvenus sur le projet Github.

La solution présentée dans ce post n’est pas définitive, mais permet de montrer comment exécuter une application web ASP.NET 5 dans Nano Server.

Dans un prochain post nous verrons l’hébergement d’un application web ASP.NET 5 dans un container Nano Server et également comment bénéficier de IIS pour l’exécution en production.

Ressources

En attendant, voici quelques ressources qui m’ont bien aidé (malgré que tout ne fonctionne pas) à faire fonctionner un site ASP.NET 5 sur le IIS de Nano Server :

– Pour plus de détails sur les commandes et fichier de configuration IIS : https://msdn.microsoft.com/en-us/library/mt627783.aspx

– Channel 9 “Nano Server in a container running IIS & ASP.NET 5” : https://channel9.msdn.com/Series/Nano-Server-Team/Demo-Nano-Server-in-a-Container-running-IIS-ASPNET5