Docker begrijpen

Ik gebruik Docker nu al enkele maanden om het ontwikkel-/opleveringsproces van webprojecten te structureren. Ik bied Habrakhabr-lezers een vertaling aan van het inleidende artikel over havenarbeider - "Dokwerker begrijpen".

Wat is docker?

Docker is een open platform voor het ontwikkelen, leveren en bedienen van applicaties. Docker is ontworpen om uw applicaties sneller te leveren. Met docker kunt u uw applicatie loskoppelen van uw infrastructuur en de infrastructuur behandelen als een beheerde applicatie. Met Docker kunt u uw code sneller verzenden, sneller testen, applicaties sneller verzenden en de tijd tussen het schrijven van code en het uitvoeren van code verkorten. Docker doet dit via een lichtgewicht containervirtualisatieplatform, waarbij gebruik wordt gemaakt van processen en hulpprogramma's waarmee u uw applicaties kunt beheren en hosten.

In de kern kunt u met Docker vrijwel elke applicatie uitvoeren, veilig geïsoleerd in een container. Met veilige isolatie kunt u veel containers tegelijkertijd op dezelfde host uitvoeren. Dankzij het lichtgewicht karakter van de container, die werkt zonder de extra last van een hypervisor, kunt u meer uit uw hardware halen.

Het containervirtualisatieplatform en de tools kunnen nuttig zijn in de volgende gevallen:

  • het verpakken van uw applicatie (en de componenten die u gebruikt) in docker-containers;
  • distributie en levering van deze containers aan uw teams voor ontwikkeling en testen;
  • het plaatsen van deze containers op uw productielocaties, zowel in datacenters als in de cloud.

Waar kan ik docker voor gebruiken?

Publiceer snel uw applicaties

Docker is geweldig voor het organiseren van de ontwikkelingscyclus. Met Docker kunnen ontwikkelaars lokale containers met applicaties en services draaien. Waardoor u vervolgens kunt integreren met het proces van continue integratie en implementatieworkflow.

Uw ontwikkelaars schrijven bijvoorbeeld lokaal code en delen hun ontwikkelingsstack (een set Docker-images) met collega's. Als ze klaar zijn, pushen ze de code en containers naar de testlocatie en voeren ze de nodige tests uit. Vanaf de testsite kunnen ze code en afbeeldingen naar productie sturen.

Gemakkelijker neerleggen en uitvouwen

Het op docker-containers gebaseerde platform maakt het gemakkelijk om uw lading te porten. Docker-containers kunnen op uw lokale machine draaien, zowel in het echt als op een virtuele machine in een datacenter of in de cloud.

De draagbaarheid en het lichtgewicht karakter van docker maken het eenvoudig om uw werklast dynamisch te beheren. U kunt docker gebruiken om uw toepassing of services te implementeren of af te sluiten. Dankzij de snelheid van Docker kan dit vrijwel in realtime worden gedaan.

Hogere lasten en meer laadvermogen

Docker is lichtgewicht en snel. Het biedt een veerkrachtig, kosteneffectief alternatief voor op hypervisor gebaseerde virtuele machines. Het is vooral handig in omgevingen met hoge belasting, bijvoorbeeld bij het creëren van uw eigen cloud of platform-as-service. Maar het is ook handig voor kleine en middelgrote toepassingen als je meer wilt halen uit de middelen die je hebt.

Belangrijkste Docker-componenten

Docker bestaat uit twee hoofdcomponenten:

  • Docker: een open source virtualisatieplatform;
  • Docker Hub: Ons platform-as-a-service voor het distribueren en beheren van Docker-containers.

Opmerking! Docker wordt gedistribueerd onder de Apache 2.0-licentie.

Docker-architectuur

Docker maakt gebruik van een client-server-architectuur. De Docker-client communiceert met de Docker-daemon, die de last van het maken, uitvoeren en distribueren van uw containers op zich neemt. Zowel de client als de server kunnen op hetzelfde systeem draaien. U kunt de client verbinden met een externe docker-daemon. De client en server communiceren via een socket of een RESTful API.

Docker begrijpen

Docker-daemon

Zoals weergegeven in het diagram, draait de daemon op de hostmachine. De gebruiker heeft geen directe interactie met de server, maar gebruikt hiervoor de client.

Docker-client

De Docker-client, het docker-programma, is de belangrijkste interface voor Docker. Het ontvangt opdrachten van de gebruiker en communiceert met de docker-daemon.

Binnen havenarbeider

Om te begrijpen waar Docker uit bestaat, moet u drie componenten kennen:

  • afbeeldingen
  • register
  • Containers

beeldspraak

