Vorbind pe larg, Docker devine din ce în ce mai mult ca un manager de pachete universal care funcționează pe toate platformele Linux posibile. Este nevoie de containere și le folosește pentru a rezolva o problemă complet diferită cu care se confruntă dezvoltatorii. Problema este că dezvoltatorii își folosesc sistemul de operare desktop (cum ar fi Windows, macOS sau Linux cu o tonă de pachete legate de desktop) pentru a scrie aplicații. Aplicația pe care o scriu rulează adesea pe un sistem de operare complet diferit pe un server undeva cu o distribuție Linux complet diferită de cea a laptopului dezvoltatorului.
Cu Docker ideea este că aplicația dvs. vine ambalată ca o imagine Docker. Este sarcina lui Docker să ia această imagine și să o ruleze ca o aplicație containerizată pentru dvs. A fi containerizat înseamnă că aplicația și dependențele sale vor rula într-un mediu izolat, care poate diferi complet de laptopul dezvoltatorului și chiar de serverul de producție. Atâta timp cât ambii acceptă Docker, ambii pot rula aceeași aplicație în același mod.
Anatomia unei imagini Docker
După cum sa menționat mai devreme, o aplicație Docker va rula pe un mediu convenit. Acum întrebarea este cum creăm acel mediu? Majoritatea imaginilor aplicației ar importa o imagine de bază Docker și și-ar construi aplicația deasupra ei.
Aplicațiile sunt realizate din straturi de software. O imagine de container wordpress este construită folosind o imagine de container httpd care, la rândul său, este construită deasupra unei imagini Ubuntu. Imaginea pe care este construită o imagine mai nouă este cunoscută sub numele de PARENT IMAGE în terminologia Docker. În Dockerfile (vom ajunge la ceea ce înseamnă un Dockerfile, puțin mai târziu), această imagine părinte este menționată în partea de sus a fișierului, așa cum se arată mai jos:
DE LA Ubuntu: 18.04
## Restul fișierului Docker
Acest fișier Docker, atunci când este executat, vă convertește aplicația într-o imagine Docker (un tip binar) pe care îl puteți împinge apoi într-un registru de unde poate fi extras pentru a crea noi containere în altă parte. Cu toate acestea, toți vor avea Ubuntu: 18.04 ca imagine de bază și vor rula ca și cum ar fi un sistem Ubuntu în care rulează.
Este posibil să fi observat acest lucru atunci când încercați să extrageți o nouă imagine de andocare.
Aceasta arată câte straturi sunt trase înainte ca aplicația reală (care ar putea avea doar câțiva megabyți) să fie introdusă.
Din acest motiv, am dori să creăm ceea ce este cunoscut sub numele de imagine de bază. Ceea ce nu este construit deasupra a nimic altceva. Cuvântul cheie zero este folosit pentru a indica faptul că acest strat nu este construit deasupra a nimic altceva. Ca astfel:
De la zero## Restul fișierului Dcoker
Mai întâi vom crea o aplicație simplă Hello-World și apoi vom afla ce va fi restul fișierului Dockerfile. Sistemul gazdă este Ubuntu: 18.04 LTS și folosim versiunea Docker 17.12.1-ce pentru experiment.
Crearea unui binar static
Containerele Docker sunt o colecție de procese care rulează izolate de restul sistemului de operare. Singurul lucru cu care procesul este în contact este nucleul. Kernel este responsabil pentru programarea acestor procese pe CPU, gestionarea memoriei și alte câteva activități de bază de păstrare a rezervării.
Dar majoritatea aplicațiilor de nivel înalt depind de o mulțime de biblioteci de sistem (cum ar fi glibc, musl, klibc etc. ) și o mulțime de dependențe de runtime, cum ar fi Python sau Node.js sau Java Runtime. Binarul aplicației nu are toate bibliotecile disponibile în interiorul său, dar atunci când începe executarea apelează acele biblioteci din sistemul de operare gazdă.
Deoarece încercăm să creăm o imagine de la zero, nu am primi aceste simpatii. Deci aplicația noastră trebuie să fie un fișier static sau un executabil independent.
Să începem prin a crea un folder numit MyDockerImage și a crea un fișier hello.cc în interiorul acestuia.
$mkdirMyDockerImage$CDMyDockerImage
$atingeresalut.cc
Deschideți hello.cc folosind editorul de text preferat și adăugați următoarele rânduri în interiorul acestuia.
#includefolosind spațiul de nume std;
intprincipal(){
cost<< 'Buna ziua! Acest mesaj vine dintr-un container n';
întoarcere 0;
}
Acesta este un program simplu C ++ care imprimă Hello! Acest mesaj …
Din motivele discutate anterior, vom compila acest lucru folosind semnalizatorul static. Compilatorul utilizat este g ++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0.
Pentru a compila programul, în același director executați următoarea comandă:
$ g++ -o buna ziua-staticBuna ziua.DCAceasta creează un fișier executabil binar salut în același director. Acesta este fișierul nostru static. Testați dacă rulează conform intenției menționând numele fișierului în terminal.
$./Buna ziua
Acum suntem gata să punem în container acest program simplu.
Dockerfile
Fișierul Docker este format dintr-un set de reguli care iau fișierele aplicației dvs. (cum ar fi binare, fișiere sursă, etc.) împreună cu diverși parametri de configurare, cum ar fi aspectul sistemului de fișiere, porturile expuse, etc. și le transformă într-un fișier imagine Docker. Apoi, puteți partaja fișierul imagine cu oricine dorește să ruleze aplicația respectivă.
Nu vom analiza fiecare opțiune disponibilă pentru Dockerfile, în schimb vom scrie un Dockerfile foarte minimalist. În același director, unde se află executabilul dvs. Hello, creați un fișier gol numit Dockerfile.
$atingereDockerfileDeschideți-l cu editorul de text preferat și scrieți-i următoarele rânduri:
De la zeroADAUGĂ salut/
CMD['/Buna ziua']
zgârietură nu este o imagine părinte. Mai degrabă indică Docker că imaginea nu este construită deasupra oricărei alte imagini. Este construit de la zero. Comanda ADD ar lua binarul static numit hello
din directorul curent și l-ar adăuga în directorul rădăcină al fișierului imagine. Când în sfârșit vom rula un container bazat pe această imagine, executabilul Hello va fi văzut în directorul rădăcină însuși la /hello.
În cele din urmă, linia CMD are un șir /Buna ziua acest șir va fi executat ca o comandă de shell ori de câte ori este creat un container din această imagine, astfel fișierul binar pe care l-am adăugat în container și imprimăm mesajul pe care l-am scris în aplicația noastră.
Să construim imaginea invocând docker build comandă care va trece prin conținutul fișierului Docker și va genera imaginea. Rulați următoarea comandă în același director ca fișierul Docker și binarul executabil.
$docker build--etichetăBuna ziua .The –Tag salut flag stabilește numele imaginii la Buna ziua și punctul ( . ) la sfârșit spune docker build pentru a căuta în directorul curent fișierul Docker și conținutul aferent.
Rularea containerului Docker
Pentru a verifica dacă imaginea pe care tocmai am creat-o apare în lista de imagini, rulați:
$imagini docker
Observați cât de mică este imaginea de salut în comparație cu alte imagini. În orice caz, este gata să fie rulat ca un container,
$docker fugi salut
Asta e! Ai creat primul tău container minimalist de la zero.
Alte optiuni
În timp ce crearea de imagini de la zero este întotdeauna o opțiune, oamenii tind să creeze imagini din alte distribuții Linux ușoare. De exemplu, imaginile precum alpine și busybox sunt medii foarte ușoare, cu biblioteci mai mici, cum ar fi musl în loc de glibc.
Folosindu-le ca imagine părinte folosind FROM alpin: cel mai recent ar avea ca rezultat și imagini mai mici. Deoarece imaginile de bază au o dimensiune de doar 2-5 MB. Spuneți-ne dacă există vreun subiect legat de Docker pe care ați putea dori să îl acoperim în continuare. Ne puteți contacta mai departe Stare de nervozitate , Facebook sau abonați-vă la noi prin e-mail.