Înțelegerea Docker

Folosesc Docker de câteva luni pentru a structura procesul de dezvoltare/livrare a proiectelor web. Ofer cititorilor Habrakhabr o traducere a articolului introductiv despre docker - „Înțelegerea dockerului”.

Ce este docker?

Docker este o platformă deschisă pentru dezvoltarea, livrarea și operarea aplicațiilor. Docker este conceput pentru a vă livra aplicațiile mai rapid. Cu docker, vă puteți decupla aplicația de infrastructură și puteți trata infrastructura ca pe o aplicație gestionată. Docker vă ajută să expediați codul mai rapid, să testați mai rapid, să expediați mai rapid aplicațiile și să reduceți timpul dintre scrierea codului și rularea codului. Docker face acest lucru printr-o platformă ușoară de virtualizare a containerelor, folosind procese și utilități care vă ajută să vă gestionați și să găzduiți aplicațiile.

În esență, docker vă permite să rulați aproape orice aplicație, izolat în siguranță într-un container. Izolarea securizată vă permite să rulați mai multe containere pe aceeași gazdă în același timp. Natura ușoară a containerului, care funcționează fără sarcina suplimentară a unui hipervizor, vă permite să profitați mai mult de hardware-ul dvs.

Platforma și instrumentele de virtualizare a containerelor pot fi utile în următoarele cazuri:

  • ambalarea aplicației dvs. (și a componentelor pe care le utilizați) în containere docker;
  • distribuirea și livrarea acestor containere către echipele dumneavoastră pentru dezvoltare și testare;
  • așezarea acestor containere pe site-urile dvs. de producție, atât în ​​centrele de date, cât și în cloud.

Pentru ce pot folosi docker?

Publicați rapid aplicațiile dvs

Docker este excelent pentru organizarea ciclului de dezvoltare. Docker permite dezvoltatorilor să ruleze containere locale cu aplicații și servicii. Ceea ce vă permite ulterior să vă integrați cu procesul de integrare continuă și flux de lucru de implementare.

De exemplu, dezvoltatorii dvs. scriu cod local și își partajează stiva de dezvoltare (un set de imagini Docker) colegilor. Când sunt gata, împing codul și containerele la locul de testare și execută toate testele necesare. De pe site-ul de testare, aceștia pot trimite cod și imagini către producție.

Așezare și desfășurare mai ușoară

Platforma bazată pe containere docker facilitează portarea încărcăturii dvs. utile. Containerele Docker pot rula pe mașina dvs. locală, fie reală, fie pe o mașină virtuală dintr-un centru de date sau în cloud.

Portabilitatea și natura ușoară a dockerului facilitează gestionarea dinamică a volumului de lucru. Puteți folosi docker pentru a implementa sau a închide aplicația sau serviciile. Viteza dockerului permite ca acest lucru să se facă aproape în timp real.

Sarcini mai mari și mai multe sarcini utile

Docker este ușor și rapid. Oferă o alternativă rezistentă și rentabilă la mașinile virtuale bazate pe hypervisor. Este util în special în mediile cu încărcare mare, de exemplu, atunci când vă creați propriul cloud sau platform-as-service. Dar este util și pentru aplicațiile de dimensiuni mici și mijlocii atunci când doriți să profitați mai mult din resursele pe care le aveți.

Componentele principale Docker

Docker este format din două componente principale:

  • Docker: o platformă de virtualizare open source;
  • Docker Hub: platforma noastră ca serviciu pentru distribuirea și gestionarea containerelor docker.

Notă! Docker este distribuit sub licența Apache 2.0.

Arhitectura Docker

Docker utilizează o arhitectură client-server. Clientul Docker comunică cu demonul Docker, care își asumă sarcina de a crea, rula și distribui containerele dvs. Atât clientul, cât și serverul pot rula pe același sistem, puteți conecta clientul la un daemon docker la distanță. Clientul și serverul comunică printr-un socket sau un API RESTful.

Înțelegerea Docker

Daemonul Docker

După cum se arată în diagramă, demonul rulează pe mașina gazdă. Utilizatorul nu interacționează direct cu serverul, ci folosește clientul pentru aceasta.

Client Docker

Clientul Docker, programul docker, este interfața principală pentru Docker. Acesta primește comenzi de la utilizator și interacționează cu demonul docker.

În interiorul dockerului

Pentru a înțelege în ce constă docker, trebuie să știți despre trei componente:

  • imagini
  • registru
  • Containere

imagini

Imaginea Docker este un șablon numai pentru citire. De exemplu, imaginea poate conține sistemul de operare Ubuntu cu Apache și o aplicație pe acesta. Imaginile sunt folosite pentru a crea containere. Docker facilitează crearea de noi imagini, actualizarea celor existente sau puteți descărca imagini create de alte persoane. Imaginile sunt componente ale unei versiuni docker.

Înregistra

Registrul Docker stochează imagini. Există registre publice și private din care puteți descărca sau încărca imagini. Un registru Docker public este Hub Docker. Există o colecție imensă de imagini stocate acolo. După cum știți, imaginile pot fi create de dvs. sau puteți utiliza imagini create de alții. Registrele sunt o componentă de distribuție.

containere

Containerele sunt similare directoarelor. Containerele conțin tot ce are nevoie aplicația pentru a rula. Fiecare container este creat dintr-o imagine. Containerele pot fi create, pornite, oprite, migrate sau șterse. Fiecare container este izolat și oferă o platformă sigură pentru aplicație. Containerele sunt componente ale lucrării.

Deci, cum funcționează Docker?

Până acum știm că:

  • putem crea imagini în care se află aplicațiile noastre;
  • putem crea containere din imagini pentru a rula aplicații;
  • Putem distribui imagini prin Docker Hub sau alt registru de imagini.

Să vedem cum se potrivesc aceste componente.

Cum funcționează imaginea?

Știm deja că o imagine este un șablon numai pentru citire din care este creat un container. Fiecare imagine constă dintr-un set de niveluri. Docker folosește sistem de fișiere uniune pentru a combina aceste niveluri într-o singură imagine. Sistemul de fișiere Union permite fișierelor și directoarelor din diferite sisteme de fișiere (diferite ramuri) să se suprapună transparent, creând un sistem de fișiere coerent.

Unul dintre motivele pentru care docker este ușor este că folosește straturi ca acesta. Când modificați imaginea, cum ar fi actualizarea unei aplicații, este creat un nou strat. Deci, fără a înlocui întreaga imagine sau a o reconstrui, așa cum s-ar putea să aveți de-a face cu o mașină virtuală, doar stratul este adăugat sau actualizat. Și nu trebuie să distribuiți întreaga imagine nouă, doar actualizarea este distribuită, ceea ce face mai ușor și mai rapid distribuirea imaginilor.

În centrul fiecărei imagini se află o imagine de bază. De exemplu, ubuntu, imaginea de bază a Ubuntu sau fedora, imaginea de bază a distribuției Fedora. De asemenea, puteți utiliza imagini ca bază pentru crearea de noi imagini. De exemplu, dacă aveți o imagine Apache, o puteți utiliza ca imagine de bază pentru aplicațiile dvs. web.

Notă! Docker extrage de obicei imagini din registrul Docker Hub.

Imaginile Docker pot fi create din aceste imagini de bază; numim instrucțiunile pașilor pentru a crea aceste imagini. Fiecare instrucțiune creează o nouă imagine sau nivel. Instrucțiunile vor fi următoarele:

  • executa comanda
  • adăugarea unui fișier sau director
  • crearea unei variabile de mediu
  • instrucțiuni despre ce să rulați când containerul acestei imagini este lansat

Aceste instrucțiuni sunt stocate într-un fișier Dockerfile. Docker citește asta Dockerfile, când construiți imaginea, execută aceste instrucțiuni și returnează imaginea finală.

Cum funcționează registrul docker?

Registrul este un depozit pentru imaginile docker. Odată ce imaginea este creată, o puteți publica în registrul public Docker Hub sau în registrul personal.

Cu clientul docker, puteți căuta imagini deja publicate și le puteți descărca pe mașina dvs. docker pentru a crea containere.

Docker Hub oferă depozite de imagini publice și private. Căutarea și descărcarea imaginilor din depozitele publice este disponibilă pentru toată lumea. Conținutul depozitelor private nu este inclus în rezultatele căutării. Și numai dvs. și utilizatorii dvs. puteți primi aceste imagini și puteți crea containere din ele.

Cum funcționează un container?

Un container constă dintr-un sistem de operare, fișiere utilizator și metadate. După cum știm, fiecare container este creat dintr-o imagine. Această imagine îi spune dockerului ce este în container, ce proces să înceapă, când pornește containerul și alte date de configurare. Imaginea Docker este doar pentru citire. Când docker pornește un container, acesta creează un strat de citire/scriere deasupra imaginii (folosind sistemul de fișiere union așa cum s-a menționat anterior) în care aplicația poate fi rulată.

Ce se întâmplă când pornește containerul?

Sau folosind programul docker, sau folosind API-ul RESTful, clientul docker îi spune demonului docker să pornească containerul.

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

Să aruncăm o privire la această comandă. Clientul este lansat folosind comanda docker, cu optiune run, care spune că va fi lansat un nou container. Cerințele minime pentru a rula un container sunt următoarele atribute:

  • ce imagine să folosiți pentru a crea containerul. În cazul nostru ubuntu
  • comanda pe care doriți să o rulați când containerul este pornit. În cazul nostru /bin/bash

Ce se întâmplă sub capotă când rulăm această comandă?

Docker, în ordine, face următoarele:

  • descarcă imaginea ubuntu: docker verifică disponibilitatea imaginii ubuntu pe mașina locală și, dacă nu este acolo, descărcați-l de pe Hub Docker. Dacă există o imagine, o folosește pentru a crea un container;
  • creează un container: când imaginea este primită, docker o folosește pentru a crea un container;
  • inițializează sistemul de fișiere și montează nivelul de numai citire: containerul este creat în sistemul de fișiere și imaginea este adăugată la nivelul de numai citire;
  • inițializează rețeaua/puntea: creează o interfață de rețea care permite docker să comunice cu mașina gazdă;
  • Setarea adresei IP: găsește și stabilește adresa;
  • Începe procesul specificat: lansează aplicația dvs.;
  • Procesează și produce rezultate din aplicația dvs.: conectează și înregistrează fluxul standard de intrare, ieșire și erori ale aplicației dvs., astfel încât să puteți urmări performanța aplicației dvs.

Acum aveți un container funcțional. Puteți să vă gestionați containerul, să interacționați cu aplicația dvs. Când decideți să opriți aplicația, ștergeți containerul.

Tehnologii utilizate

Docker este scris în Go și utilizează unele caracteristici ale nucleului Linux pentru a implementa funcționalitatea de mai sus.

Spații de nume

Docker folosește tehnologia namespaces pentru a organiza spații de lucru izolate, pe care le numim containere. Când pornim un container, docker creează un set de spații de nume pentru acel container.

Acest lucru creează un strat izolat, fiecare aspect al containerului rulând în propriul spațiu de nume și neavând acces la sistemul extern.

Lista unor spații de nume pe care le folosește docker:

  • pid: pentru a izola procesul;
  • net: pentru gestionarea interfețelor de rețea;
  • ipc: pentru a gestiona resursele IPC. (ICP: Comunicare InterProccess);
  • mnt: pentru a gestiona punctele de montare;
  • UTC: pentru a izola nucleul și generarea versiunii de control (UTC: sistem de partajare a timpului Unix).

Grupuri de control

Docker folosește și tehnologia cgroups sau grupuri de control. Cheia pentru a rula o aplicație în mod izolat este să furnizați aplicației doar resursele pe care doriți să le furnizați. Acest lucru asigură că containerele vor fi vecine bune. Grupurile de control vă permit să partajați resursele hardware disponibile și, dacă este necesar, să setați limite și restricții. De exemplu, limitați cantitatea posibilă de memorie pentru container.

Sistemul de fișiere Union

Union File Sysem sau UnionFS este un sistem de fișiere care funcționează prin crearea de straturi, făcându-l foarte ușor și rapid. Docker folosește UnionFS pentru a crea blocurile din care este construit containerul. Docker poate folosi mai multe variante de UnionFS, inclusiv: AUFS, btrfs, vfs și DeviceMapper.

Formate de containere

Docker combină aceste componente într-un înveliș pe care îl numim format container. Formatul implicit este numit libcontainer. Docker acceptă, de asemenea, formatul tradițional de container pe Linux folosind LXC. În viitor, Docker poate accepta alte formate de containere. De exemplu, integrarea cu BSD Jails sau Solaris Zones.

Sursa: www.habr.com

Adauga un comentariu