Docker containers
Introduktion
I denne artikel vil jeg gå i dybden med docker. Jeg vil lære hvordan man benytter containerization med Docker og beskrive hvordan man praktisk opretter en container.
Hvad er en docker container?
En Docker container er et isoleret miljø som kan virtualisere applikationer. Tænk på det som en selvstændig pakke der indeholder alt hvad en applikation har brug for, såsom kode, runtime, system biblioteker osv. Det er lidt som en mini version af et operativ system, men skræddersyet til en specifik applikation.
Før Docker?
Før Docker containere arbejdede man med virtualisering ved at downloade et hypervisor såsom Virtualbox hvorpå man installerede det miljø med det styresystem som man ville teste på. Denne proces tog meget lang tid og det er meget ressourcekrævende for et udvikler team som skal nå sine deadlines. Derudover var der også er verdenskendt problemstilling som lød: "Det virker på min maskine". Mange testere har oplevet at skulle teste noget software som af den ene eller anden årsag ikke virkede på testerens maskine, men kun på udviklerens. Dette kan være grundet manglende dependencies og med Docker bliver alle dependencies, pakker, operativsystem og alt hvad som skal til for at få applikationen til at virke med i containeren.
Hvorfor er Docker så smart?
Hver container kører isoleret fra andre containere og hosten. Hvilket betyder, at en fejl i en container ikke påvirker andre containere.
En container kan køre på næsten alle maskiner, som har Docker installeret. Derfor er det nemmere at flytte applikationer mellem forskellige maskiner.
Containere deler processer med hosten, så de er mere effektive end traditionelle virtuelle maskiner. Traditionelle virtuelle maskiner skal man vælge hvor mange ressourcer som de optager 100% af, imens den virtuelle maskine er tændt. På en docker container kan man dog afgrænse hvor mange ressourcer den kan bruge.
Med alt ovenstående taget i betragtning, vil man kunne bygge backend i C# og frontend i react så længe de kommunikerer igennem en API. Så man på den måde nemmere kan gøre brug af ens teams forskellige styrker. I tilfælde af høj trafik på backend af applikationen kan man duplikere backend containerne og fordele belastningen med en loadbalancer. Og hvis der opstår en fejl i foreksempel backend containeren, så vil frontenden umiddelbart stadig vises til brugeren. Det giver udviklere en masse fordele.
Hvad er forskellen på et docker image og en docker container?
Et docker image er en slags arkitekttegning af applikationen og det operativ system som skal kører i containeren. Et docker image oprettes med en dockerfil, der skriver de tekniske specifikationer for miljøet applikationen skal kører i, inde i den container som kommer til at kører det.
Hvordan kan to eller flere containere kommunikere?
Netværk: Docker containere kan konfigureres til at kommunikere med hinanden på forskellige måder, ved hjælp af port mapping såfremt at de er på samme netværk, alternativt.
Registries
Et Docker registry er en tjeneste til lagring og distribution af Docker images. Det mest kendte registry er https://hub.docker.com/ (opens in a new tab), men man kan også opsætte private registries. Registries gør det muligt at dele images mellem forskellige brugere.
Orchestration
Orchestration refererer til styring og koordinering af flere containers i en distribueret applikation. Orchestration værktøjer som Kubernetes, Docker Swarm og Apache Mesos hjælper med at automatisere deployment, skalering og styring af container applikationer. De håndterer opgaver som loadbalancing, service discovery, og selvhelbredelse af applikationer.
En dockerfil kan se ud som følger:
# Use the official ASP.NET Core runtime as a parent image
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 80
# Use the official ASP.NET Core SDK image to build the app
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["MyAspNetApp/MyAspNetApp.csproj", "MyAspNetApp/"]
RUN dotnet restore "MyAspNetApp/MyAspNetApp.csproj"
COPY . .
WORKDIR "/src/MyAspNetApp"
RUN dotnet build "MyAspNetApp.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MyAspNetApp.csproj" -c Release -o /app/publish
# Use the base image to run the app
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyAspNetApp.dll"]
Forklaring
- Base Image:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
: Bruger det officielle ASP.NET Core runtime image som base image.WORKDIR /app
: Sætter arbejdsbiblioteket til/app
.EXPOSE 80
: Eksponerer port 80 for at tillade trafik til containeren.
- Build Stage:
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
: Bruger det officielle ASP.NET Core SDK image til at bygge applikationen.WORKDIR /src
: Sætter arbejdsbiblioteket til/src
.COPY ["MyAspNetApp/MyAspNetApp.csproj", "MyAspNetApp/"]
: Kopierer projektfilen til containeren.RUN dotnet restore "MyAspNetApp/MyAspNetApp.csproj"
: Kørerdotnet restore
for at hente afhængigheder.COPY . .
: Kopierer resten af applikationskoden til containeren.WORKDIR "/src/MyAspNetApp"
: Skifter arbejdsbiblioteket til projektmappen.RUN dotnet build "MyAspNetApp.csproj" -c Release -o /app/build
: Bygger applikationen i release mode og outputter til/app/build
.
- Publish Stage:
FROM build AS publish
: Starter en ny stage baseret på build-stagen.RUN dotnet publish "MyAspNetApp.csproj" -c Release -o /app/publish
: Publicerer applikationen i release mode og outputter til/app/publish
.
- Final Stage:
FROM base AS final
: Starter en ny stage baseret på base-stagen.WORKDIR /app
: Sætter arbejdsbiblioteket til/app
.COPY --from=publish /app/publish .
: Kopierer de publicerede filer fra publish-stagen til det endelige image.ENTRYPOINT ["dotnet", "MyAspNetApp.dll"]
: Sætter entrypoint til at køre applikationen ved hjælp afdotnet MyAspNetApp.dll
.
Reflektion
Der er mange fede features ved Docker. Næsten alle cloud udbydere kan modtager en applikation som er pakket i en container med Docker og dermed bliver deployet. Det kan være en kæmpe fordel for Maersk Air Cargo hvis der vil være behov for at skifte til cloud hosting eller flytte cloud hosting udbyder. Men for selve udviklingsprocessen kan det også være en fordel hvis udviklere sidder på forskellige lokationer i forhold til at sikre at applikationen altid har de fornødne biblioteker og andre dependencies.
Kilder:
https://aws.amazon.com/compare/the-difference-between-docker-images-and-containers/ (opens in a new tab) https://www.docker.com/resources/what-container/ (opens in a new tab)
https://learn.microsoft.com/en-us/training/modules/intro-to-docker-containers/ (opens in a new tab)