Esercizio: Personalizzare un'immagine Docker per eseguire la propria app Web
Un Dockerfile contiene i passaggi per la creazione di un'immagine Docker personalizzata.
Si decide di distribuire una delle app Web dell'organizzazione usando Docker. Si seleziona un'app Web semplice che implementa un'API Web per un sito Web di prenotazioni di hotel. L'API Web espone le operazioni POST e GET HTTP che creano e recuperano le prenotazioni dei clienti.
Nota
In questa versione dell'app Web le prenotazioni in realtà non vengono mantenute e le query restituiscono dati fittizi.
In questo esercizio verrà creato un Dockerfile per un'app che non ne ha uno. Quindi, l'immagine verrà creata ed eseguita in locale.
Creare un Dockerfile per l'app Web
Se non è già in esecuzione, avviare Docker sul computer.
In una finestra del prompt dei comandi o nel computer locale eseguire il comando seguente per scaricare il codice sorgente per l'app Web.
git clone https://github.com/MicrosoftDocs/mslearn-hotel-reservation-system.git
Immettere il comando seguente per aprire la directory
src
.cd mslearn-hotel-reservation-system/src
Nella directory
src
immettere i comandi seguenti per creare un nuovo file denominatoDockerfile
e aprirlo in Blocco note:copy NUL Dockerfile notepad Dockerfile
Nota
Per impostazione predefinita, il comando blocco note apre un file di testo. Assicurarsi di salvarlo come tipo di file Tutti i file senza estensione. Per verificare, aprire la cartella src in Esplora file, selezionare Visualizza > Mostra> Estensioni nomi file. Se necessario, rinominare il file e rimuovere
.txt
dal nome file.Aggiungere il codice seguente al 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"
Questo codice contiene comandi che recuperano un'immagine contenente l'SDK di .NET Core Framework. I file di progetto per l'app Web (
HotelReservationSystem.csproj
) e il progetto di libreria (HotelReservationSystemTypes.csproj
) vengono copiati nella cartella/src
nel contenitore. Il comandodotnet restore
scarica le dipendenze richieste da questi progetti da NuGet.Aggiungere il codice seguente in fondo al Dockerfile:
COPY . . WORKDIR "/src/HotelReservationSystem" RUN dotnet build "HotelReservationSystem.csproj" -c Release -o /app
Questi comandi copiano il codice sorgente per l'app Web nel contenitore, quindi eseguono il comando dotnet build per compilare l'app. Le DLL risultanti vengono scritte nella cartella
/app
nel contenitore.Aggiungere il comando seguente in fondo al Dockerfile.
RUN dotnet publish "HotelReservationSystem.csproj" -c Release -o /app
Il comando
dotnet publish
copia i file eseguibili per il sito Web in una nuova cartella e rimuove eventuali file temporanei. I file presenti in questa cartella possono quindi essere distribuiti a un sito Web.Aggiungere i comandi seguenti in fondo al Dockerfile.
EXPOSE 80 WORKDIR /app ENTRYPOINT ["dotnet", "HotelReservationSystem.dll"]
Il primo comando apre la porta 80 nel contenitore. Il secondo comando passa alla cartella
/app
che contiene la versione pubblicata dell'app Web. L'ultimo comando specifica che quando il contenitore è in esecuzione deve essere eseguito il comandodotnet HotelReservationSystem.dll
. Questa libreria contiene il codice compilato per l'app Web.Salvare il file e chiudere l'editor di testo. Assicurarsi di salvarlo come tipo di file Tutti i file senza estensione.
Creare e distribuire l'immagine usando il Dockerfile
Al prompt dei comandi eseguire il comando seguente per creare l'immagine per l'app di esempio usando il Dockerfile. Non dimenticare di aggiungere
.
alla fine del comando. Questo comando consente di creare l'immagine e di archiviarla in locale. All'immagine viene assegnato il nomereservationsystem
. Verificare che l'immagine venga creata correttamente. Al termine del processo potrebbe essere visualizzato un avviso relativo alle autorizzazioni per file e directory. Ai fini di questo esercizio, è possibile ignorare questo avviso. La compilazione dell'immagine potrebbe richiedere qualche minuto.docker build -t reservationsystem .
Eseguire il comando seguente per verificare che l'immagine sia stata creata e archiviata nel registro locale:
docker image list
Il nome dell'immagine sarà
reservationsystem
. Si otterrà anche un'immagine denominata microsoft/dotnet:REPOSITORY TAG IMAGE ID CREATED SIZE reservationsystem latest d2501f0f2ced About a minute ago 1.76GB
Testare l'app Web
Immettere il codice seguente per eseguire un contenitore che usa l'immagine
reservationsystem
. Docker restituirà una stringa lunga esadecimale. Il contenitore viene eseguito in background senza alcuna interfaccia utente. La porta 80 del contenitore è mappata alla porta 8080 del computer host. Il contenitore è denominatoreservations
.docker run -p 8080:80 -d --name reservations reservationsystem
Aprire un Web browser e passare all'indirizzo
http://localhost:8080/api/reservations/1
. Verrà visualizzato un oggetto JSON contenente i dati per il numero di prenotazione 1 simile all'output seguente:Sostituire "1" alla fine dell'URL localhost con un numero di prenotazione diverso, ad esempio 2 o 20, per visualizzare i dettagli della prenotazione corrispondenti.
Eseguire il comando seguente per visualizzare lo stato del contenitore:
docker ps -a
L'output elenca quanto segue per tutti i contenitori disponibili:
- ID CONTENITORE
- IMMAGINE
- COMANDO
- ORA DI CREAZIONE
- STATO
- PORTE
- NAMES
Verificare che
STATUS
del contenitore sia Attivo.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
Immettere il comando seguente per arrestare il contenitore reservations:
docker container stop reservations
Eliminare il contenitore reservations dal registro locale.
docker rm reservations
Lasciare il contenitore reservations nel registro locale. Questa immagine verrà usata nell'esercizio successivo.
Complimenti. È stata creata un'immagine per l'app Web ed è stata eseguita l'immagine usando un contenitore Docker.