#Utveckling & Arkitektur

Komma igång med Docker container

I ett tidigare blogginlägg skrev vi lite om varför man vill använda containers. Den här gången tänkte vi gå igenom hur vi skapar en enkel webbapplikation i .Net Core och sedan kör den i en Docker container lokalt på din dator.

Förberedelser

För att kunna följa med i de kommande stegen så behövs lite förberedelser.
För att skapa applikationen behöver du .NET Core SDK installerat.
Och för att sedan kunna köra containern så behöver du också Docker installerat.

tva_utvecklare_en_dator

Skapa en enkel webbapplikation

Vi vill skapa en ASP.NET Core webbapplikation som vi sedan kan köra inuti en container. Containerteknologin vi använder i följande exempel är baserade på docker, vilket är de facto standard idag för att köra containers. Med alla förberedelser på plats, kan du från en terminal köra följande kommando:
dotnet new webapp --name Agero.Docker.AspNetCore

Det kommer skapa ett ASP.NET Core webbapplikationsprojekt kallat Agero.Docker.AspNetCore som ligger i en katalog med samma namn. Testa nu att applikationen fungerar genom att köra följande kommando:
dotnet run --project Agero.Docker.AspNetCore

Nu kan du besöka webbapplikationen genom att öppna en webbläsare och gå till
http://localhost:5000 och se att allt fungerar. Du borde se en enkelt hemsida med texten "Welcome".

För att stoppa applikationen så trycker du Ctrl+C i kommandofönstret
Bakom kulisserna har nu applikationen både byggts med hjälp av .NET Core SDK och därefter startats av .NET Core Runtime. Nu vill vi få samma applikation att köras inuti en container. För att lyckas med detta måste vi få containern att innehålla både den byggda applikationen och .NET Core Runtime. Applikationen kan vi tänka oss att vi ganska enkelt skulle kunna kopiera efter att ha byggt på vår lokala maskin. Men hur får vi med oss .NET Core Runtime, vilka filer och inställningar måste vi få med för att det ska fungera?

Förbereda vår webapplikation för en container 

För att köra en Docker-container behöver vi en image att instansiera. För att bygga en egen image utgår man alltid från en annan image. Man kan utgå från en färdig image lokalt eller från Docker Hub (lite som Nuget.org för NuGet-paket). På Docker Hub kan vi hitta färdiga image:ar som innehåller .NET Core Runtime. Till exempel kan vi välja image mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim. Det är en image som innehåller .NET Core Runtime och som är optimerad för att köra ASP.NET Core-applikationer. Buster-slim indikerar att den i sin tur bygger på en image med samma namn. Buster är namnet på Debian 10 och innebär här att miljön kommer likna en Debian 10 miljö sett till vilka beroenden som finns tillgängliga. Nu vill vi bygga vår webbapplikation så att vi får ut bara de filer vi behöver för att kunna köra applikationen. Det kan vi köra genom att köra följande kommando ifrån katalogen som innehåller projektfilen Agero.Docker.AspNetCore.csproj:
dotnet publish --configuration Release --output publish

I katalogen publish finns nu applikationen redo att köras.

Bygga vår egen image

Nu vill vi ta det som ligger i vårt publish-katalog och skapa vår image. För att göra det börjar vi med att skapa en så kallad Docker-fil.

Skapa en fil med namnet Dockerfile (utan någon filändelse) i projektmappen. I filen så skriver vi följande:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim
WORKDIR /app
COPY publish .
EXPOSE 80
ENTRYPOINT ["dotnet", "Agero.Docker.AspNetCore.dll"]

Detta är instruktioner till framförallt vad som ska hända när vår image ska byggas och i viss mån vad som ska hända när man startar en container från den här imagen. Första raden säger att vi vill utgå från image mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim som bas för bygget av vår image. Nästa rad instruerar till att ändra till (och skapa) katalogen app i roten av filsystemet inuti imagen. Tredje raden kopierar innehållet i katalogen publish där vår webbapplikation ligger till nuvarande katalog i imagen (d.v.s. /app). Nästa rad tydliggör att vi vill exponera port 80 inifrån vår tänkta container till omvärlden. Sista raden definierar vilket kommando som ska köras som standard när en container körs från den här imagen.
Nu vill vi faktiskt bygga vår image. För att göra det kör vi följande kommando:

docker image build --tag agero-docker-aspnetcore:1.0 .

Detta bygger vår image med namnet agero-docker-aspnetcore:1.0.

Köra vår container

Vi kan nu starta vår image som en container genom att köra kommandot:
docker run -it --rm -p 8080:80 agero-docker-aspnetcore:1.0

Ovanstående kommando beskriver hur vi vill köra vårt container.

-it: Kopplar ihop konsolen med containern vilket gör att vi kan interagera med containern medan den körs
--rm: gör att containern tas bort när den avslutas
-p 8080:80: Kopplar ihop port 8080 på din dator med port 80 i containern. Port 80 var den port som vi valde att exponera i vår dockerfil.

Nu kan du besöka webbapplikationen som körs inuti containern på http://localhost:8080.

För att stoppa containern så trycker du Ctrl+C i kommandofönstret

Detta är möjligen den enklaste Docker-filen att använda för att få vår applikation att köras i en container. Tittar man på exemplen från Docker och Microsoft, så visar de att det går att göra mycket mer saker i sina Docker-filer. Dels bygger man applikationen som en del av att bygga imagen, istället för att publicera projektet lokalt som vi har gjort.

Vill du veta mer får du gärna kontakta oss.

Publicerad: 2020-06-23