Forstå Docker

Jeg har i flere måneder brugt Docker til at strukturere udviklings- og leveringsprocessen for webprojekter. Jeg tilbyder læserne på «Habrhabr» en oversættelse af den introducerende artikel om Docker — «Forståelse af Docker».

Hvad er Docker?

Docker er en åben platform til udvikling, levering og drift af applikationer. Docker er designet til hurtigere at udrulle dine applikationer. Med Docker kan du adskille din applikation fra din infrastruktur og behandle infrastrukturen som en administreret applikation. Docker hjælper med at udrulle din kode hurtigere, teste hurtigere, udrulle applikationer hurtigere, og reducere tiden mellem at skrive kode og køre kode. Docker gør dette ved hjælp af en letvægts container-virtualiseringsplatform, der bruger processer og værktøjer, som hjælper med at styre og udrulle dine applikationer.

I sin kerne tillader Docker, at næsten enhver applikation kører sikkert isoleret i en container. Den sikre isolation gør, at du kan køre mange containere samtidig på én vært. Den letvægts natur af en container, der kører uden ekstra belastning fra en hypervisor, gør det muligt for dig at få mere ud af dit hardware.

Platformen og værktøjerne til container-virtualisering kan være nyttige i følgende tilfælde:

  • pakning af din applikation (og de anvendte komponenter) i Docker-containere;
  • distribuering og levering af disse containere til dit team til udvikling og test;
  • udrulning af disse containere på dine produktionsmiljøer, både i datacentre og i skyen.

Hvad kan jeg bruge Docker til?

Hurtig udrulning af dine applikationer

Docker er fremragende til at organisere udviklingscyklussen. Docker tillader udviklere at bruge lokale containere med applikationer og tjenester. Dette muliggør integration med processen for kontinuerlig integration og udrulning (continuous integration and deployment workflow).

For eksempel skriver dine udviklere kode lokalt og deler deres udviklingsstak (sæt af Docker-billeder) med kollegerne. Når de er klar, sender de koden og containerne til testmiljøet og kører de nødvendige tests. Fra testmiljøet kan de sende kode og billeder til produktion.

En enklere udrulning og implementering

Den containerbaserede docker-platform gør det nemt at portere din belastning. Docker-containere kan køre på din lokale maskine, både på en fysisk og en virtuel maskine i datacenteret samt i skyen.

Portabiliteten og den lette natur af docker gør det muligt nemt at administrere din belastning dynamisk. Du kan bruge docker til at implementere eller nedskalere din applikation eller tjenester. Docker's hastighed gør dette muligt næsten i realtid.

Høje belastninger og flere nyttelaster

Docker er let og hurtig. Den tilbyder en bæredygtig, omkostningseffektiv alternativ til hypervisor-baserede virtuelle maskiner. Den er især nyttig under høje belastninger, som når man skaber sin egen sky eller platform som en service (platform-as-service). Men den er også nyttig til små og mellemstore applikationer, når du ønsker at få mere ud af de ressourcer, du har.

Hovedkomponenter i Docker

Docker består af to primære komponenter:

  • Docker: en open source virtualiseringsplatform;
  • Docker Hub: vores platform som en service til distribution og administration af docker-containere.

Bemærk! Docker distribueres under Apache 2.0 licensen.

Docker-arkitektur

Docker bruger en klient-server arkitektur. Docker-klienten kommunikerer med Docker-dæmonen, som håndterer oprettelsen, kørsel og distribution af dine containere. Begge, klient og server kan køre på det samme system, og du kan forbinde klienten til en fjern Docker-dæmon. Klienten og serveren kommunikerer via en socket eller gennem RESTful API.

Forstå Docker

Docker-dæmon

Som vist i diagrammet, kører dæmonen på værtsmaskinen. Brugeren interagerer ikke direkte med serveren, men bruger klienten til dette.

Docker-klient

Docker-klienten, programmet docker — er hovedgrænsefladen til Docker. Den modtager kommandoer fra brugeren og interagerer med docker-dæmonen.

Inde i docker

