DevOpsApplicaties virtualiseren met Docker containers

Applicaties virtualiseren met Docker containers

2  juni 2017 - Vroeger had iedere server z’n eigen hardware, met de komst van virtualisatie en de Cloud werd het mogelijk om de hardware te delen en dynamisch resources te geven aan de server die het nodig heeft. Nu is dit nog uitgebreider door de containertechnologie. Het gebruik van containers is één van de belangrijkste trends van dit moment. In deze blog ga ik in op Docker, containers, Docker compose & Docker VS een Virtual Machine.

Wat is een container nou precies?

Een container is een licht, standalone uitvoerbaar pakket van een softwarepakket dat alles bevat om deze te kunnen uitvoeren. Denk hierbij aan: code, runtime, systeem tools, libraries en instellingen. Beschikbaar voor zowel Linux als Windows gebaseerde applicaties, ‘containerized software’ zal altijd hetzelfde draaien, ongeacht van de omgeving. Containers isoleren software uit de omgeving, bijvoorbeeld de verschillen tussen een development omgeving en een productie omgeving. Het vermindert dus conflicten in teams die verschillende software draaien op dezelfde infrastructuur. Je zou bijvoorbeeld de volgende containers voor een applicatie kunnen inrichten; een PHP container voor de mailservice van de applicatie, een .NET core container voor de web service en een MySQL container voor de database.

Docker Containers

Wat is Docker?

Docker is ’s werelds grootste (open source) software container platform. Docker lost het probleem op waar vele programmeurs mee zitten, dat code op hun machine werkt maar niet op die van iemand anders of op een productie omgeving. In Docker kun je handig applicaties maken, deployen en runnen door containers te gebruiken.
Door deze containers kun je alleen de packages includeren die jouw applicatie nodig heeft zoals de libraries en andere afhankelijkheden en het als één package te verzenden. Door deze containers te gebruiken kan een ontwikkelaar er zeker van zijn dat de applicatie op een andere Linux of Windows machine draait, ongeacht van de aangepaste instellingen die de machine zou kunnen hebben ten opzichte van de machine die gebruikt werd voor het schrijven en testen van de code.  Daarnaast is het ook veel sneller om te redeployen omdat iedere container al gebuild is. Hierdoor hoef je bij het deployen geen dependencies meer te installeren. De entrypoint voor een container is ook het commando waarmee je je service start.
Je kunt Docker dus gebruiken om applicaties naast elkaar in geïsoleerde containers te beheren. Bedrijven gebruiken Docker om flexibele delivery Pipelines aan te maken om nieuwe functies sneller, veiliger en betrouwbaarder te maken voor zowel Linux als Windows server applicaties.

Docker ComposeDocker Compose

Docker Compose is een tool voor het definiëren en uitvoeren van multi-container applicaties. Docker Compose handelt alles voor je af, het enige wat je zelf hoeft te doen is een simpel configuratiebestand aanmaken genaamd docker_compose.yml. Docker Compose leest het configuratiebestand en maakt de "docker run" commando's aan om een multi-container applicatie te maken.

De eigenschappen die Compose erg effectief maken zijn:

- Meerdere geïsoleerde omgevingen op een enkele host
- Bewaar volumegegevens wanneer containers worden aangemaakt
- Maakt alleen containers opnieuw aan als deze aangepast zijn
- Het verplaatsen van een compositie tussen omgevingen

Compose is ideaal voor ontwikkelings-, test- en stage-environments & CI workflows.

Waarom Docker in plaats van een virtual machine?

Docker staat applicaties toe om geïsoleerd te worden in containers met de packages die alleen voor die applicatie nodig zijn om goed te kunnen functioneren.
Docker is dus een beetje als een virtual machine. Maar in tegenstelling tot een virtual machine gebruikt Docker veel minder resources. Dit komt omdat een virtual machine een heel OS aanmaakt en Docker dezelfde Linux kernel kan gebruiken voor meerdere applicaties. Dit geeft een erg grote prestatie boost en verkleint de grootte van de applicatie.
Stel je hebt 20 Docker containers die je wilt draaien, deze kun je allemaal draaien in één virtuele machine. Om 20 virtuele machines te draaien, heb je 20 operating systemen nodig met het minimaal aantal systemeisen voordat Hypervisor of VMWare door kan gaan met het basisbesturingssysteem.
Als we ervanuit gaan dat we het minimale aantal resources per VM gebruiken, 250MB bijvoorbeeld dan zit je met 20 VM’s al rond de 5GB aan RAM die je nodig hebt met 20 verschillende OS kernels die de resources beheren. Met Docker kun je een deel van je RAM aan één VM geven en heb je 1 OS die deze resources beheert.
Langs het feit dat je resources op je server bespaard met Docker kun je ook erg gemakkelijk meerdere services op een server / cloud platform deployen omdat de dependencies ingebakken zitten in de container.

Conclusie

Containers van Docker zijn op het moment best populair, maar ze zijn geen perfecte oplossing voor elk type infrastructuur. Net als elke andere technologie hebben ze ook hun nadelen. Zoals de Cloud voor hen, lijken containers het antwoord op al je problemen te zijn. Maar net zoals bij de Cloud komen containers met sommige valkuilen.

In de volgende situaties kun je het beste niet voor een oplossing met Docker kiezen:

Geen programmeurs met container expertise binnen het bedrijf. Containers zijn geen nieuwe technologie, maar ze zijn niet lang geleden mainstream geworden. De kans dat je dus iets over containers hebt geleerd in je opleiding b.v. is laag. Als gevolg hiervan zijn niet alle teams bereid om de containerconstructie in te zetten en te beheren
Je hebt extreme beveiliging nodig. Containers zijn veel veiliger dan ze eerder waren, dankzei initiatieven zoals Docker Security Scanner. Maar deze tool beveiligd alleen een deel van de containerinfrastructuur, met name containerregisters (en ze zijn nog steeds niet perfect). Als je zeer hoge security behoeften hebt voor bijvoorbeeld gegevensbeveiliging, zijn containers misschien niet de beste oplossing.
Windows. Docker draait nu op Windows, maar alleen met het nadeel dat het een gevirtualiseerde Linux omgeving nodig heeft om dit te kunnen doen. Dat maakt een Windows infrastructuur een minder goede keuze voor het uitvoeren van containers. Ik vind persoonlijk Linux ook fijner als je gaat werken met Docker, of je moet een grote fan zijn van Powershell.

Docker heeft een erg grote impact gehad in slechts een paar jaar tijd, Docker heeft het concept van containerized development & deployment enorm verbeterd. Als je software maakt of test en je hebt Docker nog niet aangeraakt dan wordt het eens tijd om dat te gaan doen!

Mocht je dus zelf aan de slag willen met Docker, neem dan eens een kijkje op Docker get started.

Marco van Oirschot, Software Developer