Docker de la sol lucrul cu containerele, partea 1

Aceasta este o parte dintr-o serie de două părți despre lucrul cu containerele Docker. În această parte, ne vom concentra pe numeroasele moduri și opțiuni de rulare a unei imagini și despre modul în care gazda poate interacționa cu un container Docker. 

În cea de-a doua parte, vom include listarea, pornirea, oprirea și repornirea containerelor, precum și executarea comenzilor pe rularea containerelor. Imaginile Docker sunt unitățile de implementare. Când executați o imagine, instanțiați un container Docker care rulează un singur proces în mediul său izolat pentru sistemul de fișiere, crearea de rețele și procesarea copacilor. 

Containerele Docker sunt foarte flexibile și permit multe cazuri de utilizare care sunt prea grele, complexe și / sau costisitoare cu alte tehnologii cum ar fi mașinile virtuale și serverele metalice goale.

Înainte de a începe, asigurați-vă că Docker este instalat corect în mediul dvs. În funcție de modul în care a fost instalat și de utilizatorul dvs., este posibil să fie necesar să îl executați ca sudo. Voi sari peste sudo. 

Rularea unei imagini

Lansați un container Docker rulând o imagine. Există mai multe moduri de a rula un container care afectează cât de ușor este de a gestiona toate containerele. Când containerul pornește, rulează de obicei comanda definită în fișierul Docker. Aici este Dockerfile pentru containerul salut-lume:

De la zero COPY hello / CMD ["/ hello"] 

Comanda execută pur și simplu binarul "hello" care a fost copiat la rădăcina containerului când a fost construită imaginea.

Foreground vs. Detached

Un container poate rula în prim-plan în cazul în care blochează până la ieșirea din proces și containerul nu mai funcționează. În modul prim plan, containerul își imprimă ieșirea în consola și poate citi intrarea standard. În modul detașat (când furnizați pavilion -d), comanda revine imediat și containerul 

Rularea unui container neschimbat

Cea mai simplă modalitate de a rula un container este: docker alerga .

Când executați un container utilizând această comandă, Docker îi va atribui un nume compus din două cuvinte aleatorii. De exemplu: docker alerga hello-lume.

Dacă aveți deja imaginea salo-lume, atunci Docker o va executa. Dacă nu, o va trage de la magazia oficială Docker DockerHub și apoi o va rula. Rezultatul ar trebui să arate ca:

Bună ziua de la Docker! Acest mesaj arată că instalarea dvs. pare să funcționeze corect. Pentru a genera acest mesaj, Docker a făcut următorii pași: 1. Clientul Docker a contactat daemonul Docker. 2. Daemonul Docker a tras imaginea "salut-lume" din Hubul Docker. 3. Demo-ul Docker a creat un nou container din acea imagine care rulează executabilul care produce ieșirea pe care o citiți în prezent. 4. Demo-ul Docker a transmis acea ieșire către clientul Docker, care l-a trimis la terminalul tău. Pentru a încerca ceva mai ambițios, puteți rula un container Ubuntu cu: $ docker run -in ubuntu bash Partajați imaginile, automatizați fluxurile de lucru și multe altele cu un ID gratuit Docker: https://cloud.docker.com/ Pentru mai multe exemple și idei, vizitați: https://docs.docker.com/engine/userguide/ 

Programul salut iese după afișarea mesajului, care încheie procesul care rulează în interiorul containerului și termină rularea recipientului. Containerul rămâne în continuare în jur, în cazul în care doriți să vă conectați la el, să examinați jurnalele sau orice altceva. Pentru a vizualiza containerul, puteți executa următoarea comandă:

docker ps -a -format "tabelul .ID \ t .Statul \ t .Names" STATUTUL DE CONTAINER NAMES 8e2e491accb5 Exited (0) acum 2 minute clever_liskov

Voi explica mai târziu cum să listați containerele și toate opțiunile relevante. Pentru moment, să ne concentrăm asupra secțiunii Nume. Docker a generat automat numele "clever_liskov" și va trebui să îl folosesc sau ID-ul containerului pentru a se referi la acest container pentru orice scop, cum ar fi restartarea acestuia, eliminarea sau executarea unei comenzi.

