Ghidul autostopistului la Docker și Modulus

În acest tutorial, vom analiza istoria containerizării, Docker, componentele sale și cum să începem să le folosim în munca noastră zilnică. Dar, înainte să ne aruncăm prea adânc în tutorial, să aruncăm o privire la ceea ce face Docker pentru a obține o înțelegere cu privire la ceea ce este cu care vom lucra.

1. Introducere

Docker este o platformă deschisă pentru construirea, transportul și rularea aplicațiilor distribuite. Oferă programatorilor, echipelor de dezvoltare și inginerilor de operațiuni un set comun de instrumente de care au nevoie pentru a profita de natura distribuită și în rețea a aplicațiilor moderne.

După cum se precizează în definiția formală a programului Docker de mai sus, îi ajută pe dezvoltatori sau ingineri de operațiuni să automatizeze mediul de infrastructură pe care aplicațiile trebuie să-. 

Să presupunem că aveți o aplicație scrisă în Node.js care folosește serviciul Express for RESTful și MongoDB pentru persistența datelor. Să o facem mai complexă și să adăugăm mai multe instanțe ale Node.js și Nginx Load Balancer în fața instanțelor Node.js. 

Nu ar fi mai bine să scriu pașii de instalare într-un fișier text și să las pe cineva să instaleze întregul mediu pentru mine? Docker vă ajută să simplificați foarte ușor toate componentele arhitecturii (instanța Node.js, serverul Nginx Web Server, baza de date MongoDB etc.). 

Cu toate acestea, ceea ce este containerizarea oricum? Să vedem istoria tehnologiei de containerizare.

2. Istoria containerizării

Primul proiect de containerizare pe care mi-l amintesc este OpenVZ, care este o virtualizare bazată pe containere pentru Linux, lansată pentru prima oară în 2005. OpenVZ vă permite să creați mai multe containere Linux izolate și securizate pentru a le rula pe același server fizic, fără nici un conflict între aplicații.  

În același timp, a apărut un alt proiect al FreeBSD numit Jails. Acest lucru vă permite să puneți aplicații și servicii într-o singură închisoare (putem numi acest container) utilizând chroot. 

Au existat și alte proiecte, cum ar fi Solaris Containers, dar de ce a devenit Docker popular, chiar dacă toate proiectele de containerizare de mai sus sunt cu opt ani mai mari decât Docker? Continuați să citiți pentru a afla nivelul cunoștințelor Docker.

3. Cum functioneaza Docker-ul?

Înainte de a explica cum funcționează Docker, permiteți-mi să explic cum funcționează containerele. Un container este ceva legat de virtualizarea sistemului de operare care ne permite să creăm mai multe spații de utilizatori izolate în loc de unul singur. Această izolare se face folosind chroot

Principala diferență dintre containere și VM-uri este după cum urmează. Când creați mai multe mașini virtuale utilizând VM, sistemele de operare și hardware-urile virtualizate sunt duplicate pentru fiecare oaspete. Cu toate acestea, dacă creați mai multe containere, numai folderele legate de distribuția sistemului de operare sunt create de la zero, în timp ce părțile legate de kernel-ul Linux sunt partajate între containere. Puteți să aruncați o privire la imaginea de mai jos pentru a vedea diferența într-un mod vizual.

Mașină virtuală

Docher

După cum puteți vedea și în schemă, dacă creați invitații de la Ubuntu și Mint folosind VM, sistemul lor Guest Guest va fi duplicat chiar dacă utilizează același kernel Linux. De fapt, distribuția înseamnă diferențierea pubele și libs folderele și kernel-ul Linux sunt aceleași. 

Dacă aveți o privire la a doua imagine de mai sus, veți vedea că întreaga arhitectură de nivel de sistem de operare este partajată între containere și numai pubele și libs sunt create de la zero pentru containere diferite. Docker Engine are Namespaces, cgroups, și SELinux și vă ajută la orchestrarea containerelor. Dacă aveți nevoie de informații suplimentare despre Docker Engine, puteți să consultați site-ul Docker.

4. Docker Components

Înainte de a continua să explicați componentele, puteți instala Docker pe computer. Ea are pași destul de bază pentru a instala. 

