de Guilherme Pejon

Dacă te-ai săturat să-i auzi pe colegii tăi laudându-l pe Docker și beneficiile sale la fiecare șansă pe care o au, sau te-ai săturat să dai din cap și să te îndepărtezi de fiecare dată când te afli într-una dintre aceste conversații, ai venit la dreapta loc.

De asemenea, dacă sunteți în căutarea unei noi scuze pentru a vă rătăci fără a fi concediați, continuați să citiți și îmi veți mulțumi mai târziu.

Docker 101 Fundamente si practica
Sursă: developermeme

Docher

Iată definiția lui Docker, conform Wikipedia:

Docker este un program de calculator care realizează virtualizarea la nivel de sistem de operare.

Destul de simplu, nu? Ei bine, nu exact. Bine, iată definiția mea despre ce este docerul:

Docker este o platformă pentru crearea și rularea containere din imagini.

Încă pierdut? Fără griji, asta pentru că probabil nu știi ce containere sau imagini sunt.

Imagini sunt fișiere unice care conțin toate dependențele și configurațiile necesare pentru a rula un program, în timp ce containere sunt exemplele acelor imagini. Să mergem mai departe și să vedem un exemplu în practică pentru a clarifica lucrurile.

Notă importantă: Înainte de a continua, asigurați-vă că instalați andocatorul folosind pașii recomandați pentru sistemul dvs. de operare.

Partea 1. “Bună ziua, lume!” dintr-o imagine Python

Să presupunem că nu aveți Python instalat în mașină – sau cel puțin nu cea mai recentă versiune – și aveți nevoie de python pentru a tipări „Bună ziua, lume!” în terminalul tău. Ce faci? Folosești docker!

Continuați și rulați următoarea comandă:

docker run --rm -it python:3 python

Nu vă faceți griji, voi explica acea comandă într-o secundă, dar chiar acum probabil că vedeți așa ceva:

1612036931 819 Docker 101 Fundamente si practica
S-ar putea să dureze câteva momente pentru ca această comandă să ruleze pentru prima dată

Asta înseamnă că suntem în prezent într-un container de andocare creat dintr-un python 3 imagine de andocare, rularea python comanda. Pentru a termina exemplul, tastați print("Hello, World!") și privește cum se întâmplă magia.

1612036931 750 Docker 101 Fundamente si practica
Un „Bună ziua, lume!”. Mult wow!

Bine, ați făcut-o, dar înainte de a începe să vă bateți pe spate, să facem un pas înapoi și să înțelegem cum a funcționat asta.

Descompunându-l

Să începem de la început. docker run comanda este instrumentul standard al andocatorului pentru a vă ajuta să porniți și să rulați containerele.

--rm pavilion este acolo pentru a spune Docker Daemon să curețe containerul și să elimine sistemul de fișiere după ce containerul iese. Acest lucru vă ajută să economisiți spațiu pe disc după ce ați rulat containere de scurtă durată ca acesta, pe care am început să le imprimăm doar „Bună ziua, lume!”.

-t (or --tty) steagul îi spune lui Docker să aloce o sesiune de terminal virtual în container. Acest lucru este frecvent utilizat cu -i (or --interactive) opțiune, care menține STDIN deschis chiar dacă rulează în modul detașat (mai multe despre asta mai târziu).

Notă: Nu vă faceți griji prea mult cu privire la aceste definiții chiar acum. Știți doar că veți folosi-it semnalizați oricând doriți să tastați câteva comenzi pe container.

În cele din urmă, python:3 este imaginea de bază pe care am folosit-o pentru acest container. Chiar acum, această imagine vine cu versiunea python 3.7.3 instalată, printre altele. Acum, s-ar putea să vă întrebați de unde a venit această imagine și ce se află în ea. Puteți găsi răspunsurile la ambele întrebări corect Aici, împreună cu toate celelalte imagini python pe care le-am fi putut folosi pentru acest exemplu.

Ultimul, dar nu cel din urmă, python a fost comanda pe care i-am spus lui Docker să o execute în interiorul nostru python:3 imagine, care a pornit o coajă de python și ne-a permis print("Hello, World!") chemare la lucru.