Rularea unui container denumit

Utilizarea codurilor de contacte sau a denumirilor generate automat este uneori incomodă. Dacă interacționați frecvent cu un container pe care îl re-creați frecvent, atunci acesta va primi un ID diferit și un nume generat automat. De asemenea, numele va fi aleatoriu. 

Docker vă permite să denumiți containerele atunci când le executați prin furnizarea unui "- nume "argument argument linie de comandă În cazuri simple, în cazul în care aveți doar un container pe imagine, puteți numi container după imagine: docker run - nume salut-lume hello-lume.

Acum, dacă privim procesul (am eliminat clever_liskov mai devreme) vom vedea că containerul este numit hello-world:

docker ps -a -format "tabel .ID \ t .Names" ID-URI CONTAINER F6fe77b3b6e8 hello-world 

Există mai multe avantaje pentru un container numit:

  • Aveți un nume stabil pentru containerele pe care le utilizați atât în ​​mod interactiv, cât și în scripturi.
  • Puteți alege un nume semnificativ.
  • Aveți posibilitatea să alegeți un nume scurt pentru comoditate atunci când lucrați în mod interactiv.
  • Vă împiedică să aveți în mod accidental mai multe recipiente de aceeași imagine (atâta timp cât vă furnizați întotdeauna același nume).

Să ne uităm la ultima opțiune. Dacă încerc să rulez din nou aceeași comandă de execuție cu același nume "hello-world", primesc un mesaj de eroare clar:

docker run - nume Hello-World hello-world docker: Eroare răspuns de la daemon: Conflict. Numele containerului "/ hello-world" este deja folosit de containerul f6fe77b3b6e8e77ccf346c32c599e67b2982893ca39f0415472c2949cacc4a51. Trebuie să eliminați (sau să redenumiți) acel container pentru a putea reutiliza acest nume. Vedeți "derulați docker --help". 

Rularea unei imagini de eliminare automată

Containerele se blochează în mod implicit. Uneori, nu aveți nevoie de ele. În loc să eliminați manual containerele ieșite, faceți containerul să dispară singur. --rm argumentul liniei de comandă face trucul: docker alerga - rm hello-lume.

Rularea unei comenzi diferite

În mod implicit, Docker execută comanda specificată în fișierul Docker utilizat pentru a construi imaginea (sau direct punctul de intrare, dacă nu se găsește nicio comandă). Puteți să o înlocuiți întotdeauna prin furnizarea unei comenzi proprii la sfârșitul comenzii de rulare. Să fugim Este -la pe Busybox imaginea ( Salut Lume imaginea nu are ls executabil):

docker rula busybox ls -la total 44 drwxr-xr-x 18 rădăcină de rădăcină 4096 Mar 18 17:06. drwxr-xr-x 18 rădăcină rădăcină 4096 Mar 18 17:06 ... -rwxr-xr-x 1 rădăcină rădăcină 0 Mar 18 17:06 .dockerenv drwxr-xr-x rădăcină rădăcină 12288 Mar 9 00:05 bin drwxr-xr -x 5 rădăcină rădăcină 340 Mar 18 17:06 dev drwxr-xr-x rădăcină rădăcină 4096 18 martie 18:06 etc drwxr-xr-x 2 nimeni nogroup 4096 Mar 9 00:05 acasă dr-xr-xr-x 85 rădăcină rădăcină 0 Mar 18 17:06 proc drwxr-xr-x rădăcină rădăcină 4096 Mar 9 00:05 rădăcină dr-xr-xr-x rădăcină rădăcină 0 Mar 18 17:06 sys drwxrwxrwt 2 rădăcină rădăcină 4096 Mar 9 00: 05 tmp drwxr-xr-x 3 rădăcină rădăcină 4096 Mar 9 00:05 usr drwxr-xr-x 4 rădăcină rădăcină 4096 Mar 9 00:05 var 

Interacționează cu gazda

Containerele de docker rulează procese izolate în propria lume mică. Dar este adesea necesar și util să se ofere acces la gazdă.

