DevOps-teamen utsätts för allt större press för att snabbt leverera en större funktionalitet till kunderna. Molnleverantörer erbjuder en lösning genom skalbara plattformar med utmärkta CLI- och API-integreringar. De gränssnitt som molnleverantörerna exponerar kan dock vara inkompatibla. Men vissa moln-inbyggda verktyg hjälper DevOps-team att bygga anpassade lösningar för alla molnleverantörer.

Två sådana verktyg är Vagrant och Docker. Att förstå vad dessa gör och hur de fungerar ihop är nyckeln till att få ut så mycket som möjligt av din molnmiljö.

Vagrant är ett verktyg för att bygga och hantera miljöer med virtuella maskiner (VM) i ett enda arbetsflöde. Du kanske bygger lokala virtuella maskiner som ska köras med hypervisorer eller endast moln-VM: er? Oavsett vilket så erbjuder Vagrant ett enhetligt konfigurationsformat, ett enda CLI och delade provisioners för att installera programvara och ändra konfigurationer.

Docker erbjuder möjligheten att paketera programvara och stödjande konfiguration till avbildningar som körs konsekvent på flera plattformar. Det är även möjligt för DevOps-team att lita på att programvaran kommer att köras på en lokal arbetsstation på samma sätt som den körs på en hanterad molnplattform.

Vagrant och Docker har samma mål för skapandet av repeterbara miljöer. De gör det dock på olika men kompletterande sätt. I den här artikeln så undersöker vi hur Vagrant och Docker uppnår sina mål.

Vad är Docker?

Docker är en öppen plattform för att utveckla, leverera och köra applikationer. Den gör det möjligt för DevOps-team att paketera anpassad programvara, stödprogram och bibliotek. Som ett resultat av denna plattform så kan man även paketera instruktioner för konfiguration, nätverk, filmontering, hälsokontroller och lanseringsskript. Allt sker i en självständig artefakt som kallas avbildning.

Avbildningarna körs sedan i en lättviktig, isolerad miljö som kallas container. Virtuella maskiner reserverar fasta mängder minne och begränsar CPU-användningen på ett strikt sätt. Containrar är betydligt mer elastiska och förbrukar endast det minne och den CPU som de behöver.

Som ett resultat av detta så kan många containrar köras sida vid sida på ett effektivt sätt. Detta minskar kostnaderna och ökar skalbarheten. Containrar anses dock inte vara lika säkra som virtuella maskiner. Containrar är med andra ord inte en idealisk lösning för att köra opålitlig kod.

Docker
Docker

Varför ska man använda Docker (istället för Vagrant)?

DevOps-team använder vanligtvis Docker för att leverera och köra webbapplikationer. Detta inkluderar moln-inbyggda applikationer som antingen integreras med meddelandeköer eller som finns på FaaS-plattformar (function-as-a-service). Dessa svarar på molnbaserade utlösare och händelser.

Plattformar som Kubernetes bygger på Docker och gör det möjligt att arrangera containrar i stor skala. Alla molnleverantörer stöder dessutom möjligheten att köra Docker-containrar i sina PaaS-erbjudanden (Platform as a Service). Det är numera sällsynt att hitta en PaaS som inte stöder Docker.

Docker kan även distribuera och utföra CLI-baserade verktyg. Alla populära moln-inbyggda verktyg erbjuder Docker-avbildningar som bäddar in deras CLI.

Vilka är fördelarna med Docker?

Docker löser ett vanligt problem i traditionella processer för distribuering av programvara. Anpassade applikationer kan ge olika resultat när de körs på en utvecklares lokala arbetsstation eller i en produktionsmiljö. Dessa skillnader är ofta ett resultat av att utvecklare kör olika versioner av programmeringsspråk. De kanske även har olika konfigurationer för stöd-applikationer som webbservrar eller kör helt andra operativsystem än produktionsmiljön. Som ett resultat av dessa skillnader så skickas supportfrågorna fram och tillbaka mellan teamen med kommentarer som ”Det fungerar på min dator”

Docker-avbildningar innehåller koden för anpassade applikationer, alla stöd-applikationer och bibliotek. Som ett resultat av detta så körs avbildningarna i containers som ger mer konsekventa resultat oavsett var de körs.

Docker-avbildningar är lätta att distribuera med hjälp av register som Docker Hub. Detta gör det möjligt för DevOps-team att snabbt dela avbildningar sinsemellan och distribuera avbildningarna med hjälp av de olika hosting-plattformarna. Du hittar exempelvis Docker bakom Kinsta’s WordPress-utvecklingssvit DevKinsta.

Ibland så krävs det mer komplexa applikationsstackar, som att distribuera en databas tillsammans med en backend-applikation eller en samling relaterade mikrotjänster. Då erbjuder Docker Compose möjligheten att skapa och länka flera Docker-containrar med ett enda kommando. Alla containrar, tillhörande inställningar och nätverkskonfigurationer definieras i en enda YAML-fil. Docker Compose läser sedan denna fil för att skapa och hantera flera containers som en enda enhet.

Docker har även ett nästan universellt stöd hos de största molnleverantörerna. Detta innebär exempelvis att DevOps-team har många valmöjligheter när de kör sina Docker-avbildningar i molnet.

Vad är Vagrant?

I årtionden så har virtuella maskiner visat sig vara en pålitlig och säker lösning för att dela upp och tillhandahålla datorresurser. Virtuella maskiner är fortfarande de mest populära tjänsterna som exponeras av molnleverantörer. De nyttjas även av många kommersiella lösningar och lösningar med öppen källkod för team som vill köra virtuella maskiner på plats.

Denna variation innebär dock en utmaning för DevOps-team. Varje lösning exponerar ett annat CLI och API för att skapa och hantera virtuella maskiner. Som ett resultat av detta så blir det svårt att upprätthålla konsistens mellan lokala utvecklingsmiljöer och molnbaserade plattformar.

