Vad är Docker? Gnistan för containerrevolutionen

Docker är en mjukvaruplattform för att bygga applikationer baserade på behållare - små och lätta körningsmiljöer som använder delad operativsystemkärna men annars körs isolerade från varandra. Medan containrar som ett koncept har funnits under en tid har Docker, ett open source-projekt som lanserades 2013, hjälpt till att popularisera tekniken och har hjälpt till att driva trenden mot containerisering och mikrotjänster  inom mjukvaruutveckling som har blivit känd som moln-native utveckling.

Vad är containrar?

Ett av målen med modern programvaruutveckling är att hålla applikationer på samma värd eller kluster isolerade från varandra så att de inte stör onödigt varandras drift eller underhåll. Detta kan vara svårt tack vare paketen, biblioteken och andra programvarukomponenter som krävs för att de ska kunna köras. En lösning på detta problem har varit virtuella maskiner, som håller applikationer på samma hårdvara helt separata, och minskar konflikter mellan mjukvarukomponenter och konkurrens om hårdvaruresurser till ett minimum. Men virtuella maskiner är skrymmande - alla kräver sitt eget operativsystem, så är det vanligtvis gigabyte i storlek - och svåra att underhålla och uppgradera.

Behållare isolerar däremot applikations exekveringsmiljöer från varandra, men delar den underliggande OS-kärnan. De mäts vanligtvis i megabyte, använder mycket färre resurser än virtuella datorer och startar nästan omedelbart. De kan packas mycket tätare på samma hårdvara och snurras upp och ner massor med mycket mindre ansträngning och overhead. Behållare ger en mycket effektiv och mycket detaljerad mekanism för att kombinera programvarukomponenter i de typer av applikations- och servicestackar som behövs i ett modernt företag och för att hålla dessa mjukvarukomponenter uppdaterade och underhållna.

Hamnarbetare

Vad är Docker?

Docker är ett open source-projekt som gör det enkelt att skapa containrar och containerbaserade appar. Ursprungligen byggt för Linux, kör Docker nu också på Windows och MacOS. För att förstå hur Docker fungerar, låt oss ta en titt på några av de komponenter som du skulle använda för att skapa Docker-containeriserade applikationer.

Dockerfil

Varje Docker-container börjar med en Dockerfil . En Dockerfile är en textfil skriven i en lättförståelig syntax som innehåller instruktionerna för att bygga en Docker- bild (mer om det på ett ögonblick). En Dockerfile specificerar det operativsystem som ligger till grund för behållaren, tillsammans med språk, miljövariabler, filplatser, nätverksportar och andra komponenter som den behöver - och naturligtvis vad behållaren faktiskt gör när vi kör den.

Paige Niedringhaus över på ITNext har en bra fördelning av syntaxen för en Dockerfile.

Docker-bild

När du har skrivit din Dockerfile anropar du Docker- buildverktyget för att skapa en bild baserad på den Dockerfilen. Medan Dockerfilen är en uppsättning instruktioner som berättar buildhur man gör bilden, är en Docker-bild en bärbar fil som innehåller specifikationerna för vilka programvarukomponenter behållaren ska köras och hur. Eftersom en Dockerfile troligen kommer att innehålla instruktioner om hur man tar tag i vissa programvarupaket från onlineförvar, bör du se till att uttryckligen ange rätt versioner, annars kan din Dockerfile producera inkonsekventa bilder beroende på när den anropas. Men när en bild har skapats är den statisk. Codefresh erbjuder en titt på hur man bygger en bild mer detaljerat.

Docker-körning

Dockers runverktyg är kommandot som faktiskt startar en container. Varje behållare är en förekomst av en bild. Behållare är utformade för att vara övergående och tillfälliga, men de kan stoppas och startas om, vilket startar behållaren i samma tillstånd som när den stoppades. Vidare kan flera containerinstanser av samma bild köras samtidigt (så länge varje container har ett unikt namn). Kodgranskningen har en bra uppdelning av de olika alternativen för runkommandot, för att ge dig en känsla för hur det fungerar.

Docker Hub

