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

Maven Docker build failed with ‘org.apache.http.conn.HttpHostConnectException: Connect to localhost:2375’ on Windows

You can have this kind of error when building a project with Maven and the Docker plugin (by Spotify) :

[INFO] Building image kelios-solutions/annuaire
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:16 min
[INFO] Finished at: 2017-06-29T16:59:30+11:00
[INFO] Final Memory: 32M/78M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on project annuaire: Exception caught: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.
rs.ProcessingException: org.apache.http.conn.HttpHostConnectException: Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect -> [Help 1]

[ERROR]

On Windows, with Docker for Windows, just check if you have exposed the daemon on port 2375 (in Docker for Windows settings) :

image

And your Maven build should create the Docker image.

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

Fail to run a new ASP.NET Core solution with Docker in Visual Studio 2017

Sometimes you want to make a demo to a good friend of you about Docker support in Visual Studio 2017. So your start Visual Studio 2017, create a blank ASP.NET Core (Docker support enabled), press F5 to run the application but things are not really happening like your want. In my case, I had the following message :

The specified framework 'Microsoft.NETCore.App', version '1.1.2' was not found.
  - Check application dependencies and target a framework version installed at:
      /usr/share/dotnet/shared/Microsoft.NETCore.App
  - The following versions are installed:
      1.1.1
  - Alternatively, install the framework version '1.1.2'.

The issue comes from the fact that Visual Studio 2017 builds a project based on .NET Core 1.1.2 but your Docker image only supports .NET Core 1.1.1 '(see message). Why your image doesn’t support 1.1.2 ? Maybe simply because your image is outdated with no support for 1.1.2. So the trick is quite easy and it consists to execute the pull again the image to force Docker to update the base image :

docker pull microsoft/aspnetcore:1.1

This should solve your issue after several minutes of downloading the updated image layer.

Docker ASP.NET MVC image creation issue ‘GetFileAttributesEx : The system cannot find the path specified’

When using Visual Studio 2017 and trying to create a Docker image for your ASP.NET web app from the standard microsoft\aspnet image (or another image), you may have the following error message : GetFileAttributesEx bin\Release\PublishOutput : The system cannot find the path specified

image

