Övning – Anpassa en Docker-avbildning för att köra din webbapp

Slutförd

En Dockerfile innehåller stegen för att skapa en anpassad Docker-avbildning.

Du bestämmer dig för att distribuera en av organisationens webbappar med Docker. Du väljer en enkel webbapp som implementerar ett webb-API för en webbplats för hotellbokningar. Webb-API:et exponerar HTTP POST- och GET-åtgärder som skapar och hämtar kundernas bokningar.

Kommentar

I den här versionen av webbappen sparas inte bokningarna och frågor returnerar dummydata.

I den här övningen ska du skapa en Dockerfile för en app som inte har någon. Sedan kan du skapa avbildningen och köra den lokalt.

Skapa en Dockerfile för webbappen

  1. Om den inte redan körs startar du Docker på datorn.

  2. I Cloud Shell-fönstret till höger kör du följande kommando för att ladda ned källkoden för exempelwebbappen.

    git clone https://github.com/MicrosoftDocs/mslearn-hotel-reservation-system.git
    
  3. Ange följande kommando för att öppna src katalogen.

    cd mslearn-hotel-reservation-system/src
    
  4. I katalogen src anger du följande kommandon för att skapa en ny fil med namnet Dockerfile och öppna den i Anteckningar:

    copy NUL Dockerfile
    notepad Dockerfile
    

    Kommentar

    Som standard öppnar kommandot anteckningar en textfil. Se till att du sparar den som filtyp Alla filer utan filnamnstillägg. Kontrollera genom att öppna mappen src i Utforskaren och välja Visa filnamnstillägg>>. Om det behövs byter du namn på filen och tar bort .txt från filnamnet.

  5. Lägg till följande kod i 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"
    

    Den här koden har kommandon för att hämta en avbildning som innehåller .NET Core Framework SDK. Projektfilerna för webbappen (HotelReservationSystem.csproj) och biblioteksprojektet (HotelReservationSystemTypes.csproj) kopieras till mappen /src i containern. Kommandot dotnet restore laddar ned de beroenden som krävs av dessa projekt från NuGet.

  6. Lägg till följande kod längst ned i Dockerfile:

    COPY . .
    WORKDIR "/src/HotelReservationSystem"
    RUN dotnet build "HotelReservationSystem.csproj" -c Release -o /app
    

    Dessa kommandon kopierar källkoden för webbappen till containern och kör sedan kommandot dotnet build för att skapa appen. De resulterande DLL-filerna skrivs till mappen /app i containern.

  7. Lägg till följande kommando längst ned i Dockerfile.

    RUN dotnet publish "HotelReservationSystem.csproj" -c Release -o /app
    

    Kommandot dotnet publish kopierar de körbara filerna för webbplatsen till en ny mapp och tar bort eventuella mellanliggande filer. Filerna i den här mappen kan sedan distribueras till en webbplats.

  8. Lägg till följande kommandon längst ned i Dockerfile.

    EXPOSE 80
    WORKDIR /app
    ENTRYPOINT ["dotnet", "HotelReservationSystem.dll"]
    

    Det första kommandot öppnar port 80 i containern. Det andra kommandot flyttas till mappen /app som innehåller den publicerade versionen av webbappen. Det slutliga kommandot anger att containern ska köra kommandot dotnet HotelReservationSystem.dllnär den körs. Det här biblioteket innehåller den kompilerade koden för webbappen.

  9. Spara filen och stäng redigeringsprogrammet. Se till att du sparar den som filtyp Alla filer utan filnamnstillägg.

Skapa och distribuera avbildningen med hjälp av Dockerfile

  1. I kommandotolken kör du följande kommando för att skapa avbildningen för exempelappen som använder Dockerfile. Glöm inte . i slutet av kommandot. Med det här kommandot skapas avbildningen och det lagras lokalt. Avbildningen får namnet reservationsystem. Kontrollera att avbildningen har skapats. En varning om fil- och katalogbehörigheter visas när processen är klar. Du kan ignorera varningarna för den här övningen. Avbildningen kan ta en stund att skapa.

    docker build -t reservationsystem .
    
  2. Kör följande kommando för att kontrollera att avbildningen har skapats och lagrats i det lokala registret:

    docker image list
    

    Avbildningen får namnet reservationsystem. Du har också en avbildning med namnet microsoft/dotnet:

    REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
    reservationsystem   latest              d2501f0f2ced        About a minute ago   1.76GB
    

Testa webbappen

  1. Ange följande kod för att köra en container med hjälp av avbildningen reservationsystem . Docker returnerar en lång sträng med hexsiffror. Containern körs i bakgrunden utan något användargränssnitt. Port 80 i containern mappas till port 8080 på värddatorn. Containern heter reservations.

    docker run -p 8080:80 -d --name reservations reservationsystem
    
  2. Öppna en webbläsare och gå till http://localhost:8080/api/reservations/1. Du bör se ett JSON-objekt som innehåller data för reservationsnummer 1 som liknar följande utdata:

    Screenshot of the hotel reservations system web app running in a browser.

    Ersätt "1" i slutet av localhost-URL:en med ett annat reservationsnummer, till exempel 2 eller 20, för att visa motsvarande reservationsinformation.

  3. Kör följande kommando för att visa containerns status:

    docker ps -a
    

    Utdata visar följande för alla tillgängliga containrar:

    • CONTAINER-ID
    • AVBILDNING
    • KOMMANDOT
    • SKAPAD tid
    • STATUS
    • PORTAR
    • NAMN

    Kontrollera att containerns STATUS är Upp.

    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
    
  4. Ange följande kommando för att stoppa reservationscontainern:

    docker container stop reservations
    
  5. Ta bort containern reservations från det lokala registret.

    docker rm reservations
    
  6. Låt reservationsystem vara kvar i det lokala registret. Du använder den här bilden i nästa övning.

Gratulerar! Du har skapat en avbildning för webbappen och du har kört den med en Docker-container.