Medan det är enkelt att bygga containrar får du inte tanken att du behöver bygga var och en av dina bilder från grunden. Docker Hub är ett SaaS-arkiv för delning och hantering av containrar, där du hittar officiella Docker-bilder från open source-projekt och programvaruleverantörer och inofficiella bilder från allmänheten. Du kan ladda ner behållarbilder med användbar kod eller ladda upp din egen, dela dem öppet eller göra dem privata istället. Du kan också skapa ett lokalt Docker-register om du föredrar det. (Docker Hub har tidigare haft problem med bilder som laddades upp med bakdörrar inbyggda i dem.)

Docker-motor

Docker Engine är kärnan i Docker, den underliggande klientserverteknologin som skapar och kör behållarna. Generellt sett, när någon säger Docker generiskt och inte pratar om företaget eller det övergripande projektet, menar de Docker Engine. Det finns två olika versioner av Docker Engine som erbjuds: Docker Engine Enterprise och Docker Engine Community.

Docker Community Edition

Docker släppte sin Enterprise Edition 2017, men dess ursprungliga erbjudande, döpt om till Docker Community Edition, förblir öppen källkod och gratis och förlorade inga funktioner i processen. Istället lade Enterprise Edition, som kostar 1 500 USD per nod per år, till avancerade hanteringsfunktioner inklusive kontroller för kluster- och bildhantering och övervakning av sårbarhet. BoxBoat-bloggen har en översikt över skillnaderna mellan utgåvorna.

Hur Docker erövrade containervärlden

Idén att en viss process kan köras med viss grad av isolering från resten av dess operativmiljö har byggts in i Unix-operativsystem som BSD och Solaris i årtionden. Den ursprungliga Linux-containertekniken, LXC, är en virtualiseringsmetod på OS-nivå för att köra flera isolerade Linux-system på en enda värd. LXC möjliggjordes av två Linux-funktioner: namnområden, som omsluter en uppsättning systemresurser och presenterar dem för en process så att det ser ut som om de är dedikerade till den processen och cgroups, som styr isoleringen och användningen av systemresurser, såsom CPU och minne, för en grupp processer.

Behållare kopplar från applikationer från operativsystem, vilket innebär att användare kan ha ett rent och minimalt Linux-operativsystem och köra allt annat i en eller flera isolerade behållare. Och eftersom operativsystemet är abstraherat från containrar kan du flytta en container över vilken Linux-server som helst som stöder containerns runtime-miljö.

Docker introducerade flera betydande förändringar i LXC som gör containrar mer bärbara och flexibla att använda. Med hjälp av Docker-behållare kan du distribuera, replikera, flytta och säkerhetskopiera en arbetsbelastning ännu snabbare och lättare än vad du kan göra med virtuella maskiner. Docker ger molnliknande flexibilitet till alla infrastrukturer som kan köra containrar. Dockers containeravbildningsverktyg var också ett framsteg över LXC, vilket gjorde det möjligt för en utvecklare att bygga bibliotek med bilder, komponera applikationer från flera bilder och starta dessa containrar och applikationer på lokal eller fjärransluten infrastruktur.

Docker Compose, Docker Swarm och Kubernetes

Docker gör det också lättare att samordna beteenden mellan behållare och därmed bygga applikationsstackar genom att fästa behållare tillsammans. Docker Compose skapades av Docker för att förenkla processen att utveckla och testa applikationer med flera containrar. Det är ett kommandoradsverktyg, som påminner om Docker-klienten, som tar in en speciellt formaterad beskrivningsfil för att montera applikationer från flera behållare och köra dem tillsammans på en enda värd. (Kolla in handboken för Docker Compose för att lära dig mer.)

Mer avancerade versioner av dessa beteenden - vad som kallas containerorkestrering - erbjuds av andra produkter, som Docker Swarm och Kubernetes. Men Docker tillhandahåller grunderna. Trots att Swarm växte ut ur Docker-projektet har Kubernetes blivit den faktiska Docker-orkestrationsplattform som du väljer.

Docker fördelar

Docker-containrar ger ett sätt att bygga applikationer för företag och branscher som är lättare att montera, underhålla och flytta runt än deras konventionella motsvarigheter. 

Docker-behållare möjliggör isolering och strypning

Docker-behållare håller appar isolerade inte bara från varandra utan från det underliggande systemet. Detta ger inte bara en renare programvarustack utan gör det lättare att diktera hur en viss behållarapplikation använder systemresurser - CPU, GPU, minne, I / O, nätverk och så vidare. Det gör det också lättare att säkerställa att data och kod hålls åtskilda. (Se "Docker-behållare är statslösa och oföränderliga" nedan.)

