Versimpel het gebruik van je VM-applicaties met Docker in Azure Container Instances

IT-ROCKSTAR BART KOOIJMANS

Introductie

De afgelopen jaren heb ik gewerkt met Docker en Microsoft Azure en ik wil mijn ervaring delen in combinatie met Microsoft Azure. Stel je hebt een Virtuele Machine met een service of tool erop. Met de hand kun je er heel makkelijk één aanmaken en daar de juiste installatie van configureren. Wil je meer power gaan gebruiken dan kun je er met wat tijd ook wel twee, drie, vier of vijf Virtuele Machines van maken. Maar dan begint je geweten te wringen. Hoe ga ik om met updates? Kan ik tijdelijk meer of juist minder machines gebruiken? Hoe automatiseer ik dit? 

Dit is het punt waarbij Docker handig begint te worden. Je maakt één container die de hele Virtuele Machine installatie en configuratie bevat en die gebruik je overal. Op de laptop van de ontwikkelaar, op de testomgeving van de tester en in de geautomatiseerde build & release pipeline. Als je namelijk eenmaal een Docker image hebt, kun je die overal en zoveel je wilt uitrollen. En het mooie is dat de ontwikkelaar en productie tegen exact hetzelfde aan kijken. 

Hoe maak je een Docker container? 

Een Docker container maak je met een Dockerfile. Een Dockerfile beschrijft het 'systeem' waar je applicatie in draait. Heb je Windows of Linux? Wat is de working directory? Wat moet je configureren op het systeem? 

Met een .Net Console Application kun je makkelijk upgraden naar een Docker container met Visual Studio. In 'Solution Explorer', open het contextmenu van je project. Kies 'Add', vervolgens 'Container Orchestrator Support' en vervolgens 'Docker Compose'. Dit voegt automatisch een Dockerfile toe aan je project. 

Voorbeeld Dockerfile:  


FROM microsoft/dotnet-framework:4.7.2-runtime-windowsservercore-1803 

ARG source 

WORKDIR /app 

COPY ${source:-obj/Docker/publish} . 

ENTRYPOINT ["C:\\app\\ConsoleApp1.exe"] 

Hier wordt een Windows systeem beschreven dat de app .dll's en .exe kopieert naar C:\app op het systeem. 

Er wordt ook een 'docker-compose.yml' toegevoegd aan het project. Dit zorgt ervoor dat de Dockerfile gebouwd wordt als je het project bouwt.  

Om een Docker container te kunnen bouwen moet je Docker Desktop installeren op je PC. Dit zorgt voor de juiste tools om lokaal met Docker te kunnen werken. Onderdeel hiervan is de Docker CLI (Command Line Interface) waarmee je al het Docker werk zelf kunt aansturen. Alles in Docker is bereikbaar via het 'docker' command. 

Het bouwen van de Docker container kun je in een Powershell window oproepen met 'docker build .' in de map waar je Dockerfile staat. 

Visual Studio integreert op een soepele manier met de Docker CLI. Bouw het project maar eens in de Release configuration in Visual Studio. In de build output zie je de Docker build voorbijkomen. Visual Studio roept hier onder water het 'docker build .' commando aan. 

Output van de Docker build in Visual Studio: 


1>Building consoleapp1 

1>Step 1/5 : FROM microsoft/dotnet-framework:4.7.2-runtime-windowsservercore-1803 

1> ---> 4d6783fded25 

1>Step 2/5 : ARG source 

1> ---> Using cache 

1> ---> cac22874d814 

1>Step 3/5 : WORKDIR /app 

1> ---> Using cache 

1> ---> da5a93886856 

1>Step 4/5 : COPY ${source:-obj/Docker/publish} . 

1> ---> Using cache 

1> ---> 031b55715211 

1>Step 5/5 : ENTRYPOINT ["C:\\app\\ConsoleApp1.exe"] 

1> ---> Using cache 

1> ---> 1a682f6372d7 

1>Successfully built 1a682f6372d7 

1>Successfully tagged consoleapp1:latest 

========== Build: 1 succeeded, 0 failed, 1 up-to-date, 0 skipped ========== 

