Skip to content
Blog

Aan de slag met een Custom Mendix Docker image

Laatste update: 11 oktober 2024

Een paar maanden geleden werd mij gevraagd om Low-Coding Mendix IaaS-applicaties te migreren naar Platform-as-a-Service (PaaS)-diensten in de Microsoft Azure Cloud. Doelstellingen waren hoge beschikbaarheid, schaalbaarheid en multi-cloud portabiliteit, zodat ontwikkelaars zich meer kunnen focussen op het genereren van bedrijfswaarde met behulp van de CI/CD pipeline. Verder was een vermindering van het onderhoud van servers en besturingssystemen gewenst.

Nooit was het zo eenvoudig om container-gebaseerde Web Apps voor Linux te implementeren. Je hoeft slechts de images van de docker-container van een privé Azure Container Registry naar een webapplicatie over te zetten. Vervolgens zal deze de gecontaineriseerde app implementeren met jouw voorkeursafhankelijkheden zoals PostgreSQL/MySQL. Zo ga je van opslag naar productie in enkele seconden.blog-johan-afbeelding-1

Sneller en makkelijker schalen

Het platform zorgt automatisch voor OS-patches, capaciteitsbepaling en loadbalancing. Daardoor is het op- of afschalen een kwestie van minuten geworden; dat kan heel eenvoudig met behulp een schuifknop, het oproepen van de REST API, of met de configuratie van automatische schaleringsregels met geautomatiseerde accounts.

Daarom heb ik gekozen voor een Linux Web App voor containers om de Docker Images te bouwen en in containers te plaatsen. Docker is een open-source container-technologie; een zeer schaalbare oplossing, geautomatiseerd voor pipelines (CI/CD).

In dit blog leg ik uit hoe je een Mendix Docker-image bouwt en uitvoert, door de inzet van het ‘Mendix Docker Buildpack’, in combinatie met een aantal afhankelijkheden: Azure Web App voor Containers, Azure PostgreSQL, en Azure Container Registry + Azure Storage (opslag).

Een Mendix Docker-image wordt apart gemaakt voor elke versie-release van de toepassing, door de inzet van een Buildpack met specifieke instellingen. Om zo’n docker image te laten draaien, gebruiken we een Linux Web App. Je kunt ook gebruik maken van een van de volgende Docker containerdiensten, gebaseerd op Azure cloud:

  • Azure Container Services
  • Andere vendors

Blog johan afbeelding 3

VSTS pipeline

Een VSTS Pipleline dient voor de automatisering van de bouw-, test- en stationeringsfases van de applicatieontwikkeling, maar maakt je ook ‘agile’ (wendbaar) op jóúw voorwaarden. Met een VSTS Pipeline verbeter je tevens de samenwerking met andere teams en kun je gebruik maken van een continue integratie- en deployment -pipeline (CI/CD).

Blog johan afbeelding 3

Azure Container

Azure Container Instances maakt het eenvoudig om Docker Containers in Azure aan te maken en te beheren, zonder de inzet van nieuwe virtuele machines. Het is vandaag de dag een van de meest gebruikte technologieën in cloudcomputing om volledig PaaS-gebaseerd te kunnen werken. Door de uitrol in Web Apps voor Containers voegt Azure Container zich met behulp van Azure Autoscaling volledig naar jouw bedrijfsbehoeften.

Azure Web App voor containers & set-up van de architectuur

Web App voor Containers zorgt voor de uitrol van gecontaineriseerde applicaties en de daarvoor benodigde infrastructuur binnen Azure. Wanneer je een container-image naar de Azure Container Registry overzet, kun je deze image toepassen op de Web App voor Containers. Een Docker Container is een geïsoleerd applicatieplatform. Het bevat alles wat nodig is om je toepassing uit te voeren en is gebaseerd op één of meerdere Docker Images. Containers worden gecreëerd vanuit images.

blog johan afbeelding 4

De architectuur kan verschillende vormen aannemen:

  • Een multi-tenant-systeem dat het totale gamma van pricing plans ondersteunt
  • Een App Service Environment (ASE) die in je VNet wordt ingezet.

Zo kan een Linux Web-applicatie bijvoorbeeld geïmplementeerd worden in een app service plan, samen met een Application Gateway (AGW) voorzien van WAF. Een andere manier is het isoleren van de Linux Web App voor Containers binnen een Azure App Service omgeving (ASE). Met deze set-up heb je een geïsoleerde web-applicatie in een Azure virtueel netwerk (VNet) en daarnaast zorg je voor connectiviteit en integratie met het on-premises DC.

Blog johan afbeelding 5

Voor een Azure App Service met afhankelijkheden raad ik je aan om Azure Blob Storage en een database as-a-service (bijv. Azure Database voor PostgreSQL) afzonderlijk te gebruiken voor je gegevensbehoeften. Zo kun je capaciteiten en prestaties op applicatieniveau optimaliseren. Nu kunnen we dus een gecontaineriseerde implementatiearchitectuur opzetten met Microsoft Azure Web App voor Containers.

Blog johan afbeelding 6

Tip: preview Linux op ASE

Let op: Het gaat hier nog steeds om een public preview betreft, namelijk Linux App service plans in de App Service Environment (ASE):
“Je ASE bevat Linux-apps. Linux op ASE staat in preview-modus en wordt niet ondersteund voor productie workloads.”
Test de mogelijkheden en profiteer van de uitrol van applicaties in een VNet voor beveiligde netwerktoegang, om zo een website/applicatie te isoleren voor enkel intern gebruik. Daarnaast kun je op deze manier een App Service achter een WAF-geactiveerde Applicatie Gateway laten draaien. Ik heb het zelf getest en het werkt probleemloos in mijn testopstelling.

Aan de slag met Docker op Azure Web App

Starten met Mendix app op Azure Web App voor containers is heel eenvoudig. In deze demo maak je een Custom Docker Image in een Azure Container Registry, om deze vervolgens samen met een aantal noodzakelijke variabelen te implementeren in een Web App.

Aanmaken van de Azure Container Registry

  1. Selecteer ‘Create a resource’ > Containers > Azure Container Registry.
  2. Voer waarden in voor Registry name en Resource group.
  3. SKU: Meer informatie over de functies en beperkingen van de Basic, Standard en Premium service tier kun je lezen op de Microsoft-site. Voorlopig is ‘Basic’ voldoende.
  4. Onder Admin User selecteer je ‘Enable’. Maak een username & access key aan om de container te beheren.

Aanmaken van de App Service ‘Web Apps’ in Linux

  1. Zoek op de Marketplace in het Azure Portal naar ‘Web App op Linux’ en klik op ‘Create’ (creëer) in het blad dat verschijnt.
  2. Voer de App-naam en de Resource Group in en selecteer een App Service Plan gebaseerd op Linux om de Web App op Linux aan te maken.

De Web Apps op Linux worden nu uitgerold. Dit kan enkele minuten duren.

 

Vind en download de nieuwste Docker logs via Kudu & Azure Portal

