Förstå Docker

Jag har använt Docker i flera månader nu för att strukturera utvecklings-/leveransprocessen för webbprojekt. Jag erbjuder Habrakhabr läsare en översättning av den inledande artikeln om hamnarbetare - "Förstå hamnarbetare".

Vad är docker?

Docker är en öppen plattform för att utveckla, leverera och driva applikationer. Docker är utformad för att leverera dina applikationer snabbare. Med docker kan du koppla bort din applikation från din infrastruktur och behandla infrastrukturen som en hanterad applikation. Docker hjälper dig att skicka din kod snabbare, testa snabbare, skicka applikationer snabbare och minska tiden mellan att skriva kod och köra kod. Docker gör detta genom en lättviktig containervirtualiseringsplattform, med hjälp av processer och verktyg som hjälper dig att hantera och vara värd för dina applikationer.

I kärnan låter docker dig köra nästan vilken applikation som helst, säkert isolerad i en container. Säker isolering gör att du kan köra många behållare på samma värd samtidigt. Behållarens lätta karaktär, som körs utan extra börda av en hypervisor, gör att du kan få ut mer av din hårdvara.

Behållarvirtualiseringsplattformen och verktygen kan vara användbara i följande fall:

  • packa din applikation (och de komponenter du använder) i hamnarcontainrar;
  • distribution och leverans av dessa behållare till era team för utveckling och testning;
  • lägga ut dessa behållare på dina produktionsplatser, både i datacenter och i molnen.

Vad kan jag använda docker till?

Publicera dina applikationer snabbt

Docker är bra för att organisera utvecklingscykeln. Docker tillåter utvecklare att köra lokala behållare med applikationer och tjänster. Vilket sedan låter dig integrera med processen med kontinuerlig integration och driftsättningsarbetsflöde.

Till exempel, dina utvecklare skriver kod lokalt och delar sin utvecklingsstack (en uppsättning Docker-bilder) med kollegor. När de är redo skickar de koden och behållarna till testplatsen och kör alla nödvändiga tester. Från testplatsen kan de skicka kod och bilder till produktion.

Lättare att lägga ut och fälla ut

Docker-containerbaserade plattformen gör det enkelt att porta din nyttolast. Docker-containrar kan köras på din lokala maskin, antingen på riktigt eller på en virtuell maskin i ett datacenter, eller i molnet.

Dockers bärbarhet och lätta karaktär gör det enkelt att dynamiskt hantera din arbetsbelastning. Du kan använda docker för att distribuera eller stänga av din applikation eller tjänster. Dockerhastigheten gör att detta kan göras i nästan realtid.

Högre laster och mer nyttolaster

Docker är lätt och snabb. Det ger ett motståndskraftigt, kostnadseffektivt alternativ till hypervisorbaserade virtuella maskiner. Det är särskilt användbart i högbelastningsmiljöer, till exempel när du skapar ditt eget moln eller plattform-som-tjänst. Men det är också användbart för små och medelstora applikationer när du vill få ut mer av de resurser du har.

Huvudkomponenter för Docker

Docker består av två huvudkomponenter:

  • Docker: en virtualiseringsplattform med öppen källkod;
  • Docker Hub: Vår plattform-som-en-tjänst för distribution och hantering av Docker-containrar.

Notera! Docker distribueras under Apache 2.0-licensen.

Docker-arkitektur

Docker använder en klient-server-arkitektur. Docker-klienten kommunicerar med Docker-demonen, som tar på sig bördan av att skapa, köra och distribuera dina behållare. Både klient och server kan köras på samma system, du kan ansluta klienten till en fjärransluten docker-demon. Klienten och servern kommunicerar via en socket eller ett RESTful API.

Förstå Docker

Docker-demon

Som visas i diagrammet körs demonen på värddatorn. Användaren interagerar inte direkt med servern utan använder klienten för detta.

Docker-klient

Docker-klienten, docker-programmet, är huvudgränssnittet till Docker. Den tar emot kommandon från användaren och interagerar med docker-demonen.

