Docker begrijpen

Al enkele maanden gebruik ik Docker om het proces van ontwikkeling en levering van webprojecten te structureren. Ik bied de lezers van 'Habrahabr' de vertaling van een inleidend artikel over Docker aan — ā€˜Understanding Docker’.

Wat is Docker?

Docker is een open platform voor de ontwikkeling, levering en uitrol van toepassingen. Docker is ontworpen voor het sneller implementeren van uw toepassingen. Met Docker kunt u uw toepassing scheiden van uw infrastructuur en de infrastructuur behandelen als een beheerde toepassing. Docker helpt u uw code sneller uit te rollen, sneller te testen, sneller toepassingen uit te rollen en de tijd tussen het schrijven en het uitvoeren van de code te verkorten. Docker doet dit met behulp van een lichtgewicht containervirtualisatieplatform, met processen en hulpmiddelen die helpen bij het beheren en uitrollen van uw toepassingen.

In wezen stelt Docker u in staat om vrijwel elke toepassing veilig te isoleren binnen een container. Veilige isolatie maakt het mogelijk om meerdere containers tegelijk op ƩƩn host te draaien. De lichte aard van de container, die zonder extra belasting van een hypervisor draait, stelt u in staat om meer uit uw hardware te halen.

Het platform en de middelen voor containervirtualisatie kunnen nuttig zijn in de volgende gevallen:

  • het verpakken van uw toepassing (en de gebruikte componenten) in Docker-containers;
  • het verspreiden en leveren van deze containers aan uw teams voor ontwikkeling en testing;
  • het uitrollen van deze containers naar uw producties, zowel in datacenters als in de cloud.

Waarvoor kan ik Docker gebruiken?

Snelle uitrol van uw toepassingen

Docker is perfect voor het organiseren van de ontwikkelingscyclus. Docker stelt ontwikkelaars in staat om lokale containers met toepassingen en diensten te gebruiken. Dit maakt later integratie mogelijk met het proces van continue integratie en uitrol (continuous integration and deployment workflow).

Bijvoorbeeld, uw ontwikkelaars schrijven code lokaal en delen hun ontwikkelstack (verzameling van Docker-images) met collega's. Wanneer ze klaar zijn, sturen ze de code en containers naar de testomgeving en voeren ze de benodigde tests uit. Vanaf de testomgeving kunnen ze de code en images naar de productieomgeving sturen.

Eenvoudigere uitrol en implementatie

Het op containers gebaseerde Docker-platform maakt het gemakkelijk om uw lading te verplaatsen. Docker-containers kunnen zowel op uw lokale machine, zowel fysiek als virtueel in een datacenter, als in de cloud draaien.

De draagbaarheid en het lichte karakter van Docker maken het eenvoudig om uw lading dynamisch te beheren. U kunt Docker gebruiken om uw applicatie of services te implementeren of te beƫindigen. De snelheid van Docker maakt dit bijna in real-time mogelijk.

Hoge belasting en meer ladingen

Docker is lichtgewicht en snel. Het biedt een duurzame, kosteneffectieve vervanging voor virtuele machines op basis van hypervisors. Het is bijzonder nuttig in omgevingen met hoge belasting, bijvoorbeeld bij het opzetten van een eigen cloud of platform-as-a-service. Maar het is ook nuttig voor kleine en middelgrote applicaties, wanneer u meer wilt halen uit de beschikbare middelen.

Belangrijkste componenten van Docker

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 verspreid onder de Apache 2.0-licentie.

Architectuur van Docker

Docker maakt gebruik van een client-serverarchitectuur. De Docker-client communiceert met de Docker-daemon, die de verantwoordelijkheid draagt voor het creƫren, draaien en verdelen van uw containers. Zowel client als server kunnen op hetzelfde systeem draaien; u kunt de client ook verbinden met een externe Docker-daemon. 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 communiceert niet rechtstreeks met de server, maar maakt daarvoor gebruik van de client.

Docker-client

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

Binnen Docker

Om te begrijpen waaruit Docker bestaat, moet u weten over drie componenten:

  • images
  • registries
  • containers

Afbeeldingen