Inca un lucru

Pentru a ieși din Python și a termina containerul nostru, puteți utiliza CTRL / CMD + D sau exit(). Continuați și faceți asta chiar acum. După aceea, încercați să ne executați docker run comandați din nou și veți vedea ceva puțin diferit și mult mai rapid.

1612036932 722 Docker 101 Fundamente si practica
Mult mai repede. Wow!

Asta pentru că am descărcat deja fișierul python:3 imagine, deci containerul nostru începe mult mai repede acum.

Partea 2. Automatizat „Hello World!” dintr-o imagine Python

Ce este mai bine decât să scrii „Bună ziua, lume!” în terminalul tău o dată? Ai luat-o, scriind-o de două ori!

Din moment ce abia așteptăm să vedem „Bună ziua, lume!” imprimate din nou în terminalul nostru și nu vrem să trecem prin forfota deschiderii pythonului și a tastării print din nou, să mergem mai departe și să automatizăm puțin acest proces. Începeți prin crearea unui hello.py înregistrați oriunde doriți.

# hello.py
print("Hello, World!")

Apoi, continuați și rulați următoarea comandă din același folder.

docker run --rm -it -v $(pwd):/src python:3 python /src/hello.py

Acesta este rezultatul pe care îl căutăm:

1612036932 526 Docker 101 Fundamente si practica
Grozav! YAHW (încă un „Hello World!”)

Notă: obisnuiam ls înainte de comanda pentru a vă arăta că mă aflam în același folder în care am creat hello.py înregistrați în.

Așa cum am făcut mai devreme, să facem un pas înapoi și să înțelegem cum a funcționat acest lucru.

Descompunându-l

Executăm aproape aceeași comandă pe care am executat-o ​​în ultima secțiune, în afară de două lucruri.

-v $(pwd):/src opțiunea îi spune Docker Daemon să pornească un volumul in containerul nostru. Volumele sunt cel mai bun mod de a persista datele în Docker. În acest exemplu, îi spunem lui Docker că vrem directorul curent – recuperat din $(pwd) – să fie adăugat în containerul nostru din dosar /src.

Notă: Puteți utiliza orice alt nume sau folder pe care îl doriți, nu numai /src

Dacă doriți să verificați asta /src/hello.py există de fapt în interiorul containerului nostru, puteți schimba sfârșitul comenzii noastre din python hello.py la bash. Acest lucru va deschide un shell interactiv în containerul nostru și îl puteți utiliza exact așa cum v-ați aștepta.

1612036932 669 Docker 101 Fundamente si practica
Nu este o nebunie?

Notă: Putem folosi doar bash aici pentru că vine preinstalat în python:3 imagine. Unele imagini sunt atât de simple încât nici măcar nu au bash. Asta nu înseamnă că nu îl puteți folosi, dar va trebui să îl instalați singur dacă doriți.

Ultimul fragment al comenzii noastre este python /src/hello.py instrucțiune. Executându-l, îi spunem containerului să se uite în interiorul acestuia /src folder și executați fișierul hello.py fișier folosind python.

Poate că puteți vedea deja minunile pe care le puteți face cu această putere, dar oricum o voi evidenția pentru dvs. Folosind ceea ce tocmai am învățat, putem alerga destul de mult orice cod din orice limbă interior orice computer fără a fi nevoie să instalați orice dependențe la mașina gazdă – cu excepția Docker, desigur. Asta e mult text îndrăzneț pentru o propoziție, deci asigurați-vă că ați citit asta de două ori!

Partea 3. Cel mai ușor „Bună ziua, lume!” posibil dintr-o imagine Python folosind Dockerfile

Te-ai săturat să-i saluți frumoasei noastre planete, încă? E păcat, pentru că o vom face din nou!

Ultima comandă pe care am învățat-o a fost puțin detaliată și deja mă văd obosindu-mă să scriu tot acel cod de fiecare dată când vreau să spun „Bună ziua, lume!” Să automatizăm lucrurile puțin mai departe acum. Creați un fișier numit Dockerfile și adăugați următorul conținut:

