GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Explorer ASP.NET Core avec Docker dans les conteneurs Linux et Windows

En mai de l'année dernière, faire des choses avec ASP.NET et Docker en était à ses balbutiements. Mais des trucs sympas se préparaient. J'ai écrit un article de blog montrant comment publier une application ASP.NET 5 (5 à l'époque, maintenant Core 1.0) sur Docker. Plus tard en décembre 2015, de nouveaux outils comme Docker Toolbox et Kitematic ont rendu les choses encore plus faciles. En mai 2016, Docker pour Windows Beta a continué à faire avancer la balle.

Je voulais voir à quoi ressemblaient les choses avec ASP.NET Core, Docker et Windows ici en octobre 2016.

J'ai installé ces éléments :

  • Communauté Visual Studio 2015
    • Mise à jour 3 de Visual Studio 2015
  • ASP.NET Core avec .NET Core
    • .NET Core 1.0.1 – VS 2015 Tooling Preview 2
  • Docker pour Windows (J'ai utilisé la chaîne bêta)
  • Outils Visual Studio pour Docker

Docker pour Windows est vraiment sympa car il automatise la configuration d'Hyper-V pour vous et crée le système d'exploitation hôte Docker et le fait fonctionner. C'est un gain de temps considérable.

Il y a mon hôte Linux auquel je n'ai pas vraiment à penser. Je ferai tout depuis la ligne de commande ou depuis Visual Studio.

Je dirai Fichier | Nouveau projet et créez une nouvelle application ASP.NET Core exécutée sur .NET Core.

Ensuite, je fais un clic droit et Ajouter | Prise en charge de Docker . Ce menu provient de l'extension Visual Studio Tools pour Docker. Cela ajoute un Dockerfile de base et quelques fichiers de composition de docker. Prêt à l'emploi, je suis prêt à déployer mon application ASP.NET Core sur un conteneur Docker Linux.

ASP.NET Core dans un conteneur Docker Linux

À partir de mon application ASP.NET Core, je m'assurerai que mon image de base (c'est-à-dire le FROM dans le Dockerfile) est l'image de base ASP.NET Core pour Linux.

FROM microsoft/aspnetcore:1.0.1
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
EXPOSE 80
COPY $source .

Ensuite, puisque je ne veux pas encore que Docker fasse la construction de mon application, je la publierai localement. Assurez-vous de lire le billet de blog de Steve Lasker "Création d'images Docker optimisées avec ASP.NET Core" pour savoir comment faire en sorte qu'un conteneur Docker crée votre application et que l'autre l'exécute. Cela optimise la densité et les ressources du serveur.

Je vais publier, puis créer les images et les exécuter.

>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

Et il y a mon application ASP.NET Core qui s'exécute dans Docker. Donc, j'exécute Windows, j'exécute Hyper-V, j'exécute un hôte Linux qui héberge des conteneurs Docker.

Que puis-je faire d'autre ?

ASP.NET Core dans un conteneur Docker Windows exécutant Windows Nano Server

Il y a Windows Server , il y a Windows Server Core qui supprime l'interface utilisateur entre autres et il y a Windows Nano Server ce qui réduit Windows à des centaines de Mo au lieu de plusieurs concerts. Cela signifie qu'il existe de nombreux choix en fonction de vos besoins en termes de fonctionnalités et de densité de serveur. Expédiez le moins possible.

Laissez-moi voir si je peux faire fonctionner ASP.NET Core sur Kestrel sous Windows Nano Server. Certainement, puisque Nano est très capable, je pourrais exécuter IIS dans le conteneur et il y a des docs à ce sujet.

Michael Friis de Docker a un excellent article de blog sur la création et l'exécution de votre premier conteneur Docker Windows Server. Avec le nouveau Docker pour Windows, vous pouvez simplement cliquer dessus avec le bouton droit de la souris et basculer entre les conteneurs Linux et Windows.

Alors maintenant, j'utilise Docker avec des conteneurs Windows. Vous ne savez peut-être pas que vous avez probablement déjà des conteneurs Windows ! Il a été livré dans l'édition anniversaire de Windows 10. Vous pouvez rechercher des conteneurs dans les fonctionnalités :

Je vais modifier mon Dockerfile pour utiliser l'image Windows Nano Server. Je peux également contrôler les ports sur lesquels ASP.NET parle si je le souhaite avec une variable d'environnement et l'exposer dans Docker.

FROM microsoft/dotnet:nanoserver
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
ENV ASPNETCORE_URLS http://+:82
EXPOSE 82
COPY $source .

Ensuite, je publierai et construirai...

>dotnet publish
>docker build bin\Debug\netcoreapp1.0\publish -t aspnetcoreonnano

Ensuite, je vais l'exécuter, en mappant les ports de Windows à l'extérieur vers le conteneur Windows à l'intérieur !

REMARQUE : Au moment de la rédaction de cet article, un bogue affecte la manière dont Windows 10 communique avec les conteneurs via "NAT" (traduction d'adresse réseau), de sorte que vous ne pouvez pas facilement accéder à http://localhost:82 comme vous (et moi) le souhaitons. Aujourd'hui, vous devez frapper directement l'adresse IP du conteneur. Je ferai un rapport dès que j'en saurai plus sur ce bogue et sur la façon dont il sera corrigé. Il apparaîtra dans Windows Update un jour. La solution consiste à obtenir l'adresse IP du conteneur à partir de docker comme ceci :docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" HASH

UPDATE :
Ce bogue a été corrigé dans la mise à jour d'avril de Windows 10. Détails ici Accès de l'hôte local aux ports de conteneur Windows

Je vais donc exécuter mon application ASP.NET Core sur Windows Nano Server (encore une fois, pour être clair, cela s'exécute sur Windows 10 et Nano Server se trouve dans un conteneur !)

>docker run -it -d -p 88:82 aspnetcoreonnano
afafdbead8b04205841a81d974545f033dcc9ba7f761ff7e6cc0ec8f3ecce215

>docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" afa
172.16.240.197

Maintenant, je peux accéder à ce site avec 172.16.240.197:82. Une fois le bogue ci-dessus corrigé, il sera touché et acheminé comme n'importe quel conteneur.

La meilleure partie des conteneurs Windows est qu'ils sont rapides et légers. Une fois l'image téléchargée et créée sur votre machine, vous la démarrez et l'arrêtez en quelques secondes avec Docker.

MAIS, vous pouvez également isoler les conteneurs Windows à l'aide de Docker comme ceci :

docker run --isolation=hyperv -it -d -p 86:82 aspnetcoreonnano

Alors maintenant, cette instance s'exécute de manière totalement isolée dans Hyper-V lui-même. Vous obtenez le meilleur de tous les mondes. Déploiement rapide et pratique, plus isolation facultative et facile.

ASP.NET Core dans un conteneur Windows Docker exécutant Windows Server Core 2016

Je peux ensuite modifier le Dockerfile pour utiliser l'image complète de Windows Server Core. Il s'agit de 8 concerts, alors soyez prêt car le téléchargement et l'extraction prendront un peu de temps, mais c'est vraiment Windows. Vous pouvez également choisir de l'exécuter en tant que conteneur ou en tant que conteneur Hyper-V isolé.

Ici, je change juste le FROM pour obtenir un Windows Sever Core avec .NET Core inclus.

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 .

REMARQUE : J'entends dire qu'il est probable que les images .NET Core sur Windows Server Core vont probablement disparaître. Il est plus logique que .NET Core s'exécute sur Windows Nano Server ou d'autres images légères. Vous utiliserez Server Core pour des tâches plus lourdes, et Server est agréable car cela signifie que vous pouvez exécuter des applications .NET Framework « complètes » dans des conteneurs ! Si vous voulez VRAIMENT avoir .NET Core sur Server Core, vous pouvez créer votre propre Dockerfile et créer facilement une image contenant les éléments que vous souhaitez.

Ensuite, je publierai, créerai et exécuterai à nouveau.

>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

Étant donné que les conteneurs sont si rapides à démarrer et à arrêter, je peux avoir une ferme Web complète fonctionnant avec Redis dans un conteneur, SQL dans un autre et ma pile Web dans un troisième. Ou mélangez et assortissez.

>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

Conclusion

Encore une fois, allez voir l'article de Michael où il utilise Docker Compose pour afficher l'échantillon ASP.NET Music Store avec SQL Express dans un conteneur Windows et ASP.NET Core dans un autre ainsi que le blog de Steve Lasker (en fait, tout son blog est de l'or ) sur la création d'images Docker optimisées avec 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 souligne un certain nombre de techniques qui vous permettront de tirer le meilleur parti de Docker et d'ASP.NET Core.

Le résultat de tout cela signifie (IMHO) que vous pouvez utiliser ASP.NET Core :

  • ASP.NET Core sous Linux
    • dans les conteneurs Docker
    • dans n'importe quel Cloud
  • ASP.NET Core sur Windows, Windows Server, Server Core et Nano Server.
    • dans les conteneurs Windows Docker
    • dans des conteneurs Hyper-V Docker isolés

Cela signifie que vous pouvez choisir le niveau de prise en charge des fonctionnalités et la taille à optimiser pour la densité et la commodité du serveur. Une fois que tous les outils (les gens Docker avec Docker pour Windows et les gens VS avec Visual Studio Docker Tools) sont cuits, nous aurons un bon débogage et des flux de travail du développement à la production.

Qu'avez-vous fait avec Docker, les conteneurs et ASP.NET Core ? Exprimez-vous dans les commentaires.

Parrain : Merci à Redgate cette semaine ! Découvrez l'outil de comparaison SQL Server le plus fiable au monde. Profitez d'un essai gratuit de SQL Compare, la norme de l'industrie pour comparer et déployer des schémas SQL Server.


Docker
  1. Qu'est-ce que Docker (et les conteneurs Linux ?)

  2. Optimisation des tailles d'image Docker ASP.NET Core

  3. Comment écrire un démon Linux avec .Net Core

  4. Copier le fichier de Linux vers le partage Windows avec C # (noyau .NET)

  5. Crypter un disque dur externe avec un accès en lecture + écriture sur Windows et Linux

Création, exécution et test de .NET Core et ASP.NET Core 2.1 dans Docker sur un Raspberry Pi (ARM32)

Conteneurs Docker et Linux sous Windows, avec ou sans machines virtuelles Hyper-V

.NET et Docker

ZEIT déploie désormais des applications Web open source ASP.NET Core avec Docker

Publication d'une application ASP.NET 5 sur Docker sous Linux avec Visual Studio

Déplacement d'un ASP.NET Core d'Azure App Service sur Windows vers Linux en testant d'abord dans WSL et Docker