De Docker-image is een alleen-lezen-sjabloon. De afbeelding kan bijvoorbeeld het Ubuntu-besturingssysteem met Apache en een applicatie daarop bevatten. Afbeeldingen worden gebruikt om containers te maken. Docker maakt het gemakkelijk om nieuwe afbeeldingen te maken, bestaande afbeeldingen bij te werken, of u kunt afbeeldingen downloaden die door andere mensen zijn gemaakt. Afbeeldingen zijn componenten van een docker-build.

Registreren

In het Docker-register worden afbeeldingen opgeslagen. Er zijn openbare en privéregisters waaruit u afbeeldingen kunt downloaden of uploaden. Een openbaar Docker-register is Docker-hub. Er is een enorme verzameling afbeeldingen opgeslagen. Zoals u weet, kunt u afbeeldingen door uzelf maken of kunt u afbeeldingen gebruiken die door anderen zijn gemaakt. Registers zijn een distributiecomponent.

containers

Containers zijn vergelijkbaar met mappen. Containers bevatten alles wat de applicatie nodig heeft om te draaien. Elke container is gemaakt op basis van een afbeelding. Containers kunnen worden gemaakt, gestart, gestopt, gemigreerd of verwijderd. Elke container is geïsoleerd en biedt een veilig platform voor de applicatie. Containers zijn onderdeel van het werk.

Dus hoe werkt Docker?

Tot nu toe weten we dat:

  • we kunnen afbeeldingen maken waarin onze applicaties zich bevinden;
  • we kunnen containers maken van afbeeldingen om applicaties uit te voeren;
  • We kunnen afbeeldingen distribueren via Docker Hub of een ander afbeeldingsregister.

Laten we eens kijken hoe deze componenten in elkaar passen.

Hoe werkt het beeld?

We weten al dat een afbeelding een alleen-lezen sjabloon is waaruit een container wordt gemaakt. Elke afbeelding bestaat uit een reeks niveaus. Docker-gebruik unie bestandssysteem om deze niveaus in één beeld te combineren. Met het Union-bestandssysteem kunnen bestanden en mappen van verschillende bestandssystemen (verschillende takken) transparant overlappen, waardoor een samenhangend bestandssysteem ontstaat.

Een van de redenen waarom Docker licht van gewicht is, is omdat het dergelijke lagen gebruikt. Wanneer u de afbeelding wijzigt, bijvoorbeeld bij het bijwerken van een applicatie, wordt er een nieuwe laag gemaakt. Dus zonder de hele afbeelding te vervangen of opnieuw op te bouwen, zoals bij een virtuele machine, wordt alleen de laag toegevoegd of bijgewerkt. En u hoeft niet de hele nieuwe afbeelding te distribueren; alleen de update wordt gedistribueerd, waardoor het gemakkelijker en sneller wordt om afbeeldingen te distribueren.

De kern van elk beeld is een basisbeeld. Bijvoorbeeld ubuntu, de basisafbeelding van Ubuntu, of fedora, de basisafbeelding van de Fedora-distributie. U kunt afbeeldingen ook gebruiken als basis voor het maken van nieuwe afbeeldingen. Als u bijvoorbeeld een Apache-image heeft, kunt u deze gebruiken als basisimage voor uw webapplicaties.

Opmerking! Docker haalt doorgaans afbeeldingen op uit het Docker Hub-register.

Op basis van deze basisimages kunnen Docker-images worden gemaakt; we noemen de stappen om deze images te maken instructies. Elke instructie creëert een nieuw beeld of niveau. De instructies zijn als volgt:

  • opdracht uitvoeren
  • een bestand of map toevoegen
  • het creëren van een omgevingsvariabele
  • instructies over wat er moet worden uitgevoerd wanneer de container van deze afbeelding wordt gestart

Deze instructies worden opgeslagen in een bestand Dockerfile. Docker leest dit DockerfileWanneer u de afbeelding bouwt, voert u deze instructies uit en retourneert u de uiteindelijke afbeelding.

Hoe werkt het docker-register?

Het register is een opslagplaats voor docker-images. Zodra de image is gemaakt, kunt u deze publiceren in het openbare Docker Hub-register of in uw persoonlijke register.

Met de docker-client kunt u zoeken naar reeds gepubliceerde afbeeldingen en deze downloaden naar uw docker-machine om containers te maken.

Docker Hub biedt openbare en privé-imageopslagplaatsen. Het zoeken en downloaden van afbeeldingen uit openbare opslagplaatsen is voor iedereen beschikbaar. De inhoud van privéopslagplaatsen wordt niet opgenomen in de zoekresultaten. En alleen u en uw gebruikers kunnen deze afbeeldingen ontvangen en er containers van maken.

Hoe werkt een container?