For at forstå, hvad Docker består af, skal du vide om tre komponenter:

  • billeder (images)
  • registries (registries)
  • containers

Billeder

Docker-image er en read-only skabelon. For eksempel kan en image indeholde operativsystemet Ubuntu med Apache og et program kørende derpå. Images bruges til at oprette containere. Docker gør det nemt at oprette nye images, opdatere eksisterende, eller du kan downloade images skabt af andre. Images er en byggesten i Docker.

Registrering

Docker-registreringen opbevarer images. Der findes offentlige og private registreringer, hvorfra man kan downloade eller uploade images. Den offentlige Docker-registrering er Docker Hub. Her findes der en enorm samling af images. Som du ved, kan images være skabt af dig, eller du kan bruge images skabt af andre. Registreringer er en distributionskomponent.

Containere

Containere ligner mapper. I containere findes alt det, der er nødvendigt for at køre et program. Hver container oprettes fra en image. Containere kan oprettes, startes, stoppes, flyttes eller slettes. Hver container er isoleret og fungerer som en sikker platform for programmet. Containere er en arbejdskomponent.

Hvordan fungerer Docker?

Indtil videre ved vi, at:

  • vi kan oprette images, der indeholder vores applikationer;
  • vi kan oprette containere fra images til at køre applikationer;
  • vi kan distribuere images via Docker Hub eller en anden image-registrering.

Lad os se på, hvordan disse komponenter hænger sammen.

Hvordan fungerer en image?

Vi ved allerede, at en image er en read-only skabelon, som en container oprettes fra. Hver image består af et sæt lag. Docker bruger union file system til at kombinere disse lag til en enkelt image. Union file system gør det muligt for filer og mapper fra forskellige filsystemer (forskellige grene) at overlappe transparent og skabe et sammenhængende filsystem.

En af grundene til, at Docker er letvægts, er brugen af sådanne lag. Når du ændrer en image, for eksempel opdaterer et program, oprettes et nyt lag. På den måde, uden at erstatte hele imaget eller opbygge det igen, som du måske skal gøre med en virtuel maskine, tilføjes eller opdateres kun laget. Og du behøver ikke at distribuere hele den nye image, kun opdateringen distribueres, hvilket gør det lettere og hurtigere at distribuere images.

I bunden af hver containerbillede findes der et grundlæggende billede. For eksempel ubuntu, det grundlæggende billede fra Ubuntu, eller fedora, det grundlæggende billede fra Fedora-distributionen. Du kan også bruge billeder som grundlag for at oprette nye billeder. Hvis du for eksempel har et billede af apache, kan du bruge det som grundlæggende billede for dine webapplikationer.

Bemærk! Docker henter normalt billeder fra Docker Hub-registret.

Docker-billeder kan oprettes ud fra disse grundlæggende billeder, og de trin, der beskriver oprettelsen af disse billeder, kalder vi instruktioner. Hver instruktion skaber et nyt billede eller niveau. De følgende handlinger vil være instruktioner:

  • kørsel af en kommando
  • tilføjelse af en fil eller mappe
  • oprettelse af en miljøvariabel
  • angivelse af hvad der skal køres, når containeren for dette billede startes

Disse instruktioner opbevares i en fil Dockerfile. Docker læser dette Dockerfile, når du bygger billedet, udfører disse instruktioner og returnerer det endelige billede.

Hvordan fungerer Docker-registret?

Registret er et lager for docker-billeder. Efter oprettelsen af et billede kan du publicere det i det offentlige Docker Hub-register eller i dit personlige register.

Ved hjælp af docker-klienten kan du søge efter allerede offentliggjorte billeder og downloade dem til din maskine med Docker for at oprette containere.

Docker Hub tilbyder offentlige og private lagerpladser for billeder. Søgning og download af billeder fra offentlige lagerpladser er tilgængeligt for alle. Indholdet af private lagerpladser vises ikke i søgeresultaterne. Kun du og dine brugere kan tilgå disse billeder og oprette containere ud fra dem.

Hvordan fungerer en container?