Docker are în principal două componente: Docker Engine și Docker Hub. Docker Engine este pentru orchestrarea containerelor, așa cum am spus mai sus, iar Docker Hub este un serviciu SaaS pentru gestionarea și partajarea pachetelor de aplicații. De exemplu, dacă doriți să utilizați Redis cu Docker, îl puteți trage la mașina dvs. locală executând următoarea comandă:

docker pull redis

Aceasta va prelua toate straturile imaginii containerului și va fi gata să funcționeze în mediul dvs. Puteți să aruncați o privire la Docker Hub pentru o mulțime de depozite.

Docker are, de asemenea, un sistem de fișiere special numit AUFS (Advanced Multi Layered Unification Flle System). Cu acest sistem, fiecare schimbare de comitet este păstrată în straturi, cum ar fi controlul versiunii. Dacă faceți o modificare a imaginii Docker, aceasta va fi menținută ca o comitere diferită și nu va fi complet reconstruită în timpul operației de construire. Toate celelalte straturi sunt construite înainte. 

În plus, atunci când trageți un depozit la computerul local, veți vedea că operația de preluare este făcută strat cu strat. Să presupunem că ați făcut o schimbare și vă testați noul container, dar acesta nu reușește. Nici o problemă, vă puteți răzbuna modificările și puteți reconstrui așa cum faceți mereu în Git. 

5. Începeți rapid

Presupunând că Docker este deja instalat pe computer, putem începe cu câteva comenzi Docker destul de cool. 

docker trageți ubuntu docker run-ubuntu bash

După cum puteți ghici, comanda de mai sus va prelua imaginea Ubuntu de la Docker Hub și va rula urmată de comanda bash. 

Veți vedea că sunteți în interiorul containerului după executarea comenzii de mai sus. Sunteți acum în coajă Ubuntu și aveți libertatea de a efectua comenzi * nix. Poți să creezi ceva, să ștergi ceva, să vezi procese etc.. 

Cu toate acestea, aveți grijă deoarece ori de câte ori ieșiți din container, datele dvs. vor fi pierdute. De ce? Pentru că trebuie să proiectați containerele ca imuabile. 

Primul design care pachete vor fi incluse, care aplicații vor fi clonate în container etc., și apoi executați containerul. Ori de câte ori nu reușiți, trebuie să puteți schimba configurația și să reușiți din nou. Nu păstrați niciodată stat în recipiente. 

5.1. Alerga

Pentru a rula containerul, puteți utiliza următorul format.

docker run [OPȚIUNI] IMAGINE [: TAG | @DIGEST] [COMANDĂ] [ARG ...]

Există o mulțime de parametri disponibili în Docker pentru operația de rulare. Puteți consulta documentația pentru toate opțiunile, dar vă voi da câteva exemple de utilizare în viața reală.

docker run -d redis

Această comandă va executa o imagine Redis în modul detașat. Aceasta înseamnă că toate intrările / ieșirile se vor realiza prin conexiuni de rețea sau partajate. Puteți presupune că rulează în mod daemon. Am spus Redis aici, dar puteți specifica autorul imaginii și eticheta, de asemenea, folosind o comandă ca cea de mai jos.

docker rula -d huseyinbabal / mongodb: 1.0

Avem un a MongoDB imaginea care aparține huseyinbabal cu versiune specifică 1.0.

De asemenea, puteți rula imaginea dvs. interactiv astfel:

docker rulați - la huseyinbabal / ubuntu: 1.2 bash

Când executați comanda de mai sus, acesta va rula ubuntu 1.2 și apoi executați a bash comanda pentru a pune promptul dvs. în terminal în interiorul containerului.

5.2. Construi

Am rulat imagini care au fost extrase din Docker Hub Repository. Cum despre construirea imaginii noastre? Putem face acest lucru folosind comanda Docker build, dar trebuie să specificăm a Dockerfile să lăsați Docker să ruleze fiecare declarație definită în Dockerfile. 

De la ubuntu MAINTAINER Huseyin BABAL RUN apt -key adv --keyserver keyserver.ubuntu.com - recursiv 7F0CEB10 RUN echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" | tee -a /etc/apt/sources.list.d/10gen.list RUN apt-get update RUN apt-get -y instalare apt-utils RUN apt-get -y instalare mongodb-10gen RUN echo "unele config" >> /etc/mongodb.conf CMD ["/ usr / bin / mongod", "--config", "/etc/mongodb.conf"] 