Vagrant erbjuder en lösning genom att abstrahera de underliggande skillnaderna mellan VM-plattformar. Detta gör det exempelvis möjligt för DevOps-team att tillhandahålla nya virtuella maskiner med ett enda CLI och en konsekvent konfigurationssyntax. Team som använder Vagrant kan skapa konsekventa virtuella maskiner oavsett om de ska köras på plats eller i en molnmiljö. Det går enkelt att växla mellan miljöer. Vagrant har en mängd olika användningsområden, bland annat som ersättare för MAMP (macOS, Apache, MySQL/MariaDB och PHP, Perl eller Python).

Vagrant
Vagrant

Varför ska man använda Vagrant (istället för Docker)?

Det är möjligt att starta upp en virtuell maskin och konfigurera operativsystemet manuellt. Man installerar bara programvaran och redigerar konfigurationsfilerna. Detta är dock inte idealiskt eftersom processen inte kan upprepas. Som ett resultat av detta så måste VM: er återskapas manuellt för olika operativsystem och leverantörer. Det blir även nästan omöjligt att förstå hur en VM konfigurerades vid ett senare tillfälle.

En bättre metod är att automatisera den process som krävs för att konfigurera en virtuell maskin. Vagrant erbjuder ett enda verktyg för att automatisera processen för att skapa virtuella maskiner för många leverantörer. Det tillhandahålls även ett stort urval av högkvalitativa virtuella maskiner på Vagrant Cloud. Dessa kan DevOps-team använda för att påbörja sina egna virtuella maskiner.

Vilka är fördelarna med Vagrant?

DevOps-team som använder Vagrant har ett enda verktyg att lära sig. Detta gäller oavsett om de bygger VM: er för lokala plattformar, molnplattformar eller båda. Du kan enkelt justera Vagrant-konfigurationsfiler och köra om eller granska dem vid ett senare tillfälle för att förstå hur en VM byggdes.

Vagrant gör det även möjligt för DevOps-team att migrera till molnet eller mellan olika leverantörer. De behöver inte göra om processen som de nyttjar för att bygga virtuella maskiner.

De virtuella maskinerna som skapas av Vagrant ger en hög grad av isolering och drar ofta nytta av ett specialiserat virtualiseringsstöd som är inbyggt i moderna CPU: er. Detta gör att virtuella maskiner, och verktyg som skapar dem, som Vagrant, är det bästa valet när säkerhet och isolering har hög prioritet.

Många Linuxdistribueringar, t.ex. Ubuntu och Fedora, tillhandahåller också officiella Vagrant-boxar som DevOps-team kan bygga på. Detta minskar den tid som det tar att bygga anpassade virtuella maskiner.

Vagrant vs Docker: En närmare titt

Både Vagrant och Docker gör DevOps-team effektivare genom att automatisera byggandet, distribueringen och körningen av mjukvaruapplikationer.

Docker uppnår detta mål med ett anpassat paketeringsformat i form av avbildningar och en lättviktig exekveringsmiljö via containrar. Containers exekveras konsekvent mellan olika plattformar. Som ett resultat så får DevOps-teamen större förtroende för att deras programvara fungerar som förväntat. Docker stöds av PaaS- och FaaS-molnplattformar. Detta gör att DevOps-team kan välja den bästa plattformen för sina behov.

Många containers kan samexistera på en enda host, i huvudsak – men inte helt – isolerade från varandra. De delar ändå samma pool av resurser. Detta gör att containrar kan skalas effektivt.

Vagrant uppnår detta mål genom att tillhandahålla en konsekvent metod för att konstruera virtuella maskiner med befintliga leverantörer. Det är ett idealiskt val för team som redan har investerat i virtuella maskiner. De kan på så sätt förlita sig på den höga nivån av isolering, säkerhet, kontroll och anpassning.

Docker erbjuder även den bästa lösningen när man kör betrodd kod samtidigt som man minimerar datorkostnaderna. Containers är någorlunda isolerade från varandra men medför mycket lite overhead. Detta innebär att många containers kan köras samtidigt på ett delat operativsystem. Virtuella maskiner är den bästa lösningen när grupper behöver höga nivåer av isolering och säkerhet. De är även bäst när man behöver köra många olika operativsystem sida vid sida. Vagrant är en praktisk lösning för att bygga virtuella maskiner på ett automatiserat och repeterbart sätt.

Vagrant och Docker är inte tekniker som utesluter varandra. Både verktygen kan användas sida vid sida. DevOps-team kan exempelvis använda Docker för att utveckla och köra applikationer. De kan samtidigt använda Vagrant för att återskapa specialiserade miljöer för att reproducera problem. Docker kan till och med köras i en VM som har skapats av Vagrant. Man kanske vill testa nya versioner av Docker eller testa verktyg som distribueras som Docker-avbildningar i en isolerad miljö.

Sammanfattning

DevOps-team har många valmöjligheter när de bygger, distribuerar och kör applikationer.

Docker tillhandahåller ett anpassat avbildningsformat och en miljö för utförande av containrar. Dessa möjliggör enstorskalig och effektiv resursanvändning och stöds av PaaS- och FaaS-plattformar.

VM: er erbjuder säkra och isolerade exekveringsmiljöer från många VM-leverantörer i molnet och på plats. Vagrant abstraherar många skillnader och tillhandahåller ett enda CLI och en konsekvent konfigurationssyntax för att instansiera VM: er hos olika leverantörer.

Innan du börjar utveckla din nästa app så kan du ta en titt på hur Kinsta’s tjänst Applikationshosting kan dra nytta av Dockerfiler för att hantera distribueringen av din kod.

Salman Ravoof

Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.