# Dockerfile
FROM python:3
WORKDIR /src/app
COPY . .
CMD [ "python", "./hello.py" ]

Acum executați această comandă în același folder pe care l-ați creat Dockerfile:

docker build -t hello .

Tot ce mai rămâne de făcut acum este să înnebunești folosind acest cod:

docker run hello
1612036932 310 Docker 101 Fundamente si practica
Rețineți că nici nu mai trebuie să vă aflați în același folder

Știți deja cum este. Să luăm un moment pentru a înțelege cum funcționează un fișier Docker acum.

Descompunându-l

Începând cu Dockerfile, prima linie FROM python:3 îi spune lui Docker să înceapă totul cu imaginea de bază cu care suntem deja familiarizați, python:3.

A doua linie, WORKDIR /src/app, setează directorul de lucru în interiorul containerului nostru. Aceasta este pentru câteva instrucțiuni pe care le vom executa mai târziu, cum ar fi CMD sau COPY. Puteți vedea restul instrucțiunilor acceptate pentru WORKDIR dreapta Aici.

A treia linie, COPY . . practic îi spune lui Docker să copieze totul din folderul nostru curent (primul .) și lipiți-l pe /src/app (al doilea .). Locația lipirii a fost setată cu WORKDIR comanda chiar deasupra ei.

Notă: Am putea obține aceleași rezultate eliminând WORKDIR instrucțiuni și înlocuirea COPY . . instruire cu COPY . /src/app. În acest caz, ar trebui să schimbăm și ultima instrucțiune, CMD ["python", "./hello.py"] la CMD ["python", "/src/app/hello.py"].

În cele din urmă, ultima linie CMD ["python", "./hello.py"] furnizează comanda implicită pentru containerul nostru. În esență se spune că de fiecare dată noi run un container din această configurație, ar trebui să ruleze python ./hello.py. Rețineți că alergăm implicit /src/app/hello.py în loc de numai hello.py, din moment ce asta ne-am îndreptat spre noi WORKDIR la.

Notă: CMD comanda poate fi suprascrisă în timpul rulării. De exemplu, dacă doriți să rulați bash în schimb, ai face docker run hello bash după construirea containerului.

Cu Dockerfile noastre terminate, mergem mai departe și începem build proces. docker build -t hello . comanda citește toate configurațiile pe care le-am adăugat în fișierul nostru Docker și creează un imagine docker din ea. Așa este, la fel ca python:3 imagine pe care am folosit-o pentru întregul articol. . la sfârșit îi spune lui Docker că vrem să rulăm un fișier Docker în locația noastră actuală și -t hello opțiunea oferă acestei imagini numele hello, deci îl putem referi cu ușurință în timpul rulării.

După toate acestea, tot ce trebuie să facem este să rulăm obișnuitul docker run instrucțiune, dar de data aceasta cu hello numele imaginii la sfârșitul liniei. Aceasta va începe un container din imaginea pe care am construit-o recent și, în cele din urmă, va imprima bunul “Hello, World!” în terminalul nostru.

Extinderea imaginii noastre de bază

Ce facem dacă avem nevoie de o anumită dependență pentru a rula codul nostru care nu vine preinstalat cu imaginea noastră de bază? Pentru a rezolva această problemă, Docker are RUN instrucțiune.

Urmând exemplul nostru python, dacă aveam nevoie de numpy bibliotecă pentru a rula codul nostru, am putea adăuga fișierul RUN instrucțiune imediat după FROM comanda.

# Dockerfile
FROM python:3
# NEW LINERUN pip3 install numpy
WORKDIR /src/app
COPY . .
CMD [ "python", "./hello.py" ]

RUN instrucțiunea oferă practic o comandă care trebuie executată de terminalul containerului. În acest fel, deoarece imaginea noastră de bază vine deja cu pip3 instalat, putem folosi pip3 install numpy.

Notă: Pentru o aplicație Python reală, probabil că ați adăuga toate dependențele de care aveți nevoie requirements.txt fișier, copiați-l în container și apoi actualizați fișierul RUN instrucțiune pentru RUN pip3 install -r requirements.txt.

Partea 4. “Bună, lume!” dintr-o imagine Nginx folosind un container detașat de lungă durată