Aceasta este o definiție foarte simplă Dockerfile care ne va ajuta să ne construim imaginea. În această definiție Dockerfile, în primul rând spunem că vom moșteni toate proprietățile din imaginea Ubuntu. Această imagine va fi preluată mai întâi de pe serverul dvs. local. Dacă nu poate fi găsit, va fi extras din Docker Hub. 

Pe linia a doua, definim autorul sau întreținătorul imaginii. În următoarele fișiere, executăm pur și simplu câteva comenzi * nix cu comanda RUN pentru a instala pachete esențiale și pachete legate de MongoDB. Pentru a începe MongoDB, scriem mongodb.conf, și în ultimul pas pe care îl conducem cu ajutorul comenzii CMD.

Pentru a rula imaginea noastră, ar trebui să construim imaginea utilizând acest Docker File. Puteți folosi următoarele pentru a construi imaginea.

doc-build -t huseyinbabal / mongodb: 1.0 .

Pur și simplu, aceasta va construi o imagine cu o etichetă huseyinbabal / MongoDB: 1.0 și va folosi Dockerfile în dosarul curent (vezi punctul de la sfârșitul comenzii). Pentru a testa dacă este creată sau nu, puteți utiliza următoarea comandă.

portocale imagini

Aceasta va afișa toate imaginile care există pe computerul dvs., după cum este descris mai jos.

Dacă doriți să rulați o imagine construită, puteți rula:

docker rula -d huseyinbabal / mongodb: 1.0

Dar asteapta! Acesta este nodul daemon. Deci, cum pot intra în containerul ăsta? Este foarte simplu. Mai întâi, obțineți numele numelui containerului mongodb utilizând următoarea comandă.

docker ps

Veți vedea o ieșire ca mai jos.

Puteți vedea numele în coloana NAMES. Acum este timpul să intrați în container cu următoarea comandă.

docker exec -i-t  bash

Puteți vedea procesele care rulează în interiorul acestui container.

5.3. Folder impartit

După cum am spus mai devreme, dacă închideți recipientul care rulează, toate datele legate de acest container vor fi pierdute. Acest lucru este normal în lumea Docker. 

De exemplu, în containerul nostru, MongoDB scrie toate datele într-o cale specificată în mongodb.conf. Acest dosar există în container și dacă închideți containerul, toate datele vor fi pierdute. Dacă persistă datele într-un dosar care este partajat unui computer gazdă pe care rulează Docker, puteți utiliza -v opțiune în interiorul alerga comanda. De exemplu:

docker rulați -d -v / gazdă / mongo_data_path: / container / mongo_data_path huseyinbabal / mongodb: 1.0

Acest lucru va face harta /gazdă / mongo_db_path care este în mașina dvs. gazdă să /container / mongo_data_path care este în recipient. Ori de câte ori mongo scrie date pe calea din interiorul containerului, acesta va fi automat accesibil în interiorul mașinii gazdă. Chiar dacă închideți containerul, datele vor rămâne în calea din interiorul mașinii gazdă.

5.4. Expunerea portului

Să spunem că MongoDB rulează în interiorul containerului. Puteți expune portul MongoDB în afara containerului la portul 27017 și puteți utiliza următoarea comandă pentru a accesa din afara containerului cu portul 5000.

docker-run -d -P 5000: 27017 -v / gazdă / mongo_data_path: / container / mongo_data_path huseyinbabal / mongodb: 1.0

Deci, vă puteți conecta la MongoDB în interiorul containerului din afară folosind portul 5000.

5.5. Verificarea containerelor

Să spuneți că aveți nevoie de informațiile de rețea ale containerului specificat. Puteți obține detaliile utilizând butonul docker inspecta comanda. Această comandă va tipări o mulțime de metadate despre container. este partea din care există ID-ul CONTAINERULUI în docker ps de ieșire. Rezultatul inspecției va fi în format JSON. Pentru a obține adresa IP a containerului, puteți utiliza:

docker inspectați --format '.NetworkSettings.IPAddress' 

Comenzile de mai sus sunt cele de bază în timp ce faceți lucruri Docker. Dacă aveți nevoie să aflați multe despre comenzile Docker, consultați documentația.

6. Sfaturi și trucuri

6.1. Responsabilitatea unică a containerelor

Este cea mai bună practică să acorzi o singură responsabilitate fiecărui container. Ceea ce vreau să spun este că nu ar trebui să instalați aplicațiile MongoDB și Spring Boot într-un singur container pentru a servi straturile DB și Application într-un singur container. În loc de asta, puteți pune o aplicație într-un singur container. Fiecare instanță de aplicație, membrul bazei de date, coada de mesaje etc. trebuie să menționeze un singur container. 

Să presupunem că ați pus straturile aplicației și bazei de date într-un singur container. Va fi foarte greu să măsurați performanța sau diagnosticul aplicației sau bazei de date. În același mod, dacă doriți să vă scalați aplicația, nu veți putea să scalați acest container, deoarece există și o aplicație de bază de date instalată în acel container. 

6.2. Consumabile imuabile

Când rulați containerul, niciodată nu intrați în containerul respectiv pentru a actualiza sau șterge ceva. Principalul motiv pentru care folosiți Docker este să vă păstrați istoric modificările în Dockerfile. Dacă doriți să schimbați ceva, schimbați fișierul Docker, construiți imaginea și rulați containerul. Chiar dacă schimbați manual ceva în interiorul containerului, acesta va fi șters dacă containerul este reluat.

6.3. Straturile Dockerfile

În mod normal, este posibil să doriți să scrieți fiecare comandă pe linii separate, cum ar fi cele de mai jos.

De la ubuntu MAINTAINER Huseyin BABAL RUN apt-get update RUN apt-get install -y build-esențiale RUN apt-get install -y php5 RUN apt-get instalare -y nginx CMD ["nginx", "g", "daemon off; "] EXPUNERE 80

Aceasta înseamnă un strat pentru fiecare linie. Nu este o modalitate sugerată de a construi Dockerfile. Puteți separa comenzile dvs. cu un backslash (\) pentru fiecare grup de lucrări, după cum urmează:

Din ubuntu: 15.04 MAINTAINER Huseyin BABAL RUN apt-get update \ -y build-esențial -y php5 \ -y nginx = 1.7.9 \ apt-get CMD curat ["nginx", "g", "daemon off; EXPUNERE 80

În dosarul Dockerfile de mai sus, am planificat să instalăm pachetele necesare pe o singură linie și să efectuăm a curat pentru a face mediul curat. Procedând astfel, nu am creat straturi separate pentru fiecare comandă.

6.4. Recipiente de containere

Construirea și rularea unui container este o chestiune foarte ușoară. După două luni, puteți ajunge la 50 de containere pentru arhitectura aplicației! Va fi foarte greu să găsiți cauza principală a unei probleme dacă apare o eroare în recipientele dvs.. 

Modul simplu de a face acest lucru este de a loga activitățile dvs. de container într-un sistem centralizat de jurnal. De exemplu, redirecționați jurnalele stdout la un fișier de jurnal în interiorul fiecărui container. Și un agent poate transmite conținutul jurnalelor unui sistem central de gestionare a jurnalului ca ELK sau Splunk. Dacă trimiteți date specifice containerului în jurnale, de exemplu id-ul containerului, va fi foarte ușor să filtrați erorile din tabloul de bord al gestionării jurnalului. 

Poate doriți să monitorizați containerul în sine. De data aceasta, puteți să aruncați o privire la cadadorul Google. Aceasta vă permite să vă monitorizați containerul printr-un serviciu REST. De exemplu, pentru a vedea informațiile despre container, puteți face o solicitare GET http: // HOST_NAME/api/v1.0/containers/

6.5. Standardizare

Dacă aplicați proceduri standard în ciclul de viață al containerelor, va fi foarte ușor să vă controlați arhitectura generală. De exemplu, puteți crea un container de bază pentru a moșteni unele operații în interiorul altor containere. Pe de altă parte, puteți utiliza locațiile standard pentru fișierele config, fișierele jurnal și fișierele sursă. Aveți grijă să folosiți un dosar Docker pentru fiecare container. În cele din urmă, aplicați versiuni în toate containerele pentru a separa caracteristicile și pentru a folosi versiuni diferite în funcție de nevoile dvs..

6.6. Securitate

Securitatea este un subiect foarte important în cazul containerelor. Porniți întotdeauna recipientele în modul neavizat. Îți sugerez să folosești Apparmor pentru a te proteja de containerele externe, chiar și cu atacuri de zero zile. De asemenea, sugerez SELinux pentru containerele dvs. să aplice politici de securitate pentru controlul accesului în funcție de nevoile dvs. De asemenea, ține pasul cu actualizările imaginilor pe care le utilizați în recipiente pentru a aplica cele mai recente patch-uri în container. În timp ce faceți acest lucru, nu uitați să vă fixați imaginea la o versiune stabilă. 

7. Modulul

Modulus este o platformă integrată de implementare și orchestrare a întreprinderii. Ei au început cu un PaaS concentrat pe Node.js pe LXC și apoi au decis să treacă la Docker, iar acest lucru le-a permis să susțină mai multe limbi diferite de Node.js, adică PHP, Java, Python și Static. 

Ceea ce vreau să spun prin sprijinirea limbilor aici este că puteți implementa aplicația scrisă în limbile de mai sus pentru Modulus cu o singură comandă cu proprietăți predefinite. Să spunem că veți implementa aplicația Node.js la Modulus, iar singurul lucru pe care trebuie să-l faceți este să executați modul de implementare în directorul rădăcină de proiect. Modulul constă din următoarele componente.

7.1. Modulul CLI

Modulul CLI este pentru operația de implementare pentru aplicația dvs. din linia de comandă și poate fi pur și simplu instalat cu npm install -g modul. Aveți posibilitatea să creați proiecte, să implementați proiecte, să înregistrați fluxuri și să faceți anumite operațiuni legate de bazele de date cu Modulus CLI. Alternativ, puteți implementa proiectul prin încărcarea prin panoul de administrare.

7.2. Implementare

Puteți crea și implementa aplicația dvs. cu câțiva pași simpli. Puteți selecta limba, mărimea servomotorului și locația. Apoi, pregătiți-vă să vă desfășurați proiectul.

Alternativ, puteți crea un proiect pe linia de comandă cu modulul de proiect crea și apoi modul de implementare.

7.3. Bază de date

Este posibil să doriți să stocați anumite date în aplicația dvs. Modulus vă permite, de asemenea, să adăugați o bază de date la aplicația dvs. MongoDB este folosit în spatele scenei. Puteți merge și crea o bază de date în tabloul de bord, de asemenea, puteți crea o bază de date pe linia de comandă. Puteți vedea ecranul bazei de date de mai jos.

Puteți lua adresa URL a bazei de date pe ecranul detaliat și să o utilizați în aplicațiile dvs..

7.4. Jurnale

Puteți înregistra jurnalele de coadă din linia de comandă cu modulul coada logurilor, sau puteți derula jurnalele de pe tabloul de bord, după cum urmează.

Când faceți clic pe CURENT , puteți vedea jurnalele în timp real.

Acestea sunt componentele principale ale Modulus. Poți să te uiți la alte componente cum ar fi Valori, Auto-scaling, Adaosuri, notificări, și Administrare pe tabloul de bord Modulus.

8. Concluzie

Am discutat despre containere și am dat o scurtă istorie. În comparație cu VM-urile, Docker dispune de o mulțime de alternative pentru gestionarea infrastructurii de aplicații. 

Dacă utilizați Docker pentru arhitectura dvs., trebuie să fiți atenți la unele concepte, cum ar fi responsabilitatea unică, serverele imuabile, securitatea, aplicația și monitorizarea containerelor. 

Când sistemul dvs. devine mai mare, va fi foarte ușor de controlat. Modulus este una dintre companiile care utilizează Docker pentru sistemul său PaaS. Folosind puterea Docker, Modulus a proiectat un sistem excelent pentru a ajuta oamenii sa implementeze foarte usor aplicatiile scrise in Node.js, PHP, Java si Python. 

Cod