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.
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.
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
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.
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 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:
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".
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
.
Î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
Containerele de docker rulează procese izolate în propria lume mică. Dar este adesea necesar și util să se ofere acces la gazdă.
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
Una dintre cele mai utile interacțiuni este montarea directoarelor gazdă. Acest lucru permite câteva cazuri interesante de utilizare:
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.
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
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.