Een container bestaat uit een besturingssysteem, gebruikersbestanden en metadata. Zoals we weten, wordt elke container gemaakt op basis van een afbeelding. Deze afbeelding vertelt docker wat er in de container zit, welk proces moet worden gestart, wanneer de container start en andere configuratiegegevens. De Docker-installatiekopie is alleen-lezen. Wanneer docker een container start, creëert het een lees-/schrijflaag bovenop de afbeelding (met behulp van het union-bestandssysteem zoals eerder vermeld) waarin de applicatie kan worden uitgevoerd.

Wat gebeurt er als de container start?

Of gebruik het programma docker, of met behulp van de RESTful API, vertelt de docker-client de docker-daemon om de container te starten.

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

Laten we deze opdracht eens bekijken. De client wordt gestart met behulp van de opdracht docker, met optie run, waarin staat dat er een nieuwe container zal worden gelanceerd. De minimale vereisten voor het uitvoeren van een container zijn de volgende kenmerken:

  • welke afbeelding u moet gebruiken om de container te maken. In ons geval ubuntu
  • de opdracht die u wilt uitvoeren wanneer de container wordt gestart. In ons geval /bin/bash

Wat gebeurt er onder de motorkap als we dit commando uitvoeren?

Docker doet in volgorde het volgende:

  • downloadt de ubuntu-afbeelding: docker controleert op beschikbaarheid van afbeeldingen ubuntu op de lokale computer, en als het er niet is, download het dan van Docker-hub. Als er een afbeelding is, wordt deze gebruikt om een ​​container te maken;
  • maakt een container aan: wanneer de afbeelding wordt ontvangen, gebruikt docker deze om een ​​container te maken;
  • initialiseert het bestandssysteem en koppelt het alleen-lezen niveau: de container wordt gemaakt in het bestandssysteem en de afbeelding wordt toegevoegd aan het alleen-lezen-niveau;
  • initialiseert het netwerk/de brug: creëert een netwerkinterface waarmee docker kan communiceren met de hostmachine;
  • Het IP-adres instellen: vindt en stelt het adres in;
  • Start het opgegeven proces: lanceert uw applicatie;
  • Verwerkt en produceert output van uw applicatie: verbindt en registreert de standaard invoer-, uitvoer- en foutenstroom van uw toepassing, zodat u kunt volgen hoe uw toepassing presteert.

Je hebt nu een werkende container. U kunt uw container beheren en communiceren met uw applicatie. Wanneer u besluit de toepassing te stoppen, verwijdert u de container.

Gebruikte technologieën

Docker is geschreven in Go en gebruikt enkele functies van de Linux-kernel om de bovenstaande functionaliteit te implementeren.

Naamruimten

Docker maakt gebruik van technologie namespaces om geïsoleerde werkruimtes te organiseren, die we containers noemen. Wanneer we een container starten, maakt docker een set naamruimten voor die container.

Hierdoor ontstaat een geïsoleerde laag, waarbij elk aspect van de container in zijn eigen naamruimte draait en geen toegang heeft tot het externe systeem.

Lijst met enkele naamruimten die Docker gebruikt:

  • pid: om het proces te isoleren;
  • netto: voor het beheren van netwerkinterfaces;
  • ipc: om IPC-middelen te beheren. (ICP: InterProcess-communicatie);
  • mnd: om koppelpunten te beheren;
  • UTC: om de kernel te isoleren en de versiegeneratie te controleren (UTC: Unix timesharing-systeem).

Controlegroepen

Docker maakt ook gebruik van technologie cgroups of controlegroepen. De sleutel tot het geïsoleerd uitvoeren van een applicatie is om de applicatie alleen te voorzien van de bronnen die u wilt bieden. Dit zorgt ervoor dat de containers goede buren zullen zijn. Met stuurgroepen kunt u beschikbare hardwarebronnen delen en, indien nodig, limieten en beperkingen instellen. Beperk bijvoorbeeld de mogelijke hoeveelheid geheugen voor de container.

Union-bestandssysteem

Union File System of UnionFS is een bestandssysteem dat werkt door lagen te creëren, waardoor het zeer licht en snel is. Docker gebruikt UnionFS om de blokken te maken waaruit de container is opgebouwd. Docker kan verschillende varianten van UnionFS gebruiken, waaronder: AUFS, btrfs, vfs en DeviceMapper.

Containerformaten

Docker combineert deze componenten in een wrapper die we het containerformaat noemen. Het standaardformaat wordt aangeroepen libcontainer. Docker ondersteunt ook het traditionele containerformaat op Linux LXC. In de toekomst ondersteunt Docker mogelijk andere containerformaten. Bijvoorbeeld integratie met BSD Jails of Solaris Zones.

Bron: www.habr.com

Voeg een reactie