Een Docker-image is een read-only sjabloon. Bijvoorbeeld, een image kan de Ubuntu-omgeving met Apache en een toepassing daarop bevatten. Images worden gebruikt voor het creƫren van containers. Docker maakt het eenvoudig om nieuwe images te maken, bestaande te updaten, of je kunt images downloaden die door anderen zijn gemaakt. Images vormen een onderdeel van de Docker-assemblage.

Registratie

De Docker-register slaat images op. Er zijn publieke en private registers waaruit je images kunt downloaden of uploaden. Het publieke Docker-register is Docker Hub. Hier wordt een enorme collectie images opgeslagen. Zoals je weet, kunnen images door jou zijn gemaakt of je kunt images gebruiken die door anderen zijn gemaakt. Registers zijn een onderdeel van de distributie.

Containers

Containers lijken op directories. In containers staat alles wat nodig is voor de werking van de toepassing. Elke container wordt gemaakt uit een image. Containers kunnen worden gemaakt, gestart, gestopt, verplaatst of verwijderd. Elke container is geĆÆsoleerd en vormt een veilige omgeving voor de toepassing. Containers zijn een onderdeel van de werking.

Hoe werkt Docker?

Wat we al weten, is dat:

  • we images kunnen maken waarin onze toepassingen zijn opgenomen;
  • we containers kunnen creĆ«ren uit images om toepassingen uit te voeren;
  • we images kunnen distribueren via Docker Hub of een ander image-register.

Laten we kijken hoe deze componenten samenkomen.

Hoe werkt een image?

We weten al dat een image een read-only sjabloon is waaruit een container wordt gemaakt. Elke image bestaat uit een set niveaus. Docker gebruikt de union file system om deze niveaus te combineren tot ƩƩn image. De union file system laat bestanden en directories uit verschillende file systems (verschillende takken) transparant overlappen, waardoor een coherente file system ontstaat.

Een van de redenen waarom Docker lichtgewicht is, is het gebruik van dergelijke niveaus. Wanneer je een image wijzigt, bijvoorbeeld door een toepassing bij te werken, wordt er een nieuw niveau aangemaakt. Zo, zonder de gehele image te vervangen of opnieuw te bouwen, zoals je mogelijk zou moeten doen met een virtuele machine, wordt alleen het niveau toegevoegd of geüpdatet. En je hoeft niet de hele nieuwe image te verspreiden, alleen de update wordt verspreid, wat het gemakkelijker en sneller maakt om images te distribueren.

Elke afbeelding is gebaseerd op een basisafbeelding. Bijvoorbeeld, ubuntu, de basisafbeelding van Ubuntu, of fedora, de basisafbeelding van de Fedora-distributie. U kunt ook afbeeldingen gebruiken als basis voor het creƫren van nieuwe afbeeldingen. Bijvoorbeeld, als u een afbeelding van apache heeft, kunt u deze gebruiken als basisafbeelding voor uw webapplicaties.

Opmerking! Docker haalt meestal afbeeldingen van de Docker Hub-register.

Docker-afbeeldingen kunnen worden gemaakt uit deze basisafbeeldingen; de stappen voor het maken van deze afbeeldingen noemen we instructies. Elke instructie creƫert een nieuwe afbeelding of laag. De instructies zijn de volgende acties:

  • een opdracht uitvoeren
  • een bestand of directory toevoegen
  • een omgevingsvariabele aanmaken
  • aanwijzingen geven over wat te starten wanneer de container van deze afbeelding wordt gestart

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

Hoe werkt het Docker-register?

Een register is een opslagplaats voor Docker-afbeeldingen. Na het maken van een afbeelding kunt u deze publiceren op de openbare Docker Hub-register of op uw persoonlijke register.

Met de Docker-client kunt u al gepubliceerde afbeeldingen zoeken en deze naar uw machine met Docker downloaden om containers te creƫren.

Docker Hub biedt openbare en privƩ-opslagplaatsen voor afbeeldingen. Zoeken en downloaden van afbeeldingen uit openbare opslagplaatsen is beschikbaar voor iedereen. De inhoud van privƩ-opslagplaatsen komt niet in de zoekresultaten. Alleen u en uw gebruikers kunnen deze afbeeldingen ontvangen en containers uit hen maken.

Hoe werkt een container?