Transmiterea variabilelor de mediu către un container

Porturile de docker nu moștenesc automat mediul procesului gazdă care le-a executat. Trebuie să furnizați în mod explicit variabile de mediu la container când îl executați utilizând -e linie de comandă. Puteți trece mai multe variabile de mediu. Iată un exemplu: 

docker rula --rm -it -e ENV_FROM_HOST = "123" busybox / # env HOSTNAME = 8e7672bce5a7 SHLVL = 1 HOME = / rădăcină ENV_FROM_HOST = 123 TERM = xterm PATH = / usr / local / / usr / sbin: / usr / bin: / sbin: / bin PWD = / / # 

Prima linie rulează containerul cutie de expediere, trecând-o ENV_FROM_HOST variabilă și apoi în interiorul containerului care rulează env arată că ENV_FROM_HOST este setat corect.

Puteți utiliza și variabilele de mediu gazdă. Aceasta stabilește câteva variabile de mediu gazdă și le folosește în comanda de rulare:

$ export VAR_1 = export 1 $ VAR_2 = execuție docker 2 $ --rm -it -e VAR_1 = "$ VAR_1" -e VAR_2 = "VAR_2" ocupat

În interiorul containerului, sunt acum vizibile:

/ # env | grep VAR VAR_1 = 1 VAR_2 = 2 

Instalarea directoarelor gazdă

Una dintre cele mai utile interacțiuni este montarea directoarelor gazdă. Acest lucru permite câteva cazuri interesante de utilizare:

  • Memorare partajată între containerele care rulează pe aceeași gazdă.
  • Vizualizarea și editarea fișierelor utilizând mediul gazdă și instrumentele și utilizarea fișierelor din container.
  • Persistența la nivel de gazdă dincolo de durata de viață a unui container.

Aici creez un fișier pe gazdă: $ echo "Da, funcționează!" > ~ / data / 1.txt

Apoi alerg Busybox imagine de montare a ~ / directorul de date la /date în container și afișarea conținutului fișierului pe ecran:

$ docker rula --rm -v ~ / data: / data busybox cat /data/1.txt Da, functioneaza! 

Am folosit cat /data/1.txt comanda aici.

Expunerea porturilor la gazdă

Dacă expuneți un port în fișierul Docker EXPUNE, acesta va fi accesibil numai pentru alte containere docker. Pentru a le face accesibile pe gazdă, trebuie să utilizați -p argumentul liniei de comandă. Sintaxa este -p :.

Aici rulați Nginx imagine, care expune port 80 și utilizează -p argumentul liniei de comandă pentru a fi vizibil pe gazda de pe portul 9000: 

docker rula --name nginx -rm -d -p 9000: 80 nginx

Rețineți că, spre deosebire de comenzile anterioare care au efectuat unele activități și au fost finalizate, containerul nginx va continua să ruleze și să asculte cererile primite. Să verificăm faptul că nginx este într-adevăr în funcțiune și răspunde la cererile de pe portul 9000. Prefer preferat HTTP client HTTP peste curl pentru a lovit servere web și servicii de la linia de comandă:

http: HEAD localhost: 9000 HTTP / 1.1 200 OK Accept-Ranges: bytes Conexiune: Keep-alive Content-Length: 612 Tip de conținut: text / html Data: 19 Mar 2017 07:35:55 ​​GMT ETag: "58a323e4- 264 "Ultima modificare: Tue, 14 Feb 2017 15:36:04 GMT Server: nginx / 1.11.10 

Concluzie

Există mai multe moduri de a rula o imagine Docker pentru a crea un container și există multe opțiuni. Fiecare combinație acceptă o utilizare particulară. Este foarte util atunci când lucrați cu containerele Docker pentru a înțelege pe deplin detaliile și pentru a utiliza cele mai bune metode pentru lansarea containerelor. 

În plus, atașarea de volume gazdă și expunerea și publicarea porturilor permite integrarea strânsă cu gazda și o mulțime de scenarii de utilizare. În partea a doua, ne vom arunca cu capul într-o grămadă de containere și vom profita de oferta completă oferită de Docker.

Cod