Install Docker on Windows Server 2016 and bypass SHA256 hash validation error

Installing Windows Container is quite straightforward (follow https://docs.docker.com/install/windows/docker-ee) … except when you have an error message on certain VM (not on every VM) like “Cannot verify the file SHA256. Deleting the file”. After a deep crawl of the web to find a correct way to solve this issue, I found a tons of Github issue answers and blog post that works sometimes but mostly are inaccurate and the package version mentioned is outdated. So I introduce you a method that will keep the process right on board version after version.

Update (07/10/2018) : current version is now 18.03.1-ee-2 (=> https://dockermsft.blob.core.windows.net/dockercontainer/docker-18-03-1-ee-2.zip)

Update (07/16/2018) : Microsoft is playing with manifest (labelling latest binaries as ‘TEST’), so files and SHA256 file hash changed over the night. Some installation issues seems better to handle. Stay tuned.

The quick start page from Microsoft to install Docker on Windows Server 2016 is here, and it’s well written (although not very useful when having installation error) : https://docs.microsoft.com/en-us/virtualization/windowscontainers/quick-start/quick-start-windows-server

Get the right version and Docker install file

To download the correct version of the package, you’ll have to get the manifest and to look for your version to get the right URL :

  1. Download the manifest file containing every package version : Start-BitsTransfer -Source https://dockermsft.blob.core.windows.net/dockercontainer/DockerMsftIndex.json
  2. In the manifest, copy the right URL to the install ZIP file (in my case I need 17.06.0-ce) :

image

Installation

Once you know what you need (in my case version 17-06-0-ce), follow these steps to make it work :

  • Go to the temp folder where everything happen (don’t forget to replace by your current username) : cd C:\Users\<username>\AppData\Local\Temp\DockerMsftProvider\
  • Download Docker package (don’t forget to replace the URL by the one you copy previously) : Start-BitsTransfer -Source https://dockermsft.blob.core.windows.net/dockercontainer/docker-17-06-0-ce.zip -Destination /docker-17-06-0-ce.zip.bak
  • Copy the file to keep a backup (during the process the file is deleted, you won’t have to download it again) : cp docker-17-06-0-ce.zip docker-17-06-0-ce.zip.bak
  • Check the SHA256 Hash : Get-FileHash -Path /docker-17-06-0-ce.zip -Algorithm SHA256
  • Install Docker package : Install-Package -Name docker -ProviderName DockerMsftProvider -Verbose -RequiredVersion 17.06.0-ce
  • Tada ! Things should be OK, so the final step is to restart the computer to make everything work like a charm : Restart-Computer -Force

Déployer ASP.NET 5 dans un container Docker

image

Docker et bientôt Windows Server Container vont vous permettre de délivrer et d’exécuter des applications plus rapidement et avec moins de ressources. La “containerization” des applications embrace l’approche DevOps en permettant d’exécuter des centaines d’applications en parallèle alors que même un cluster de VMs en seraient incapable et de surcroit difficile à gérer. Le container permet aussi de rendre l’architecture microservices plus fiable et plus accessible aux équipes réduites.

imageCette série de post vous proposer une première approche au déploiement d’une application ASP.NET 5 dans un container Docker. Ainsi vous serez capable de déployer votre application sur vos serveurs de production ou dans le Cloud (AWS, Azure, etc) rapidement et de façon fiable.

Introduction sur les containers

L’avantage des containers, en dehors d’une densification plus importante des serveurs en applications, est aussi l’utilisation des images. Une image contient aussi bien l’OS que les dépendances de l’application (CoreCLR, ASP.NET MVC, etc) et est de de petite taille. Cela permet de créer des containers rapidement et de les démarrer tout aussi rapidement. Aujourd’hui le hub Docker contient plus de 100 000 images.

Bien que Docker se limite aujourd’hui à délivrer des containers Linux (OS du container et OS hôte), l’arrivée de Windows Container et de Nano Server devraient faire évoluer le paysage de cette technologies dans les prochains mois.

Pour ce post, .NET Core étant multi plateforme, nous allons créer une application ASP.NET 5 MVC puis l’exécuter un container Docker sous Linux.

Prérequis

Vous devez disposer :

  • D’une machine hébergeant Docker. Pour ce blog, j’ai utilisé une machine hébergée sur  Azure mais une VM Hyper-V avec Ubuntu ou autre fait tout aussi bien l’affaire.
  • Eventuellement d’un projet ASP.NET 5 à déployer. Pour ce post, j’ai créé une application excessivement simple affichant une page de bienvenue et disponible sur Github.

Création du fichier Dockerfile

Le fichier Dockerfile permet de créer des containers en industrialisant sa composition par un script de création. Ces fichiers peuvent être versionnés et mis à jour en fonction de l’évolution de vos plateformes et applications.

FROM microsoft/aspnet:1.0.0-rc1-final-coreclr

COPY . /app
WORKDIR /app
RUN [« dnu », « restore »]

EXPOSE 5004
ENTRYPOINT [« dnx », « -p », « project.json », « kestrel »]

L’instruction FROM permet de spécifier l’image Docker de base utilisée. Dans notre cas, une image préconfigurée avec la version CoreCLR 1.0.0 RC1.

L’instruction COPY va exécuter une copie des fichiers situés à la racine dans le répertoire app avant de devenir le répertoire courant (instruction WORKDIR) dans lequel nous allons restaurer les packages de l’application à partir du fichier project.json.

L’instruction EXPOSE spécifie que le container aura un port 5004 exposé (ce port est configuré dans le fichier project.json comme étant celui du serveur web). Le point d’entrée ENTRYPOINT spécifie la commande à exécuter lors du lancement du container. Dans notre cas, nous exécutons un serveur kestrel.

Créer le container

A partir  de ce fichier Docker, vous allez maintenant pouvoir construire votre container, voir automatiser ce processus afin d’effectuer des tests automatisés de votre application (nous aurons l’occasion d’en parler plus tard).

Dans votre machine Docker (ici dans une console d’une VM Azure connectée en SSH) :

1. Exécuter la commande Git afin de récupérer un projet simple et le fichier Dockerfile prêt à l’emploi sur votre serveur :
git clone https://github.com/NCITNoumea/docker-ressources.git

2. Une fois les fichiers récupérés depuis github sur votre serveur
cd docker-ressources/images/mvc-hello/
sudo docker build -t mvc-hello .

La construction du container devrait prendre quelques minutes, nécessaires au téléchargement de l’image de base et des dépendances .NET. Au bout de quelques minutes, vous devriez avoir un message indiquant le succès de l’opération :

image
Remarque : dans cette capture, vous pourrez observer que l’image et les dépendances sont déjà contenues dans le cache (“Using cache”). Lors de la première exécution, vous verrez défiler les téléchargements.

3. Votre container nommé mvc-hello est maintenant prêt à être déployer et exécuter dans le Docker Engine.

Exécuter le container

Toujours dans votre machine Docker (ici dans une console d’une VM Azure connectée en SSH) :

1. Exécuter le commande de démarrage du container :
sudo docker run –t –d –p 80:5004 mvc-hello

L’exécution de cette commande devrait vous renvoyer un identifiant excessivement long :

image

Cette commande propose différent paramètres, le plus important dans notre cas est le mapping des ports entre le container et l’hôte Docker. Nous spécifions que le port 80 de l’hôte sera redirigé vers le port 5004 (que nous avons exposé précédemment) du container.

Vérifier le déploiement

Vous pouvez vous connecter sur l’IP de votre VM (port 80) avec un navigateur web pour constater l’exécution du serveur web et de votre application ASP.NET 5 :

image

En cas d’erreur …

L’exécution d’un container n’est pas sans mauvaise configuration de notre part, aussi vous pouvez demander à Docker d’afficher les logs d’exécution d’un container afin de diagnostiquer la source de l’erreur :

1. Exécuter le commande de démarrage du container :
sudo docker logs <identifiant de votre container>

Vous pouvez récupérer l’identifiant de votre container de plusieurs façons, la plus simple est de copier/coller celui-ci lorsqu’il s’est affiché à l’exécution de la commande run. Il s’agit bien de l’ “identifiant excessivement long” évoqué précédemment.

image

Arrêter le container

Dans votre machine Docker (ici dans une console d’une VM Azure connectée en SSH) :

1. Exécuter le commande de démarrage du container :
sudo docker ps

Cette commande liste les containers en cours d’exécution. Vous devriez trouver le vôtre :

image

2. Exécuter le commande de démarrage du container :
sudo docker stop <nom de votre container>

L’arrêt devrait prendre quelques secondes le temps que le serveur web s’arrête. Si vous réexécuter la commande sudo docker ps, le container devrait avoir disparu.

Conclusion

Bien qu’attendu au premier semestre 2016, ASP.NET 5 est d’ores et déjà fonctionnel que ce soit au travers d’un serveur IIS ou d’un serveur web Linux (kestrel).

L’utilisation d’application “containeriser” devrait apporter une nouvelle bouffée d’air aux process DevOps des projets .NET. L’arrivée de Windows Server Container (dont nous parlerons dans un prochain post) devrait encore ajouter de l’agilité à ces projets, comme c’est déjà le cas avec l’intégration des extensions Docker dans Visual Studio et Azure.

Alors que le déploiement de services .NET (site web, services SOAP/REST/OData, etc) avait un TCO plus élevé que des homologues tels que PHP, Java, Ruby, etc (hébergés le plus souvent sur Linux/Apache), le déploiement d’une application .NET dans un container Linux devrait radicalement changer la donne et permettre à toutes les entreprises et développeurs de pouvoir utiliser la puissante et la flexibilité de .NET et de ses framework (ASP.NET MVC, Entity Framework, etc) à coûts d’hébergement identiques.

Cela devrait permettre à .NET de devenir enfin une plateforme de service compétitive : économique tout en continuant de garantir la productivité acquises avec les frameworks .NET et ses outils (notamment Visual Studio) pour apporter plus et plus rapidement de la valeur utilisateur à ses utilisateurs / clients.

Note : ce post se base sur des versions préliminaires des images ASP.NET , par conséquent les instructions pourront changer en cours de temps. Néanmoins, n’hésitez pas à consulter le repository Docker des images officielles : https://hub.docker.com/r/microsoft/aspnet/

Création d’une VM Docker dans Azure

Azure propose aujourdh’ui une VM préconfigurée pour exécuter Docker sur un Ubuntu 15.04 Server afin de vous épargner la création d’une machine et l’installation des différents composants.

Voici les étapes à suivre pour avoir une machine disponible en quelques minutes :

1. Connectez vous sur votre compte Azure : http://portal.azure.com

2. Dans le portail, cliquez sur Nouveau

image

3. Rechercher l’image “Docker on Ubuntu Server” dans le marketplace

image

image

4. Cliquez sur Créer en bas de page, puis saisissez le nom d’hôte, le nom d’utilisation et mot de passe. Gardez le type d’authentification en Mot de passe plutôt que clé publique SSH pour des raisons de simplicité. Si vous êtes familiarisé avec SSH et les clés publiques, changez de mode. Sélectionnez votre niveau de tarification selon vos besoins, le groupe de ressources et l’emplacement du data center.

image

5. Cliquez sur Créer puis attendez la création de la VM qui devrait prendre quelques minutes.

6. Une fois la VM créée, connectez-vous à l’interface d’administration de celle-ci dans le portail Azure

image

7. Naviguez dans Gérer > Adresses IP pour récupérer l’adresse IP avec laquelle vous vous connecterez en SSH

image

8. Créez un point de terminaison pour autoriser la connexion sur le port HTTP (80) si vous déployer un container avec un serveur web en naviguant dans Gérer > Points de terminaison :

image

9. Pour tester la connexion SSH avec le serveur, utilisez un client SSH (par exemple Putty) et essayer de vous connecter pour valider la bon fonctionnement de votre nouvel VM Docker :

image

10. Exécuter la commande sudo docker pour vérifier le bon fonctionnement de Docker :

image

Votre VM Docker est maintenant fonctionnelle. Vous allez pouvoir héberger des containers (voir prochains posts).

Afterworks des communautés MS @Nouméa

L’édition de décembre de l’afterworks des communautés Microsoft aura lieu le Lundi 14 Décembre à 18h dans la petite salle du bout du monde.

12341205_10153829715659711_1896417378656081362_n

Au programme de cet afterwork de Décembre :

– Introduction à DevOps avec Docker for Windows et Hyper-V Container (Julien Chable)

– Windows Nano Server (Sylver Schorgen)

Inscrivez vous sur l’event FB