Een container bestaat uit een besturingssysteem, gebruikersbestanden en metadata. Zoals we weten, wordt elke container gemaakt uit een afbeelding. Deze afbeelding vertelt Docker wat zich in de container bevindt, welk proces moet worden uitgevoerd wanneer de container wordt gestart en andere configuratiegegevens. Docker-afbeelding is alleen-lezen. Wanneer Docker een container start, creƫert het een schrijfbare laag bovenop de afbeelding (met behulp van een union file system, zoals eerder aangegeven), waarin de applicatie kan draaien.

Wat gebeurt er wanneer een container wordt gestart?

Of via een programma docker, of via 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 de opdracht docker, met de optie (hetzelfde proces als, die aangeeft dat er een nieuwe container zal worden gestart. De minimale vereisten voor het starten van een container zijn de volgende attributen:

  • welk beeld te gebruiken voor het maken van de container. In ons geval ubuntu
  • de opdracht die u wilt uitvoeren wanneer de container wordt gestart. In ons geval /bin/bash

Wat gebeurt er eigenlijk onder de motorkap wanneer we deze opdracht uitvoeren?

Docker doet het volgende:

  • downloadt het beeld ubuntu: docker controleert of het beeld ubuntu op de lokale machine aanwezig is, en als dat niet het geval is, downloadt het het van Docker Hub. Als het beeld er al is, wordt het gebruikt om de container te maken;
  • maakt de container: wanneer het beeld is verkregen, gebruikt docker het om de container te maken;
  • initialiseert het bestandssysteem en monteert het read-only niveau: de container is gemaakt in het bestandssysteem en het read-only niveau is toegevoegd aan het beeld;
  • initialiseert het netwerk/brug: maakt een netwerkinterface die docker in staat stelt om met de hostmachine te communiceren;
  • Stelt het IP-adres in: ziet het adres en stelt het in;
  • Start het opgegeven proces: start uw applicatie;
  • Verwerkt en geeft de uitvoer van uw applicatie weer: verbinding maken en standaardinvoer, -uitvoer en foutstroom van uw applicatie loggen, zodat u kunt volgen hoe uw applicatie werkt.

Nu heeft u een werkende container. U kunt uw container beheren en interactie hebben met uw applicatie. Wanneer u besluit de applicatie te stoppen, verwijdert u de container.

Gebruikte technologieƫn

Docker is geschreven in Go en maakt gebruik van enkele mogelijkheden van de Linux-kernel om de hierboven beschreven functionaliteit te realiseren.

Namespaces

Docker gebruikt de technologie namespaces om geĆÆsoleerde werkruimten te organiseren, die we containers noemen. Wanneer we een container starten, maakt docker een set namespaces voor deze container aan.

Dit creëert een geïsoleerd niveau, elk aspect van de container draait in zijn eigen namespace en heeft geen toegang tot het externe systeem.

Een lijst van enkele namespaces die docker gebruikt:

  • pid: voor procesisolatie;
  • net: voor het beheren van netwerkinterfaces;
  • ipc: voor het beheren van IPC-bronnen. (IPC: InterProcess Communication);
  • mnt: voor het beheren van mount-punten;
  • utc: voor het isoleren van de kernel en versiegeneratiecontrole (UTC: Unix Time Sharing System).

Control groups

Docker gebruikt ook de technologie cgroups of controle groepen. De sleutel tot het functioneren van de applicatie in isolatie is het bieden van alleen die middelen aan de applicatie die u wilt bieden. Dit garandeert dat de containers goede buren zullen zijn. Controle groepen maken het mogelijk om beschikbare hardwarebronnen te scheiden en indien nodig limieten en restricties in te stellen. Bijvoorbeeld, het beperken van de mogelijk beschikbare hoeveelheid geheugen voor een container.

Union File System

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

Containerformaten

Docker combineert deze componenten in een omhulsel dat we het containerformaat noemen. Het standaardformaat wordt aangeduid als libcontainer. Daarnaast ondersteunt Docker het traditionele containerformaat in Linux met behulp van LXC. In de toekomst zou Docker mogelijk andere containerformaten kunnen ondersteunen, bijvoorbeeld door integratie met BSD Jails of Solaris Zones.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster