Actualiteit

Op avontuur met Docker

Docker is een opensource technologie om applicaties slim en onafhankelijk in een container te verpakken en te deployen. Veel organisaties omarmen deze technologie, en aangezien wij als Qquest de beste technologieën in onze werkzaamheden willen integreren, zijn wij ook aan de slag gegaan met het ontdekken van de mogelijkheden van Docker.

Wat doet Docker?

Docker is een technologie die het mogelijk maakt om een snapshot te maken van een systeem (met installaties en al) en deze in te pakken in een zogenaamde container.
Stel je voor: je hebt een computer met daarop alle programma’s die je nodig hebt om te ontwikkelen. Bijvoorbeeld: (een versie van) Linux, Git, python, java en je code-editor. Als je dit laat inpakken door Docker (in een image), kan je het hele pakket draaien op een andere computer (als een container) wat een heleboel installatie en configuratie bespaart.

Deployen met Docker

Voor het deployen van applicaties geeft Docker veel mogelijkheden. Bij het deployen is het van belang dat een applicatie met de juiste dependencies wordt uitgerold. Vaak is het daarbij nodig om specifieke versies van programma’s te gebruiken. Ook moet de omgeving zo gelijk mogelijk zijn aan de ontwikkel- en testomgevingen. Docker images bieden mogelijkheden om de omgeving waarin gedeployed wordt ‘vast te leggen’. Het is daarmee mogelijk om specifieke versies te gebruiken en de omgeving op verschillende plekken hetzelfde te houden.
Naast het stabiel houden van de omgevingen biedt Docker de mogelijkheid om meerdere omgevingen neer te zetten op één server. Zo kan er op één server een container draaien met daarin een React app, terwijl daarnaast een container met een Python applicatie draait. Beide met hun eigen specificaties van omgevingen en dependencies.

De droplets van Qquest

We maken gebruik van een verschillende hostingproviders voor verschillende services. Bij DigitalOcean hebben wij een aantal droplets draaien, DigitalOcean’s naam voor vps (virtual private server). Op deze machines draaien verschillende oplossingen:

  • Het Intranet van Qquest
  • Diverse applicaties van ons Data-team
  • SonarQube code analyse tool
  • De assessment-applicatie die gebruikt wordt bij de selectieprocedure

Daarnaast gebruiken we één algemene droplet waar onze Gitlab-runners op draaien, alsook containers voor Grafana (monitoring applicatie), exporters (data t.b.v. monitoring) en Nginx (webserver en redirect/proxy functionaliteiten).
Bij Qquest worden wekelijks nieuwe ideeën gepitcht, ontworpen en gebouwd, wat meer dan eens leidt tot wildgroei van droplets: iedere nieuwe applicatie krijgt een eigen droplet. Dit levert onnodige kosten op. Hier biedt Docker ons een oplossing.

Méér containers

Een voorbeeld is onze informatie-slideshow applicatie die draait op grote schermen op ons hoofdkantoor. Dit is een eenvoudige React-app die draait op een losse droplet. Waarom zouden we deze niet draaien als container op onze algemene droplet?

Actiepunt: containerisation

De informatie-slideshow applicatie is een mooie eerste stap om onze eigen applicaties om te zetten naar deployable images. Om dit voor elkaar moeten we een aantal stappen doorlopen:

  • Een image maken van de applicatie (incl. alle benodigde dependencies) en deze als container draaien (lokaal)
  • De Gitlab-pipeline aanpassen zodat deze:
    • De image bouwt en upload naar de registry van het project
    • De image pulled naar onze algemene droplet en daar start

Het maken van de image

Het maken van een image van een React applicatie is relatief simpel. We definiëren een Dockerfile in de root folder van de applicatie en draaien deze middels het Docker build commando. In de Dockerfile staat gedefinieerd welke image als basis gebruikt wordt, in ons geval de latest node image, gratis te downloaden van Docker Hub. Hier kopiëren wij de package.json in met onze dependencies. Vervolgens draaien we npm install.

Dockerfile_Qquest

Wat hier opvalt is de ‘exit 0’. Deze hebben we toegevoegd omdat het npm install command soms zorgt voor afwijkende error codes die lokaal niet tot problemen leiden, maar onze pipeline in Gitlab afbreekt. Door ‘exit 0’ toe te voegen worden afwijkende errors die door npm install gegooid worden, genegeerd en kan de pipeline doorgaan. Hierdoor lopen we wel het risico dat echte errors ook genegeerd worden, waardoor het des te belangrijker is om npm errors (en het liefst ook warnings) op te lossen voordat we overgaan op deployment.
Na het installeren van de dependencies kopiëren we pas de hele applicatie. Dit levert voordelen op bij de caching: als er geen wijzigingen gedaan zijn aan de dependencies en enkel code wijzigingen zijn doorgevoerd, kan Docker de vorige image hergebruiken en hoeft npm install niet opnieuw te worden uitgevoerd.
In de volgende ‘stage’ wordt een nieuwe base-image gepulld, Nginx. Nginx heeft enkel de html en javascript files nodig op de juiste plek om te deployen. Zo blijft de image die gedeployed wordt lightweight en zal hij weinig impact hebben op de server waar hij op draait.

De deployment pipeline

Om te deployen maken we gebruik van Gitlab, de Gitlab-registry en Ansible. Bij het pushen van commits naar Gitlab wordt de pipeline getriggerd door de gitlab-ci.yml file in de root van het project. In deze pipeline wordt ook een Ansible playbook uitgevoerd, waarin de volgende stappen worden doorlopen:
Role: build-and-push-image

  • Connectie maken naar onze droplet
  • Kopiëren van de benodigde files vanuit Gitlab naar de droplet
  • Inloggen in de Gitlab-registry van het project
  • Builden en pushen van de image

Role: deploy-client

  • Verwijderen van de huidige container
  • Pull image
  • Start container

Op deze manier wordt de nieuwe versie van de informatie-slideshow applicatie gedraaid op de gemeenschappelijke droplet en kan de eigen droplet voor deze applicatie definitief uitgeschakeld worden.

Toekomst: Kubernetes?

Het containerizen van de informatie-slideshow applicatie was een mooi concreet en afgebakend project. Met het volgende project gaan we meer stappen zetten: de client, API’s en database van het Intranet van Qquest containerizen en deployen in een Kubernetes cluster. De complexiteit wordt meteen een stuk groter: meerdere containers, networking, load-balancing. Kubernetes neemt veel van deze complexiteit uit handen, maar is veel uitzoekwerk en configuratie om op te zetten. Het doel is om meer instanties van het Intranet te kunnen draaien, zodat niemand meer last heeft van downtime tijdens nieuwe deployments!

Meer weten over cloud & CI/CD?

Lees alles over waar wij goed in zijn met Cloud & CI/CD.

Lees meer

Meer weten over cloud & CI/CD?

Lees alles over waar wij goed in zijn met Cloud & CI/CD.

Lees meer

Relevante ontwikkelingen