TL; DR: Pourquoi une application principale aspnet s'exécute-t-elle sur le port 80 à partir d'une image Docker, mais 5 000 en dehors d'une image Docker?.
Élaborer
Je suis passé par le didacticiel d'aspnet core/docker que l'on trouve ici: https://docs.Microsoft.com/en-us/dotnet/core/docker/building-net-docker-images
À mi-chemin de la page, je lance l'application avec les instructions suivantes:
dotnet run
Entre autres choses, ceci affiche ceci:
Now Listening on: http://localhost:5000
Génial. C'est ce à quoi je m'attendais. La prochaine étape du didacticiel consiste à démarrer exactement la même application à partir d’une image Docker.
docker build -t aspnetapp .
docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp
Cela se traduit par
Now listening on: http://[::]:80
Attendez. Wat? Pourquoi l'application principale Aspnet s'exécute-t-elle sur le port 80? Elle s'exécutait sur le port 5000 lorsque je l'ai exécutée directement à partir de la machine. Il n'y a eu aucune modification du fichier de configuration.
Je soupçonne que cela a quelque chose à voir avec les images du docker de base, mais je ne suis pas encore assez expérimenté en docker pour le localiser.
Le Microsoft/aspnetcore-build
Le conteneur est construit sur le Microsoft/aspnetcore
récipient. La page dockerhub pour cela dit:
Une note sur les ports
Cette image définit la variable d'environnement ASPNETCORE_URLS sur http: // +: 8 , ce qui signifie que si vous n'avez pas explicitement défini d'URL dans votre application, via app.UseUrl dans votre Program.cs, par exemple, puis votre application sera à l'écoute sur le port 80 à l'intérieur du conteneur.
Il s’agit donc du conteneur qui définit activement le port sur 80. Vous pouvez le remplacer, si vous le souhaitez, en procédant ainsi dans votre Dockerfile
:
ENV ASPNETCORE_URLS = http: // +: 50
En outre, il convient de noter qu’en raison de la commande docker que vous utilisez, vous pourrez toujours accéder à l’application à partir de http://localhost:5000
si vous exécutez l'application directement ou dans un conteneur.
Si vous utilisez . NET Core 2.2 ou supérieur, vous devez utiliser une autre image: mcr.Microsoft.com/dotnet/core/aspnet:2.2. Dans ce cas, spécifier ENV ASPNETCORE_URLS=http://+:5000
N'aide pas. Vous pouvez toujours forcer l'application à écouter le port 5000 à l'aide de UseUrls("http://*:5000")
dans le fichier Programs.cs.