Docker-behållare möjliggör portabilitet

En Docker-behållare körs på alla datorer som stöder behållarens körningsmiljö. Applikationer behöver inte kopplas till värdoperativsystemet, så både applikationsmiljön och den underliggande operativmiljön kan hållas rena och minimala.

Till exempel kommer en MySQL för Linux-container att köras på de flesta Linux-system som stöder containrar. Alla beroenden för appen levereras vanligtvis i samma behållare.

Behållarbaserade appar kan enkelt flyttas från lokala system till molnmiljöer eller från utvecklarens bärbara datorer till servrar, så länge som målsystemet stöder Docker och något av tredjepartsverktygen som kan användas med det, t.ex. Kubernetes (se ”Docker-behållare underlättar orkestrering och skalning” nedan).

Normalt måste Docker-containerbilder byggas för en specifik plattform. En Windows-behållare kan till exempel inte köras på Linux och vice versa. Tidigare var en väg runt denna begränsning att starta en virtuell maskin som körde en instans av det nödvändiga operativsystemet och köra behållaren i den virtuella maskinen.

Docker-teamet har emellertid sedan tagit fram en mer elegant lösning, kallad  manifest , som gör att bilder för flera operativsystem kan packas sida vid sida i samma bild. Manifest betraktas fortfarande som experimentella, men de antyder hur behållare kan bli en plattformsapplikationslösning såväl som en miljöövergripande. 

Docker-behållare aktiverar komposibilitet

De flesta affärsapplikationer består av flera separata komponenter organiserade i en stack - en webbserver, en databas, ett cache i minnet. Behållare gör det möjligt att komponera dessa bitar till en funktionell enhet med lätt utbytbara delar. Varje bit tillhandahålls av en annan behållare och kan underhållas, uppdateras, bytas ut och modifieras oberoende av de andra.

Detta är i huvudsak mikrotjänstmodellen för applikationsdesign. Genom att dela applikationsfunktionaliteten i separata, fristående tjänster erbjuder mikrotjänstmodellen en motgift för att sakta ner traditionella utvecklingsprocesser och oflexibla monolitiska appar. Lätta och bärbara behållare gör det lättare att bygga och underhålla mikrotjänstbaserade applikationer.

Docker-behållare underlättar orkestrering och skalning

Eftersom behållare är lätta och medför lite overhead är det möjligt att lansera många fler av dem på ett visst system. Men containrar kan också användas för att skala en applikation över systemkluster, och för att rampa upp eller ner för att möta efterfrågade spikar eller för att spara resurser.

De mest företagsklassiga versionerna av verktygen för distribution, hantering och skalning av containrar tillhandahålls genom tredjepartsprojekt. Chefen bland dem är Googles Kubernetes, ett system för att automatisera hur containrar distribueras och skalas, men också hur de är anslutna, belastningsbalanserade och hanterade. Kubernetes ger också sätt att skapa och återanvända definitioner av applikationer för flera containrar eller "Helm charts", så att komplexa appstackar kan byggas och hanteras på begäran.

Docker innehåller också sitt eget inbyggda orkestrationssystem, Swarm-läge, som fortfarande används för fall som är mindre krävande. Med detta sagt har Kubernetes blivit något av standardvalet; i själva verket levereras Kubernetes med Docker Enterprise Edition.

Docker förbehåll

Behållare löser många problem, men de är inte botemedel. Några av deras brister är designade, medan andra är biprodukter av deras design.

Docker-behållare är inte virtuella maskiner

Det vanligaste begreppsmässiga misstaget människor gör med containrar är att jämföra dem med virtuella maskiner. Men eftersom containrar och virtuella maskiner använder olika isoleringsmekanismer har de tydligt olika fördelar och nackdelar.

Virtuella maskiner ger en hög grad av isolering för processer, eftersom de körs i sin egen instans av ett operativsystem. Det operativsystemet behöver inte heller vara detsamma som det som körs på värden. En virtuell Windows-maskin kan köras på en Linux hypervisor och vice versa.

Behållare använder däremot kontrollerade delar av värdoperativsystemets resurser; många applikationer delar samma OS-kärna på ett mycket lyckat sätt. Som ett resultat är containeriserade appar inte lika isolerade som virtuella maskiner, men de ger tillräckligt med isolering för de allra flesta arbetsbelastningar.

Dockerbehållare ger inte metallhastighet