Exercice : Personnaliser une image Docker pour qu’elle exécute votre propre application web
Un fichier Dockerfile contient les étapes de la génération d’une image Docker personnalisée.
Vous décidez de déployer l’une des applications web de votre organisation à l’aide de Docker. Vous sélectionnez une application web simple qui implémente une API web pour un site web de réservations d’hôtel. L’API web expose les opérations HTTP POST et GET qui créent et récupèrent les réservations des clients.
Notes
Dans cette version de l’application web, les réservations ne sont en fait pas conservées et les requêtes retournent des données factices.
Dans cet exercice, vous allez créer un fichier Dockerfile pour une application qui n’en possède pas. Ensuite, vous allez générer l’image et l’exécuter localement.
Créer un fichier Dockerfile pour l’application web
S’il n’est pas déjà en cours d’exécution, démarrez Docker sur votre ordinateur.
Dans une fenêtre d’invite de commandes sur votre ordinateur local, exécutez la commande suivante afin de télécharger le code source de l’application web.
git clone https://github.com/MicrosoftDocs/mslearn-hotel-reservation-system.git
Entrez la commande suivante pour ouvrir le répertoire
src
.cd mslearn-hotel-reservation-system/src
Dans le répertoire
src
, entrez les commandes suivantes pour créer un nouveau fichier appeléDockerfile
et ouvrez-le dans le Bloc-notes :copy NUL Dockerfile notepad Dockerfile
Notes
Par défaut, la commande notepad ouvre un fichier texte. Veillez à l’enregistrer en tant que type de fichier Tous les fichiers sans extension de fichier. Pour vérifier, ouvrez le dossier src dans l’Explorateur de fichiers et sélectionnez Affichage > Afficher > Extensions de nom de fichier. Si nécessaire, renommez le fichier et supprimez
.txt
du nom de fichier.Ajoutez le code suivant au Dockerfile :
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 WORKDIR /src COPY ["/HotelReservationSystem/HotelReservationSystem.csproj", "HotelReservationSystem/"] COPY ["/HotelReservationSystemTypes/HotelReservationSystemTypes.csproj", "HotelReservationSystemTypes/"] RUN dotnet restore "HotelReservationSystem/HotelReservationSystem.csproj"
Ce code a des commandes pour récupérer une image contenant le SDK .NET Core Framework. Les fichiers projet de l’application web (
HotelReservationSystem.csproj
) et le projet de bibliothèque (HotelReservationSystemTypes.csproj
) sont copiés dans le dossier/src
du conteneur. La commandedotnet restore
télécharge les dépendances requises par ces projets à partir de NuGet.Ajoutez le code suivant au bas du Dockerfile :
COPY . . WORKDIR "/src/HotelReservationSystem" RUN dotnet build "HotelReservationSystem.csproj" -c Release -o /app
Ces commandes copient le code source de l’application web dans le conteneur, puis exécutent la commande dotnet build pour générer l’application. Les DLL résultantes sont écrites dans le dossier
/app
du conteneur.Ajoutez la commande suivante au bas du Dockerfile.
RUN dotnet publish "HotelReservationSystem.csproj" -c Release -o /app
La commande
dotnet publish
copie les fichiers exécutables pour le site web dans un nouveau dossier et supprime tous les fichiers temporaires. Les fichiers de ce dossier peuvent ensuite être déployés sur un site web.Ajoutez les commandes suivantes au bas du Dockerfile.
EXPOSE 80 WORKDIR /app ENTRYPOINT ["dotnet", "HotelReservationSystem.dll"]
La première commande ouvre le port 80 dans le conteneur. La deuxième commande accède au dossier
/app
contenant la version publiée de l’application web. La dernière commande spécifie que quand le conteneur s’exécute il doit exécuter la commandedotnet HotelReservationSystem.dll
. Cette bibliothèque contient le code compilé de l’application web.Enregistrez le fichier et fermez votre éditeur de texte. Veillez à l’enregistrer en tant que type de fichier Tous les fichiers sans extension de fichier.
Générer et déployer l’image à l’aide du fichier Dockerfile
Depuis l’invite de commandes, exécutez la commande suivante afin de générer l’image pour l’exemple d’application à l’aide du fichier Dockerfile. N’oubliez pas le caractère
.
à la fin de la commande. Cette commande génère l’image et la stocke localement. Le nomreservationsystem
est attribué à l’image. Vérifiez que l’image est générée correctement. Un avertissement à propos des autorisations de fichier et de répertoire peut s’afficher une fois le processus terminé. Vous pouvez ignorer cet avertissement dans le cadre de cet exercice. La génération de l’image peut prendre un certain temps.docker build -t reservationsystem .
Exécutez la commande suivante pour vérifier que l’image a été créée et stockée dans le registre local :
docker image list
L’image aura le nom
reservationsystem
. Vous aurez également une image nommée microsoft/dotnet :REPOSITORY TAG IMAGE ID CREATED SIZE reservationsystem latest d2501f0f2ced About a minute ago 1.76GB
Tester l’application web
Entrez le code suivant pour exécuter un conteneur utilisant l’image
reservationsystem
. Docker retourne une longue chaîne de chiffres hexadécimaux. Le conteneur s’exécute en arrière-plan sans aucune interface utilisateur. Le port 80 dans le conteneur est mappé au port 8080 sur la machine hôte. Le conteneur est nomméreservations
.docker run -p 8080:80 -d --name reservations reservationsystem
Démarrez un navigateur web et accédez à
http://localhost:8080/api/reservations/1
. Vous devriez voir un objet JSON contenant les données pour le numéro de réservation 1, similaire à la sortie suivante :Remplacez le « 1 » à la fin de l’URL localhost par un autre numéro de réservation (par exemple, 2 ou 20) pour voir les détails correspondants à la réservation.
Exécutez la commande suivante pour voir l’état du conteneur :
docker ps -a
La sortie répertorie les éléments suivants pour tous les conteneurs disponibles :
- ID DE CONTAINER
- IMAGE
- COMMANDE
- Heure de CRÉATION
- STATUT
- PORTS
- NAMES
Vérifiez que le
STATUS
du conteneur est Up.CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 07b0d1de4db7 reservationsystem "dotnet HotelReserva…" 5 minutes ago Up 5 minutes 0.0.0.0:8080->80/tcp reservations
Entrez la commande suivante pour arrêter le conteneur reservations :
docker container stop reservations
Supprimez le conteneur reservations du registre local.
docker rm reservations
Laissez reservationsystem dans le registre local. Vous utiliserez cette image dans l’exercice suivant.
Félicitations ! Vous avez créé une image pour votre application web et vous l’avez exécutée avec un conteneur Docker.