En container består af et operativsystem, brugerfiler og metadata. Som vi ved, oprettes hver container ud fra et billede. Dette billede fortæller Docker, hvad der er i containeren, hvilken proces der skal startes, når containeren startes, og andre konfigurationsdata. Docker-billedet er kun til læsning. Når Docker starter en container, opretter den et skrive-læsningsniveau ovenfor billedet (ved at bruge union-filsystemet, som nævnt før), hvor en applikation kan køre.

Hvad sker der, når en container startes?

Enten via programmet docker, eller via RESTful API'en, fortæller Docker-klienten Docker-demonen om at starte containeren.

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

Lad os se nærmere på denne kommando. Klienten startes med kommandoen docker, med optionen run, som angiver, at en ny container vil blive startet. De minimale krav for at starte en container er følgende attributter:

  • hvilket billede der skal bruges til at oprette containeren. I vores tilfælde ubuntu
  • den kommando, du ønsker at køre, når containeren er blevet startet. I vores tilfælde /bin/bash

Hvad sker der egentlig bag kulisserne, når vi kører denne kommando?

Docker gør følgende i rækkefølge:

  • henter billedet ubuntu: docker tjekker for billedet ubuntu på den lokale maskine, og hvis det ikke er der – downloader det fra Docker Hub. Hvis billedet allerede eksisterer, bruges det til at oprette containeren;
  • opretter container: når billedet er modtaget, bruger docker det til at oprette containeren;
  • initialiserer filsystemet og monterer read-only niveau: containeren er oprettet i filsystemet, og read-only niveauet er tilføjet billedet;
  • initialiserer netværk/bro: opretter et netværksinterface, der tillader docker at kommunikere med værtsmaskinen;
  • Indstilling af IP-adresse: finder og angiver adressen;
  • Starter den angivne proces: starter din applikation;
  • Behandler og viser output fra din applikation: tilslutter og logger standard input, output og fejlstrøm fra din applikation, så du kan overvåge, hvordan din applikation fungerer.

Nu har du en fungerende container. Du kan administrere din container, interagere med din applikation. Når du beslutter at stoppe applikationen, skal du slette containeren.

Anvendte teknologier

Docker er skrevet i Go og bruger nogle funktioner fra Linux-kernen for at implementere den ovenstående funktionalitet.

Namespaces

Docker bruger teknologien namespaces til at organisere isolerede arbejdsområder, som vi kalder containere. Når vi starter en container, skaber docker et sæt namespaces for denne container.

Dette skaber et isoleret lag, hvor hver aspekt af containeren kører i sit eget namespace og ikke har adgang til det eksterne system.

Her er en liste over nogle af de namespaces, som docker bruger:

  • pid: til isolation af processer;
  • net: til styring af netværksinterfaces;
  • ipc: til styring af IPC-ressourcer. (IPC: InterProcess Communication);
  • mnt: til styring af montering steder;
  • utc: til isolation af kernen og kontrol over versionsgenerering (UTC: Unix timesharing system).

Control groups (kontrolgrupper)

Docker bruger også teknologien cgroups eller kontrolgrupper. Nøglen til at køre applikationen isoleret er at give applikationen kun de ressourcer, du ønsker at give. Dette sikrer, at containere vil være gode naboer. Kontrolgrupper tillader opdeling af de tilgængelige hardware ressourcer og, hvis nødvendigt, at sætte grænser og begrænsninger. For eksempel at begrænse det mulige antal hukommelse til en container.

Union File System

Union File System eller UnionFS er et filsystem, der fungerer ved at skabe niveauer, hvilket gør det meget letvægts og hurtigt. Docker bruger UnionFS til at opbygge blokke, der danner en container. Docker kan bruge flere varianter af UnionFS, herunder: AUFS, btrfs, vfs og DeviceMapper.

Containerformater

Docker kombinerer disse komponenter i en wrapper, som vi kalder containerformatet. Det format, der bruges som standard, kaldes libcontainer. Docker understøtter også det traditionelle containerformat i Linux ved hjælp af LXC. I fremtiden kan Docker muligvis understøtte andre containerformater. For eksempel ved at integrere med BSD Jails eller Solaris Zones.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster