De câteva luni folosesc Docker pentru a structura procesul de dezvoltare/ livrare a proiectelor web. Ofer cititorilor „Habrhabr” traducerea articolului introductiv despre Docker — .
Ce este Docker?
Docker este o platformă deschisă pentru dezvoltarea, livrarea și operarea aplicațiilor. Docker este conceput pentru a lansa aplicațiile dvs. mai repede. Cu Docker, puteți separa aplicația dvs. de infrastructura dvs. și să tratați infrastructura ca pe o aplicație gestionată. Docker ajută la livrarea codului mai repede, testează mai rapid, lansează aplicațiile mai repede și reduce timpul dintre scrierea codului și rularea acestuia. Docker face acest lucru cu ajutorul unei platforme de virtualizare a containerelor ușoare, folosind procese și utilitare care ajută la gestionarea și livrarea aplicațiilor dumneavoastră.
La bază, Docker permite rularea aproape oricărei aplicații, izolate în siguranță într-un container. Izolarea sigură vă permite să rulați simultan mai multe containere pe un singur host. Natura ușoară a containerului, care rulează fără sarcini suplimentare ale hipervizorului, vă permite să obțineți mai mult de la hardware-ul dvs.
Platforma și instrumentele de virtualizare a containerelor pot fi utile în următoarele cazuri:
- ambalarea aplicației dvs. (și a componentelor utilizate) în containere Docker;
- distribuirea și livrarea acestor containere echipelor pentru dezvoltare și testare;
- lansarea acestor containere în producție, atât în centre de date, cât și în cloud.
Pentru ce pot folosi Docker?
Lansarea rapidă a aplicațiilor dvs.
Docker este perfect pentru organizarea ciclului de dezvoltare. Docker permite dezvoltatorilor să folosească containere locale cu aplicații și servicii. Aceasta permite integrarea ulterioară în procesul de integrare și livrare continue (continuous integration and deployment workflow).
De exemplu, dezvoltatorii dvs. scriu cod local și împărtășesc stiva de dezvoltare (setul de imagini Docker) cu colegii. Când sunt pregătiți, trimit codul și containerele pe o platformă de testare și rulează orice teste necesare. De pe platforma de testare, pot trimite codul și imaginile în producție.
O lansare și desfășurare mai simplă
Platforma bazată pe containere Docker permite portabilitatea ușoară a sarcinilor dumneavoastră utile. Containerele Docker pot rula atât pe mașina locală, fie fizică, fie pe o mașină virtuală în centrul de date, cât și în cloud.
Portabilitatea și natura ușoară a Docker-ului permit gestionarea dinamică a sarcinilor dumneavoastră. Puteți utiliza Docker pentru a desfășura sau a opri aplicația sau serviciile dumneavoastră. Viteza Docker-ului face ca acest lucru să fie posibil aproape în timp real.
Sarcini mari și mai multe sarcini utile
Docker este ușor și rapid. Oferă o alternativă durabilă și rentabilă la mașinile virtuale bazate pe hypervisor. Este deosebit de util în condiții de sarcină mare, de exemplu, atunci când creați un cloud propriu sau o platformă ca serviciu. Însă este de asemenea util pentru aplicații mici și medii, când doriți să obțineți mai mult din resursele existente.
Principalele componente Docker
Docker este compus din două componente principale:
- Docker: 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 preia sarcina de a crea, rula și distribui containerele dumneavoastră. Atât clientul, cât și serverul pot rula pe aceeași sistem; puteți conecta clientul la un demon Docker de la distanță. Clientul și serverul comunică prin socket sau prin API RESTful.

Demon Docker
După cum se arată în diagramă, demonul rulează pe mașina gazdă. Utilizatorul nu interacționează direct cu serverul, ci folosește clientul.
Client Docker
Clientul Docker, programul Docker, este principalul interfața către Docker. Acesta primește comenzi de la utilizator și interacționează cu demonul Docker.
În interiorul Docker-ului
Pentru a înțelege din ce este compus Docker, trebuie să cunoașteți trei componente:
- imagini (images)
- registru (registries)
- containere
Imagini
Un imagine Docker este un șablon read-only. De exemplu, o imagine poate conține sistemul de operare Ubuntu cu Apache și aplicația acestuia. Imaginile sunt folosite pentru a crea containere. Docker permite crearea ușoară de imagini noi, actualizarea celor existente sau puteți descărca imagini create de alte persoane. Imaginile sunt un component al construcției Docker.
Registru
Registrul Docker stochează imagini. Există registre publice și private, din care se pot descărca sau încărca imagini. Registrul public Docker este . Acolo se află o colecție imensă de imagini. După cum știți, imaginile pot fi create de voi sau puteți folosi imagini create de alții. Registrele sunt un component al distribuției.
Containere
Containerele sunt asemănătoare cu directoarele. În containere se găsește tot ce este necesar pentru funcționarea aplicației. Fiecare container este creat dintr-o imagine. Containerele pot fi create, pornite, oprite, transferate sau șterse. Fiecare container este izolat și reprezintă o platformă sigură pentru aplicație. Containerele sunt un component al funcționării.
Cum funcționează Docker?
Până acum știm că:
- putem crea imagini care conțin aplicațiile noastre;
- putem crea containere din imagini pentru a rula aplicațiile;
- putem distribui imagini prin Docker Hub sau alt registru de imagini.
Să vedem cum se îmbină aceste componente.
Cum funcționează o imagine?
Știm deja că o imagine este un șablon read-only, din care se creează un container. Fiecare imagine este formată dintr-un set de niveluri. Docker folosește pentru a combina aceste niveluri într-o singură imagine. Sistemul de fișiere unional permite fișierelor și directoarelor din diferite sisteme de fișiere (diferiți arbori) să se suprapună transparent, creând un sistem de fișiere coerent.
Unul dintre motivele pentru care Docker este ușor este utilizarea acestor niveluri. Când modificați o imagine, de exemplu, actualizând aplicația, se creează un nou nivel. Astfel, fără a înlocui întreaga imagine sau a o reconstrui, așa cum s-ar putea să trebuiască să faceți cu o mașină virtuală, doar nivelul este adăugat sau actualizat. Și nu trebuie să distribuiți întreaga nouă imagine, ci doar actualizarea, ceea ce face distribuția imaginilor mai simplă și mai rapidă.
Fiecare imagine se bazează pe o imagine de bază. De exemplu, ubuntu este imaginea de bază Ubuntu, iar fedora este imaginea de bază a distribuției Fedora. De asemenea, puteți folosi imagini ca bază pentru a crea imagini noi. De exemplu, dacă aveți o imagine apache, o puteți folosi ca imagine de bază pentru aplicațiile dvs. web.
Notă! Docker obține de obicei imagini din registrul Docker Hub.
Imaginile Docker pot fi create din aceste imagini de bază, pașii pentru crearea acestor imagini îi numim instrucțiuni. Fiecare instrucțiune creează o nouă imagine sau un nou nivel. Instrucțiunile vor fi următoarele acțiuni:
- lansarea unei comenzi
- adăugarea unui fișier sau a unui director
- crearea unei variabile de mediu
- indicația a ce să ruleze atunci când se pornește un container din această imagine
Aceste instrucțiuni sunt stocate într-un fișier Dockerfile. Docker citește acest Dockerfile, atunci când construiți imaginea, execută aceste instrucțiuni și returnează imaginea finală.
Cum funcționează registrul Docker?
Registrul este un depozit de imagini Docker. După ce ați creat o imagine, o puteți publica pe registrul public Docker Hub sau pe registrul dvs. privat.
Cu ajutorul clientului Docker, puteți căuta imagini deja publicate și le puteți descărca pe mașina dvs. cu Docker pentru a crea containere.
Docker Hub oferă depozite publice și private de imagini. Căutarea și descărcarea imaginilor din depozitele publice sunt disponibile pentru toată lumea. Conținutul depozitelor private nu apare în rezultatele căutării. Numai dvs. și utilizatorii dvs. pot obține aceste imagini și crea din ele containere.
Cum funcționează un container?
Un container constă dintr-un sistem de operare, fișiere de utilizator și metadate. După cum știm, fiecare container este creat dintr-o imagine. Această imagine i-a spune lui Docker ce conține containerul, ce proces să pornească atunci când containerul este lansat și alte date de configurare. Imaginea Docker este disponibilă doar în citire. Când Docker pornește un container, acesta creează un nivel de citire/scriere deasupra imaginii (folosind sistemul de fișiere union, așa cum a fost menționat anterior), în care poate fi rulat aplicația.
Ce se întâmplă când se lansează un container?
Fie printr-un program docker, fie printr-o API RESTful, clientul Docker spune demonului Docker să pornească containerul.
$ sudo docker run -i -t ubuntu /bin/bash
Să analizăm această comandă. Clientul se pornește cu comanda docker, cu opțiunea run, care spune că va fi lansat un nou container. Cerințele minime pentru a lansa un container sunt următoarele atribute:
- ce imagine să folosești pentru a crea containerul. În cazul nostru
ubuntu - comanda pe care vrei să o rulezi când containerul va fi lansat. În cazul nostru
/bin/bash
Ce se întâmplă, de fapt, în spatele cortinei atunci când lansăm această comandă?
Docker, în ordine, face următoarele:
- descarcă imaginea ubuntu: docker verifică dacă imaginea există
ubuntupe mașina locală, iar dacă nu este prezentă - o descarcă de la . Dacă imaginea există, o folosește pentru a crea containerul; - creează containerul: după ce imaginea a fost obținută, docker o folosește pentru a crea containerul;
- inițializează sistemul de fișiere și montează nivelul read-only: containerul a fost creat în sistemul de fișiere și nivelul read-only a fost adăugat imaginii;
- inițializează rețeaua/bridge: creează o interfață de rețea care permite docker-ului să comunice cu mașina gazdă;
- Setarea adresei IP: găsește și setează adresa;
- Lansează procesul specificat: își începe aplicația;
- Procesează și returnează ieșirea aplicației tale: se conectează și înregistrează intrarea standard, ieșirea și fluxul de erori al aplicației tale, astfel încât să poți urmări cum funcționează aplicația ta.
Acum ai un container funcțional. Poți gestiona containerul tău, interacționând cu aplicația ta. Când decizi să oprești aplicația, șterge containerul.
Tehnologiile utilizate
Docker este scris în Go și folosește unele caracteristici ale nucleului Linux pentru a implementa funcționalitatea de mai sus.
Namespace-urile
Docker utilizează tehnologia namespaces pentru a organiza spații de lucru izolate, pe care le numim containere. Când lansăm un container, docker creează un set de namespace-uri pentru acel container.
Aceasta creează un nivel izolat, fiecare aspect al containerului fiind rulat în propriul său namespace, fără acces la sistemul extern.
O listă de unele namespace-uri utilizate de docker:
- pid: pentru izolarea procesului;
- net: pentru gestionarea interfețelor de rețea;
- ipc: pentru gestionarea resurselor IPC. (IPC: InterProccess Communication);
- mnt: pentru gestionarea punctelor de montare;
- utc: pentru izolarea nucleului și controlul generației de versiuni (UTC: Unix timesharing system).
Control groups (grupuri de control)
Docker utilizează, de asemenea, tehnologia cgroups sau grupuri de control. Cheia funcționării aplicației în izolare este furnizarea aplicației doar a resurselor pe care doriți să le oferiți. Acest lucru garantează că containerele vor fi vecini buni. Grupurile de control permit împărțirea resurselor hardware disponibile și, dacă este necesar, stabilirea de limite și restricții. De exemplu, puteți limita cantitatea posibilă de memorie pentru un container.
Sistem de Fișiere Union
Sistemul de Fișiere Union sau UnionFS este un sistem de fișiere care funcționează prin crearea de niveluri, făcându-l foarte ușor și rapid. Docker folosește UnionFS pentru a crea blocuri din care se construiesc containerele. Docker poate utiliza mai multe variante de UnionFS, inclusiv: AUFS, btrfs, vfs și DeviceMapper.
Formate de containere
Docker combină aceste componente într-o îmbrăcare pe care o numim format de container. Formatul folosit în mod implicit se numește libcontainer. De asemenea, Docker susține formatul tradițional de containere în Linux prin . În viitor, Docker ar putea suporta alte formate de containere. De exemplu, integrându-se cu BSD Jails sau Solaris Zones.
Sursa: habr.com
