This shows you the differences between two versions of the page.
cc:laboratoare:01 [2021/10/08 12:13] radu.ciobanu |
cc:laboratoare:01 [2022/10/10 09:09] (current) radu.ciobanu |
||
---|---|---|---|
Line 937: | Line 937: | ||
==== Exerciții ==== | ==== Exerciții ==== | ||
+ | |||
+ | === Comenzi de bază === | ||
- Aduceți în cache-ul local imaginea **//busybox//** din registrul oficial Docker. | - Aduceți în cache-ul local imaginea **//busybox//** din registrul oficial Docker. | ||
Line 943: | Line 945: | ||
- Rulați un container interactiv detașat (daemon) de **//busybox//**. Odată ce l-ați pornit, atașați-vă la el și dați comanda **//id//**, apoi ieșiți. | - Rulați un container interactiv detașat (daemon) de **//busybox//**. Odată ce l-ați pornit, atașați-vă la el și dați comanda **//id//**, apoi ieșiți. | ||
- Ștergeți toate containerele și imaginile create la punctele precedente. | - Ștergeți toate containerele și imaginile create la punctele precedente. | ||
- | - Pornind de la cele două fișiere din {{:cc:laboratoare:homework1.zip|această arhivă}}, scrieți un Dockerfile care va crea o imagine urmărind pașii de mai jos: | + | |
+ | === Crearea unei imagini === | ||
+ | |||
+ | <note tip>Pentru exercițiile următoare, veți porni de la {{:cc:laboratoare:homework1.zip|această arhivă}}, care conține o aplicație simplă NodeJS.</note> | ||
+ | |||
+ | - Pornind de la cele două fișiere din arhivă, scrieți un Dockerfile care va crea o imagine urmărind pașii de mai jos: | ||
- se va porni de la cea mai recentă versiune a imaginii oficiale de NodeJS, adică **//node:14.13.0-stretch//** | - se va porni de la cea mai recentă versiune a imaginii oficiale de NodeJS, adică **//node:14.13.0-stretch//** | ||
- se va copia fișierul **//package.json//** din arhivă în directorul curent (./); acest fișier are rolul de a specifica dependențele aplicației NodeJS (de exemplu, framework-ul Express.js) | - se va copia fișierul **//package.json//** din arhivă în directorul curent (./); acest fișier are rolul de a specifica dependențele aplicației NodeJS (de exemplu, framework-ul Express.js) | ||
Line 952: | Line 959: | ||
- Folosiți Dockerfile-ul scris anterior pentru a crea o imagine numita **//nodejstest//**. | - Folosiți Dockerfile-ul scris anterior pentru a crea o imagine numita **//nodejstest//**. | ||
- Porniți un container care să ruleze imaginea **//nodejstest//** pe portul 12345 în modul detașat (daemon). Verificați că funcționează corect intrând pe [[http://127.0.0.1:12345]]. | - Porniți un container care să ruleze imaginea **//nodejstest//** pe portul 12345 în modul detașat (daemon). Verificați că funcționează corect intrând pe [[http://127.0.0.1:12345]]. | ||
+ | |||
+ | === Lucrul cu rețele, volume și bind mounts === | ||
+ | |||
+ | <note tip>Pentru exercițiile următoare, veți porni de la {{:cc:laboratoare:homework2.zip|această arhivă}}, care conține o aplicație NodeJS care realizează un API de adăugare de cărți într-o bibliotecă peste o bază de date PostgreSQL. Exercițiile de mai jos vă trec prin pașii necesari pentru a rula un container pentru o bază de date PostgreSQL și containerul cu aplicația în aceeași rețea, având persistență la oprirea containerelor.</note> | ||
+ | |||
+ | - Pe baza surselor și a fișierului Dockerfile din arhiva de mai sus, construiți o imagine cu numele (tag-ul) **//api-laborator-1-image//**. | ||
+ | - Creați o rețea bridge numită **//laborator1-db-network//**. | ||
+ | - Creați un volum numit **//laborator1-db-persistent-volume//**. | ||
+ | - Porniți în background un container pentru o bază de date cu următoarele caracteristici: | ||
+ | - se va atașa un bind mount care va face o mapare între fișierul **//init-db.sql//** de pe mașina locală (acesta va fi sursa la flag-ul de bind mount și se găsește în arhiva de laborator) și fișierul **///docker-entrypoint-initdb.d/init-db.sql//** din containerul care se va rula (acesta va fi destinația) | ||
+ | - se va atașa volumul **//laborator1-db-persistent-volume//** creat anterior (sursa) la calea **///var/lib/postgresql/data//** din containerul care se va rula (destinația) | ||
+ | - se va rula containerul în rețeaua **//laborator1-db-network//** creată anterior | ||
+ | - se vor specifica următoarele variabile de mediu (într-o comandă de **//docker run//**, acest se lucru se face astfel: **//docker run -e NUME=valoare//**): | ||
+ | - variabila **//POSTGRES_USER//** cu valoare **//admin//** | ||
+ | - variabila **//POSTGRES_PASSWORD//** cu valoarea **//admin//** | ||
+ | - variabila **//POSTGRES_DB//** cu valoarea **//books//** | ||
+ | - containerul rulat se va numi **//laborator1-db//** | ||
+ | - se va rula imaginea **//postgres//** din registrul oficial. | ||
+ | - Porniți în background un container cu imaginea **//api-laborator-1-image//** creată anterior, cu următoarele caracteristici: | ||
+ | - se va rula containerul în rețeaua **//laborator1-db-network//** creată anterior | ||
+ | - se vor specifica următoarele variabile de mediu: | ||
+ | - variabila **//PGUSER//** cu valoare **//admin//** | ||
+ | - variabila **//PGPASSWORD//** cu valoarea **//admin//** | ||
+ | - variabila **//PGDATABASE//** cu valoarea **//books//** | ||
+ | - variabila **//PGHOST//** cu valoarea **//laborator1-db//** | ||
+ | - variabila **//PGPORT//** cu valoarea **//5432//** | ||
+ | - containerul rulat se va numi **//laborator1-api//** | ||
+ | - containerul va expune portul 80 și îl va mapa la portul 5555 de pe mașina locală. | ||
+ | - Verificați că cele două containere rulează corect și au conectivitate: | ||
+ | - folosind [[https://www.postman.com|Postman]] sau orice altă aplicație similară, realizați cereri de GET și POST pe [[http://localhost:5555/api/books]] (pentru un tutorial de Postman, puteți intra [[https://learning.postman.com/docs/getting-started/sending-the-first-request/|aici]]) | ||
+ | - la cererile de POST, se așteaptă un body JSON cu formatul ''%%{"title":"titlu","author":"autor"}%%'' | ||
+ | - cererile de GET vor returna o listă de cărți adăugate prin cereri de POST. | ||
+ | - Verificați că volumul pe care l-ați adăugat păstrează persistența datelor: | ||
+ | - opriți și ștergeți cele două containere | ||
+ | - reporniți cele două containere cu aceleași comenzi ca anterior | ||
+ | - trimiteți o cerere de GET | ||
+ | - dacă ați configurat corect, veți primi o listă cu cărțile adăugate anterior. |