Je kunt de nieuwe Docker app lokaal runnen met 'docker run --rm <imageid>', waarbij je het imageid uit de Docker build output krijgt. Dit zorgt ervoor dat de Docker container lokaal geladen wordt en de default app in die container gestart wordt. In de Dockerfile zie je bij 'entrypoint' dat de nieuwe app automatisch gestart wordt. 

Draai de Docker container in de cloud

Nu je de applicatie in een Docker container hebt draaien kun je de container eenvoudig in de cloud draaien. Een Docker container is een generiek ‘uitwisselingsformaat’ dat werkt in Google Cloud, Amazon AWS of Microsoft Azure. Ik zal even inzoomen op de mogelijkheden binnen Microsoft Azure. 

De ingang voor Docker in Azure gaat via een Azure Container Registry. Dit is een soort private DockerHub gehost in Azure van waaruit je de container kunt integreren in Azure services. De Azure Container Registry werkt als een soort versiebeheersysteem en je maakt hem zelf aan in jouw Azure Subscription.  

Je uploadt de Docker container naar een Azure Container Registry als volgt. Eerst moet je de lokale Docker container koppelen aan de Azure Container Registry. Deze koppeling wordt ook wel een ‘tag’ genoemd in Docker. 


docker tag consoleapp1:latest myacr.azurecr.io/consoleapp1:latest

Na de ‘tag’ is de Docker container klaar om te uploaden. Vergelijkbaar met een versiebeheersysteem voor programmacode wordt dit proces ‘push’ genoemd. 


docker push myacr.azurecr.io/consoleapp1:latest

Je kunt de Docker container nu terugvinden in de Azure Container Registry in de Azure portal bij 'repositories'. Nu is de Docker container vindbaar in de Azure cloud en kun je hem gaan uitrollen via een Azure service. 

Een Docker container kun je draaien in een rekencluster in Kubernetes of Azure Batch. Azure Functions hebben support om Linux containers te draaien. En ten slotte heb je ook support in App Service om je website als container te hosten. Maar een veel instapvriendelijkere variant is Azure Container Instances. Hier kun je een Docker container als het ware op een kant en klare Virtuele Machine draaien. Het is de ideale opstap om de Docker container naar de cloud te brengen. 

De Azure Container Instance is vooral heel handig als je geen schaalbaarheid nodig hebt, maar gewoon één instantie van je applicatie. Als vervolgstap zou je Azure Batch kunnen gebruiken als je wel schaalbaarheid nodig hebt. Nog meer controle en mogelijkheden heb je met Kubernetes waarin je naast schaalbaarheid ook infrastructuur kunt definiëren. In dit artikel houd ik het bij Azure Container Instances. 

Alle configuratie kun je doen in de Azure portal. Vanuit de repository van de Azure Container Registry kun je rechtstreeks op de Docker container rechtsklikken en kiezen voor 'run instance'. Je kunt ook een nieuwe resource maken en kiezen voor de Azure Container Instance resource. In beide gevallen refereer je naar de locatie van je Docker container in de Azure Container Registry. Je kiest Windows of Linux, CPU en geheugen en je bent al klaar. 

Een Azure Container Instance deployment is nog vrij rijk aan functionaliteiten in de Azure portal. Ten eerste kun je de events bekijken. Hier zie je wanneer je Instance gestart en gestopt is. 

 

Je kun de eigenschappen en environment variables bekijken bij de properties. 

 

De logs van de Azure Container Instance kun je inspecteren. 

 

Ten slotte kun je zelfs inloggen op die Azure Container Instance via de Azure portal en 'rondwandelen' op die machine als ware het een ssh connectie met een VM. Het is geen volwaardige RDP sessie, maar zoals bij servers het meer gebruikelijkere command prompt. 

 

Conclusie

Qua functionaliteit doet de Azure Container Instance niet onder voor een 'ouderwetse' Virtuele Machine met een ssh connectie. In de Azure portal heb je beschikking over de logs, je kunt de terminal openen, configuratie bekijken en de 'machine' inspecteren.  

Azure regelt de OS updates en monitort de resources. Je hebt het gebruiksgemak van een Virtuele Machine in combinatie met handige abstractie van Azure. "Virtual Machine as a service" zou ik zeggen!