De docker logs tonen informatie die is gelogd door de werkzame container in de Web App. Microsoft heeft een API waarmee je de huidige Docker loggegevens kunt zien. Je kunt de laatste Docker logs (Zip-formaat) ook downloaden om ze verder te onderzoeken (https://[site].scm.azurewebsites.net/api/logs/docker).

In de Azure Web App vind je deze links, onder ‘Development tools’ > Advanced Tools > Klik op GO. Onder Rest API download je de meest recente Docker logs (Download als Zip).

Microsoft stelt je ook in staat om de laatste items in de portal zelf in te zien. Klik bij de instellingen op ‘Container settings’ en je ziet de loggegevens van de container. Deze logbestanden kun je downloaden en kopiëren (zie afbeelding hieronder). Na het instellen van de basissettings kunnen we nu verder gaan met het uitrollen van Visual Studio Team Services VSTS.

blog johan afbeelding 8

Continue integratie en inzetmogelijkheden (CI/CD)

Ik heb het CI/CD-aspect van een implementatie geëlimineerd om je te laten zien hoe je een gecontaineriseerde applicatie rechtstreeks in je Visual Studio (VSTS) kunt bouwen en van daaruit kunt publiceren naar een Azure App Service via Azure Container Registry.

blog johan afbeelding 9

blog johan afbeelding 10

De bovenstaande afbeeldingen laten de workflow voor de Azure Resources zelf zien. In de demovideo zie je de globale inzet van een compleet project, waarbij de opslaglocatie direct van een Subversion stamt, bedoeld voor broncontrole met VSTS. Lokale VSTS git is ook mogelijk, maar daarvoor moeten de projectbestanden handmatig geüpload worden. Indien nodig kun je extra stappen instellen zoals goedkeuringen en triggers.

  • Uitrol
    • Code + App bestanden uit externe opslagplaats
    • Bouw versie (Build)
    • Vrijgave (Release)
    • Variabelen
    • Image overbrengen naar Azure Container Registry
    • Update Web App voor Containers met parameters die gebaseerd zijn op de meest recente versie-ID/Docker Image tag.

Om te voldoen aan de vereisten voor de inzet van resources op Azure middels VSTS, als onderdeel van CI/CD proces, moet je verbinding maken met Azure en ervoor zorgen dat je de juiste rechten hebt om die resources te beheren. De standaardinstelling is de set-up/configuratie van een client-key met de Azure AD App. De authenticatiemethode die wordt ondersteund door het Azure portaal is een Client ID + secret key. Dit maakt echter geen deel uit van deze blog; zie deze LINK voor meer info om een Azure AD App-registratie aan te maken.

In deze demo gebruik ik slechts een aantal taken en eventueel moeten delen toegevoegd worden vanuit de Marketplace:

  • Shell exec (Build)
  • Docker (Build & Push)
  • Azure App Service Deploy (Release)
  • Variabelen toepassen op de website (Release)

#Shell Script voor de download van Mendix Docker Build Pack (onderdeel van de ‘build pipeline’)

wget https://github.com/mendix/docker-mendix-buildpack/archive/master.zip
unzip master.zip
mv docker-mendix-buildpack-master/* .
rm -R docker-mendix-buildpack-master

# Image TAG voor Azure Container Registry & hergebruik van de TAG voor het updaten van de Web App

$(Build.BuildNumber)

#Build Arguments
BUILD_PATH=trunk

#Image Name (DEMO = repository in Azure Container Registry)
DEMO:$(Build.BuildId)

Tip: VSTS agent capabilities

Wanneer je de agent-hosted Linux preview met de standaardinstellingen gebruikt, kan het zijn dat je een foutmelding krijgt. In de systeemmogelijkheden wordt de instelling svn- /usr/bin/subversion niet standaard toegevoegd aan de agent image. Voeg nieuwe gebruikersmogelijkheden toe: svn- /usr/bin/subversion

Elke agent heeft een set van mogelijkheden/opties die aangeven welke functies die agent kan leveren. Mogelijkheden zijn naam-waarde-paren, die ofwel automatisch worden ontdekt door de agent-software, waarbij deze ‘systeemmogelijkheden’ (system capabilities) worden genoemd, ofwel naam-waarde-paren die je zelf definieert; dan worden ze ‘gebruikersmogelijkheden’ (user capabilities) genoemd.

Conclusie

De inzet van containers op Azure Web Apps voor Containers is een geweldige ervaring. We hebben met succes een gecontaineriseerde applicatie met behulp van Azure Web Apps voor Containers geïmplementeerd in een Azure App Service Plan. In de preview kun je deze implementeren in de App Service omgeving (ASE), en tevens een continue uitrol-pipeline voor de applicatie inzetten (in mijn geval een Low Coding Mendix App). Je hebt geen specifieke kennis nodig met betrekking tot clusters etc. Je kunt een Azure-applicatie-gateway vóór jouw lijn creëren, waarmee je een Azure Web App-service als back-end pool-onderdeel kunt hebben, inclusief WAF- en SSL-offloading om de web-applicatie en -toepassing te beschermen.blog-johan-afbeelding-13-768x383

Door de integratie van Docker Image en de gezamenlijke strategische investeringen om container-technologie vooruit te stuwen, is Docker een open-source ‘motor’ geworden waarmee de implementatie van elke toepassing geautomatiseerd kan worden als een draagbare, zelfvoorzienende container die bijna overal kan draaien. Door partnerschappen kunnen we de Docker-client doorontwikkelen en in staat stellen om multi-containertoepassingen te beheren met behulp van zowel Linux- als Windows Server-containers, ongeacht de hosting-omgeving of cloudprovider. Het is goed om te zien dat “Microsoft ♥ Linux”.

De inzet van containers in Azure is nu eenvoudiger dan ooit!