This error is caused by the .dockerignore file generated by Visual Studio 2017 (more information on .dockerignore file : https://docs.docker.com/engine/reference/builder/#dockerignore-file).

How to solve the issue

  1. Open and edit the .dockerignore file located at the root of your Visual Studio project
  2. Remove the first line with the ‘*’ (this is the guilty line !)
  3. Save the modified .dockerignore file
  4. Re execute your docker build command (ex : docker build –t <your tag> .)

Original Visual Studio 2017 .dockerignore file :

image

The corrected .dockerignore file :

image

Check your web app to know if everything works fine

  1. First, you won’t be able to use the URL http://localhost, you need the IP address of the container. To find it, execute this command in Powershell :
  2. docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" ncit_liasse

  3. Open your favorite browser and enter the URL http//<your ip address> to show you web app shining

image

More documentation on the use of this image at https://hub.docker.com/r/microsoft/aspnet/

Useful documentation on how to migrate an ASP.NET MVC application to Docker : https://docs.microsoft.com/en-us/aspnet/mvc/overview/deployment/docker-aspnetmvc

Now enjoy migrating your ASP.NET MVC web apps to Docker containers !

Lancement de Visual Studio 2017 aux Afterworks@Noumea du 15 Mars

Pour le lancement de Visual Studio 2017 et les 20 ans de l’outil de prédilection de tous les développeurs .NET, il aura bien fallut un évènement spécial des Afterworks@Noumea des communautés MS.

Après une présentation d’un peu plus d’une heure ponctuée de démos sur l’outil et sur les différentes fonctionnalités, .NET Core, l’architecture en microservice avec Docker et la mobilité, nous avons pu enfin goûter au gâteau d’anniversaire :

P1040523

Retrouvez les slides de la session ici : https://fr.slideshare.net/neodante/visual-studio-2017-launch-keynote-afterworksnoumea

Au niveau des ressources sur .NET, n’hésitez pas à me suivre sur LinkedIn (https://www.linkedin.com/in/jchable)

Encore un grand merci à la CCI de Nouméa pour le prêt des locaux et leur temps.

Bonne journée

Lancement de Visual Studio 2017 à Nouméa

MSFT_16257_VS17_1000x750_Sharethrough_thumb[4]Suite au lancement officiel du 07 Mars, nous organisons un évènement local ce mercredi 15/03 à la CCI de Nouméa. Au programme, une introduction aux nouvelles fonctionnalités de Visual Studio 2017 et à la plateforme .NET. Pendant cette présentation d’un peu plus d’une heure, ponctuées de pas mal de démonstrations, nous partagerons avec les participants sur les sujets suivants :

- Les nouveautés de Visual Studio 2017

- Quoi de neuf dans .NET et .NET Core ?

- Le développement mobile multiplateforme avec Xamarin

- Microservice, Docker et DevOps

Soyez préparer à manger un morceau du gâteau des 20 ans de Visual Studio !

Nous avons également quelques goodies à faire gagner pendant la session !

A demain soir !

MSFT_16257_VS17_STD_SpecialDelivery_FB_final3_DN-MININT-07V2IBM_thumb[3]

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 :

FROM microsoft/dotnet:nanoserver
 
COPY . /app
WORKDIR /app
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
 
EXPOSE 5000/tcp
ENTRYPOINT ["dotnet", "run", "--server.urls", http://*:5000]

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éployer un projet web ASP.NET Core 1.0 avec Docker sur Windows en 15 minutes

Venant tout juste de passer sous Windows 10 update November 2015 (prérequis pour Docker beta) et souhaitant tester la RC2 fraichement débarquée de .NET Core, je me suis dit qu’un petit post ne serait pas de trop pour prendre les (nouvelles) bonnes habitudes. Aussi voici comment faire court pour créer une application .NET Core :

Installation des prérequis

Pour créer un projet ASP.NET Core :

  • .NET Core SDK (en RC 2 lors de la rédaction de ce post) : https://go.microsoft.com/fwlink/?LinkID=798398
  • NodeJS et son gestionnaire de package NPM : https://nodejs.org
  • Docker pour Windows (si vous êtes sur Windows) ou Docker pour Mac (si vous êtes sur Mac) : https://beta.docker.com/ (l’utilisation de la Beta nécessite l’obtention d’une clef qui arrive au compte goutte en ce moment …). Vous devez également avoir une version de Windows 10 adéquate (avec Hyper-V installé … pourquoi ne l’auriez-vous pas installé d’ailleurs ?!?) et la mise à jour de Novembre 2015.

Création du projet ASP.NET Core

  1. Dans une invite de commande ou dans une console PowerShell :
    1. mkdir coreapp : création d’un répertoire racine pour le projet
    2. cd .\coreapp\
  2. Installation du générateur Yeoman ASP.NET pour créer une application ASP.NET Core (et non juste une application console avec la commande dotnet new)
    1. npm install –g yo : installation de Yeoman
    2. npm install –g generator-aspnet : installation du générateur ASP.NET Core de Yeoman
  3. Création du projet :
    1. yo aspnet : affiche un wizard pour créer un nouveau projet :
      image
  4. Dans le wizard :
    1. Sélectionnez Web Application > Boostrap
    2. Saisissez le nom de l’application
  5. Le générateur va se mettre au travail et récupérer pour vous toutes les dépendances du projet et les placer dans un répertoire du même nom que celui de votre projet.
  6. Nous avons un peu de modification à faire pour rendre notre application compatible avec Docker (et rendre accessible notre application  à l’extérieur du container).
    Ouvrez le fichier Program.cs dans votre éditeur préféré (Visual Studio Code ?)
    Modifiez le contenu pour avoir un contenu similaire à ce qui suit puis enregistrez vos modifications :

    using Microsoft.Extensions.Configuration;
    
    ...
    namespace AppCoreDocker
    {
     public class Program
     {
     public static void Main(string[] args)
     {
     var config = new ConfigurationBuilder()
     .AddEnvironmentVariables("")
     .Build();
     var url = config["ASPNETCORE_URLS"] ?? "http://*:5000";
     var env = config["ASPNETCORE_ENVIRONMENT"] ?? "Development";
     
     var host = new WebHostBuilder()
     .UseKestrel()
     .UseUrls(url)
     .UseEnvironment(env)
     .UseContentRoot(Directory.GetCurrentDirectory())
     .UseIISIntegration()
     .UseStartup&amp;lt;Startup&amp;gt;()
     .Build();
    
     host.Run();
     }
     }
    }
    

    Cette modification permet de spécifier à Kestrel d’écouter sur le port 5000 quel que soit l’adresse que nous lui fournissons (merci à Laurent qui m’a évité de perdre du temps). Vous remarquerez la nouveauté liée à la RC 2 de cette configuration.

  7. Une fois le projet générer, les étapes sont les mêmes que pour tout projet :
    1. cd <nom de votre projet>
    2. dotnet restore : restaure les packages Nuget de l’application
    3. dotnet build : compile le projet (se produira si vous faites un run également)
    4. dotnet ef database update : crée la base de données SQLite pour gérer l’authentification (démo uniquement)
    5. dotnet run : lance le serveur Kestrel sur l’URL http://localhost:5000

image

Ouvrez un navigateur web avec l'URL : http://localhost:5000

image

Déploiement avec Docker

Afin de pouvoir lancer votre application dans un container Docker, nous devons créé notre Dickerfile. Le générateur Yeoman vous a déjà généré ce fichier, néanmoins, pour le moment le template de Yeoman n'est pas à jour (notamment l’image de base qui n’est pas la bonne et les actions maintenant avec la commande dotnet au lieu de dnx - cela a été mis à jour dans Github mais pas dans les distributions npm lors de la rédaction de ce post) que vous devrez modifier afin d’avoir un Dockerfile similaire à :

FROM microsoft/dotnet

ENV ASPNETCORE_ENVIRONMENT= "Production"

COPY . /app
 WORKDIR /app
 RUN ["dotnet", "restore"]

EXPOSE 5000
ENTRYPOINT ["dotnet", "run"]

Une fois le fichier modifié, vous pouvez exécuter les commandes suivantes :

  1. docker build –t <votre tag> .
  2. docker run –d –p 5000:5000 <votre tag>

La première commande build crée l'image Docker en installant les dépendances. La commande run exécute un container avec l'image créée précédemment sur le port 5000.

Ouvrez un navigateur web avec l'URL suivante : http://docker:5000 (et non localhost)

image

 

Conclusion

Force est de constater que l’uniformisation de la chaîne de commandes .NET Core et la possibilité de réaliser ses containers Docker dans un environnement Windows (ou Mac) apporte un réel gain de temps et une uniformité des outils quelle que soit l'environnement de développement.

Néanmoins, je ne pourrais que trop vous conseiller de tester vos containers dans un environnement Docker Linux stable et ne pas oublier que pour le moment Docker for Windows est en Beta.

Tour d’horizon de Nano Server (partie 1) : création d’une image

Dans ce post nous allons démarrer par créer un VHD minimal de Nano Server. Dans un prochain post, nous verrons la personnalisation des images et la mise en container de Nano Server avec le déploiement d’une application ASP.NET 5.

Nano Server ?

Nano Server est une version de Windows Server ultra minimaliste, plus sécurisée et optimisée pour le déploiement Cloud / Datacenter (c’est surtout cette partie qui va nous intéresser). Nano Server est encore plus réduit que la version Core de Windows Server : taille disque minime, ressource mémoire moindre mais aucune interface, pas de connexion directe à l’OS, support des applications 64 bits uniquement (donc exit vos applications 32 bits … enfin si vous en avez encore), aucun rôle préinstallé (rôle sur mesure à ajouter via des packages), etc. Tout cela amène à des (re)démarrages plus rapides, moins de mises à jour et un espace/transfert des VHD beaucoup plus léger et donc souple à maintenir.

Nano Server sera donc un système hôte de choix pour héberger un serveur IIS, un stockage de fichiers, héberger NodeJS et autre plateforme applicative, créer un cluster de reprise, un DNS, etc. Tout cela se configure via les packages qui seront disponibles avec Nano Server (et Microsoft à annoncer l’arrivée d’autres packages dans les mois à venir, sans compter sur les tierces parties).

Création du fichier VHD

Les étapes suivantes permettent de créer le fichier de disque dur virtuel VHD qui sera monté ensuite dans une VM puis dans un container Windows Server.

1. Télécharger une ISO de Windows Server 2016

2. Monter l’image dans votre système de fichier (sur Windows : clic droit sur le fichier .iso > Monter). Pour la suite de ce post, mon lecteur DVD est D:\.

3. A la racine de l’ISO, copier les scripts Convert-WindowsImage.ps1 et le nanoServerImageGenerator.psm1 vers un répertoire sur votre disque dur (dans mon cas c:\NanoServer ) :

image => image

4. Ouvrez une console PowerShell en mode administrateur et placez vous dans le répertoire que vous avez copié (celui où vous avez le fichier Convert-WindowsImage.ps1 et le nanoServerImageGenerator.psm1). Pour importer le module de génération d’image Nano Server, exécutez la ligne de commande : Import-Module .\NanoServerImageGenerator.psm1 –Verbose

image

Note : sur Windows 8.1, vous aurez sûrement à exécuter la commande Set-ExecutionPolicy -ExecutionPolicy Unrestricted pour permettre l’utilisation du module et du script PowerShell.

5. Pour créer un VHD NanoServer avec les drivers de VM hôte (et rien de plus !), exécutez la ligne de commande suivante : New-NanoServerImage -MediaPath D:\ -BasePath .\Base -TargetPath '.\NanoImage\NanoVM.vhd' -GuestDrivers –EnableRemoteManagementPort –Language en-us –ComputerName NanoServerNode1

Lorsque le script vous le demande, saisissez le mot de passe administrateur qui vous permettre de vous connecter à la console de gestion (recovery console).

image

Cette ligne de commande utilise le fichier WIM situé sur le media monté sur D:\ (l’ISO montée) et utilisera le répertoire \Base situé dans le même répertoire que les scripts. Dans notre cas, nous ajoutons les drivers de machine virtuelle et activons la gestion à distance.

Note : si vous spécifiez .vhd pour votre VHD cible, vous aurez un VHD avec un support MBR. Si vous spécifiez .vhdx, vous aurez un support GPT, de génération 2 de machine virtuelle Hyper-V. La taille des fichiers VHD varient entre ces deux schémas de partitionnement :

image

Remarque :  le script prenant les paramètres locales de la machine, étant sur un système local fr-fr et les packages n’étant disponibles qu’en EN-US, nous devons spécifier le paramètre –Language en-us. Les packages devraient être localisés dans les mois à venir. Si vous ne spécifiez pas ce paramètre sur un système autre que en-us, vous aurez un message d’erreur.

Vous pouvez aussi exécuter la ligne de commande pour ne pas avoir à spécifier le mot de passe administrateur :

New-NanoServerImage -MediaPath D:\ -BasePath .\Base -TargetPath .\NanoImage\NanoVM.vhd -Compute -GuestDrivers -ComputerName 1stNano -AdministratorPassword ("P@ssw0rd" | ConvertTo-SecureString -AsPlainText -Force)

Attention : vous ne pouvez pas créer une image sur deux OS/versions d’Hyper-V différentes (par exemple créer l’image sur un Windows Server 2016 et l’exécuter Windows 8.1) car les drivers invités qui sont injectés sont ceux de la version d’Hyper-V de l’OS qui crée l’image.

Exécuter la machine virtuelle

Une fois le fichier VHD généré, nous allons créer une nouvelle machine virtuelle pour exécuter Nano Server :

1. Créer une machine virtuelle dans Hyper-V :

image

Ici nous allons utiliser le fichier .vhd et donc sélectionner la génération 1 :

image

Nano Server ayant besoin de peu de ressources, nous allons laisser 512 Mo de RAM (à dimensionner en fonction de vos besoins) :

image

image

Sélectionner le disque VHD NanoServer créé plus haut :

image

image

Une fois la machine virtuelle créée, n’hésitez pas éventuellement à modifier les paramètres tel que le nombre de processeurs, etc.

2. Démarrez et connectez vous la machine virtuelle Hyper-V pour afficher la console restauration vous permettant d’accéder à voter système même si vous avez un problème réseau :

image

3. Saisissez Administrator comme nom d’utilisateur et le mot de passe que vous aviez spécifié pendant la création de l’image (attention : clavier QWERTY de rigueur !) :

image

Pour naviguer dans l’interface, utilisez les touches de direction, Tab et Echap (pour sortir d’un menu).

Voilà ! Nous venons de créer notre image NanoServer fonctionnelle. Dans les posts à venir, nous allons voir comment personnaliser cette image pour héberger un IIS dans un Windows Server Container.

Ressources

Vous pourrez retrouver de nombreux détails sur la page https://msdn.microsoft.com/en-us/library/mt126167.aspx