Știu că probabil că v-ați săturat să mă auziți spunând asta, dar mai am încă un „Bună ziua” de spus înainte să plec. Să mergem mai departe și să folosim puterea noastră de andocare recent dobândită pentru a crea un container simplu de lungă durată, în locul celor de scurtă durată pe care le-am folosit până acum.

Creaza un index.html fișier într-un folder nou cu următorul conținut.

# index.html
<h1>Hello, World!</h1>

Acum, să creăm un nou fișier Docker în același folder.

# Dockerfile
FROM nginx:alpine
WORKDIR /usr/share/nginx/html
COPY . .

Construiește imaginea și dă-i numele simple_nginx, așa cum am făcut anterior.

docker build -t simple_nginx .

În cele din urmă, să rulăm imaginea nouă creată cu următoarea comandă:

docker run --rm -d -p 8080:80 simple_nginx

S-ar putea să vă gândiți că nu s-a întâmplat nimic pentru că ați revenit la terminalul dvs., dar să aruncăm o privire mai atentă cu docker ps comanda.

1612036933 948 Docker 101 Fundamente si practica
A trebuit să decupez rezultatul, dar veți vedea alte câteva coloane acolo

docker ps comanda arată toate containerele care rulează în mașina dvs. După cum puteți vedea în imaginea de mai sus, am un container numit simple_nginx rulează în mașina mea chiar acum. Să deschidem un browser web și să vedem dacă nginx își face treaba accesând localhost:8080.

1612036933 719 Docker 101 Fundamente si practica
Ura! (este ultima oară, promit)

Totul pare să funcționeze așa cum era de așteptat și servim o pagină statică prin nginx care rulează în interiorul containerului nostru. Să luăm un moment pentru a înțelege cum am realizat asta.

Descompunându-l

O să omit explicația Dockerfile pentru că am aflat deja acele comenzi în ultima secțiune. Singurul lucru „nou” din acea configurație este nginx:alpine imagine, pe care o puteți citi mai multe despre aceasta Aici.

În afară de ceea ce este nou, această configurație funcționează deoarece nginx folosește usr/share/nginx/html folder pentru a căuta un index.html fișier și începeți să îl difuzați, așa că de când am denumit fișierul nostru index.html și a configurat fișierul WORKDIR a fi usr/share/nginx/html, această configurare va funcționa chiar din cutie.

build comanda este exact ca cea pe care am folosit-o și în ultima secțiune, folosim doar configurația Dockerfile pentru a construi o imagine cu un anumit nume.

Acum, pentru partea distractivă, docker run --rm -d -p 8080:80 simple_nginx instrucțiune. Aici avem două steaguri noi. Primul este detașat (-d), ceea ce înseamnă că dorim să rulăm acest container în fundal și de aceea ne întoarcem la terminalul nostru imediat după ce am folosit docker run , chiar dacă containerul nostru funcționează în continuare.

Al doilea steag nou este -p 8080:80 opțiune. După cum ați fi putut ghici, acesta este port pavilion și este practic cartografierea portului 8080 de la mașina noastră locală la port 80 în interiorul containerului nostru. Ați fi putut folosi orice alt port în loc de 8080, dar nu puteți schimba portul 80 fără a adăuga o setare suplimentară la nginx imagine, din moment ce 80 este portul standard al nginx imaginea expune.

Notă: Dacă doriți să opriți un container detașat ca acesta, puteți utiliza docker ps comanda pentru a obține numele containerului (nu imagine), apoi folosiți fișierul docker stop instrucțiune cu numele containerului dorit la sfârșitul liniei.

Partea 5. Sfârșitul

Asta este! Dacă tot citești acest lucru, ai toate elementele de bază pentru a începe să folosești Docker astăzi pentru proiectele tale personale sau pentru munca de zi cu zi.

Spuneți-mi ce părere aveți despre acest articol în comentarii și mă voi asigura că voi scrie un articol de urmărire care acoperă subiecte mai avansate precum docker-compose undeva în viitorul apropiat.

Dacă aveți întrebări, vă rugăm să ne anunțați.

Noroc!