Inuti hamnarbetare

För att förstå vad docker består av behöver du veta om tre komponenter:

  • bilder
  • register
  • Behållare

bildspråk

Docker-bilden är en skrivskyddad mall. Till exempel kan bilden innehålla operativsystemet Ubuntu med Apache och en applikation på. Bilder används för att skapa behållare. Docker gör det enkelt att skapa nya bilder, uppdatera befintliga eller så kan du ladda ner bilder skapade av andra. Bilder är komponenter i en docker build.

Registret

Docker-registret lagrar bilder. Det finns offentliga och privata register från vilka du kan ladda ner eller ladda upp bilder. Ett offentligt Docker-register är Docker-nav. Det finns en enorm samling bilder lagrade där. Som du vet kan bilder skapas av dig eller så kan du använda bilder skapade av andra. Register är en distributionskomponent.

behållare

Behållare liknar kataloger. Behållare innehåller allt som applikationen behöver för att köras. Varje behållare skapas från en bild. Behållare kan skapas, startas, stoppas, migreras eller tas bort. Varje behållare är isolerad och ger en säker plattform för applikationen. Behållare är komponenter i arbetet.

Så hur fungerar Docker?

Än så länge vet vi att:

  • vi kan skapa bilder där våra applikationer finns;
  • vi kan skapa behållare från bilder för att köra applikationer;
  • Vi kan distribuera bilder via Docker Hub eller annat bildregister.

Låt oss se hur dessa komponenter passar ihop.

Hur fungerar bilden?

Vi vet redan att en bild är en skrivskyddad mall från vilken en behållare skapas. Varje bild består av en uppsättning nivåer. Docker använder fackligt filsystem att kombinera dessa nivåer till en bild. Unions filsystem tillåter filer och kataloger från olika filsystem (olika grenar) att överlappa transparent, vilket skapar ett sammanhängande filsystem.

En av anledningarna till att docker är lätt är för att den använder sådana här lager. När du ändrar bilden, till exempel när du uppdaterar en applikation, skapas ett nytt lager. Så utan att ersätta hela bilden eller bygga om den, som du kan ha att göra med en virtuell maskin, läggs bara lagret till eller uppdateras. Och du behöver inte distribuera hela den nya bilden, bara uppdateringen distribueras, vilket gör det enklare och snabbare att distribuera bilder.

I hjärtat av varje bild finns en basbild. Till exempel, ubuntu, basbilden för Ubuntu, eller fedora, basbilden för Fedora-distributionen. Du kan också använda bilder som bas för att skapa nya bilder. Om du till exempel har en apache-bild kan du använda den som basbild för dina webbapplikationer.

Notera! Docker hämtar vanligtvis bilder från Docker Hub-registret.

Docker-bilder kan skapas från dessa basbilder; vi kallar stegen för att skapa dessa bilder instruktioner. Varje instruktion skapar en ny bild eller nivå. Instruktionerna kommer att vara följande:

  • Kör kommando
  • lägga till en fil eller katalog
  • skapa en miljövariabel
  • instruktioner om vad som ska köras när behållaren för den här bilden startas

Dessa instruktioner lagras i en fil Dockerfile. Docker läser detta Dockerfile, när du bygger bilden, utför dessa instruktioner och returnerar den slutliga bilden.

Hur fungerar docker-registret?

Registret är ett arkiv för docker-bilder. När bilden har skapats kan du publicera den till det offentliga Docker Hub-registret eller till ditt personliga register.

Med docker-klienten kan du söka efter redan publicerade bilder och ladda ner dem till din docker-dator för att skapa behållare.

Docker Hub tillhandahåller offentliga och privata bildarkiv. Att söka och ladda ner bilder från offentliga arkiv är tillgängligt för alla. Innehållet i privata lagringar ingår inte i sökresultaten. Och bara du och dina användare kan ta emot dessa bilder och skapa behållare från dem.

Hur fungerar en container?

En behållare består av ett operativsystem, användarfiler och metadata. Som vi vet skapas varje behållare från en bild. Den här bilden talar om för docker vad som finns i behållaren, vilken process som ska startas, när behållaren startar och annan konfigurationsdata. Docker-bilden är skrivskyddad. När docker startar en behållare, skapar den ett läs-/skrivlager ovanpå bilden (med hjälp av unionsfilsystemet som nämnts tidigare) där applikationen kan köras.

Vad händer när containern startar?

Eller använda programmet docker, eller genom att använda RESTful API, uppmanar docker-klienten docker-demonen att starta behållaren.

$ sudo docker run -i -t ubuntu /bin/bash

Låt oss ta en titt på det här kommandot. Klienten startas med kommandot docker, med option run, som säger att en ny container kommer att lanseras. Minimikraven för att köra en behållare är följande attribut:

  • vilken bild som ska användas för att skapa behållaren. I vårat fall ubuntu
  • kommandot du vill köra när behållaren startas. I vårat fall /bin/bash

Vad händer under huven när vi kör det här kommandot?

Docker, i ordning, gör följande:

  • laddar ner ubuntu-bilden: docker kontrollerar bildtillgänglighet ubuntu på den lokala maskinen, och om den inte finns där, ladda ner den från Docker-nav. Om det finns en bild, använder den den för att skapa en behållare;
  • skapar en behållare: när bilden tas emot använder docker den för att skapa en behållare;
  • initierar filsystemet och monterar den skrivskyddade nivån: behållaren skapas i filsystemet och bilden läggs till på skrivskyddad nivå;
  • initierar nätverket/bryggan: skapar ett nätverksgränssnitt som tillåter docker att kommunicera med värddatorn;
  • Ställa in IP-adressen: hittar och ställer in adressen;
  • Startar den angivna processen: startar din applikation;
  • Bearbetar och producerar utdata från din applikation: ansluter och loggar din applikations standardinmatning, -utgång och felström så att du kan spåra hur din applikation presterar.

Du har nu en fungerande container. Du kan hantera din behållare, interagera med din applikation. När du bestämmer dig för att stoppa programmet tar du bort behållaren.

Teknik som används

Docker är skrivet i Go och använder vissa funktioner i Linux-kärnan för att implementera ovanstående funktionalitet.

Namnutrymmen

Docker använder teknik namespaces att organisera isolerade arbetsytor, som vi kallar containrar. När vi startar en behållare skapar docker en uppsättning namnrymder för den behållaren.

Detta skapar ett isolerat lager, där varje aspekt av behållaren körs i sitt eget namnområde och inte har tillgång till det externa systemet.

Lista över några namnområden som docker använder:

  • pid: att isolera processen;
  • netto: för hantering av nätverksgränssnitt;
  • ipc: att hantera IPC-resurser. (ICP: InterProccess Communication);
  • mnt: att hantera monteringspunkter;
  • utc: för att isolera kärnan och kontrollversionsgenereringen (UTC: Unix timesharing system).

Kontrollgrupper

Docker använder också teknik cgroups eller kontrollgrupper. Nyckeln till att köra en applikation isolerat är att förse applikationen med endast de resurser du vill tillhandahålla. Detta säkerställer att containrarna blir goda grannar. Kontrollgrupper låter dig dela tillgängliga hårdvaruresurser och vid behov sätta gränser och begränsningar. Begränsa till exempel den möjliga mängden minne för behållaren.

Unions filsystem

Union File System eller UnionFS är ett filsystem som fungerar genom att skapa lager, vilket gör det väldigt lätt och snabbt. Docker använder UnionFS för att skapa blocken från vilka behållaren är byggd. Docker kan använda flera varianter av UnionFS inklusive: AUFS, btrfs, vfs och DeviceMapper.

Behållarformat

Docker kombinerar dessa komponenter till ett omslag som vi kallar containerformatet. Standardformatet kallas libcontainer. Docker stöder också det traditionella containerformatet på Linux med LXC. I framtiden kan Docker stödja andra containerformat. Till exempel, integration med BSD Jails eller Solaris Zones.

Källa: will.com

Lägg en kommentar