Skip to main content

Exerciții

Comenzi de bază

  1. Aduceți în cache-ul local imaginea busybox din registrul oficial Docker.
  2. Rulați un container de busybox care să execute comanda uptime.
  3. Rulați un container interactiv de busybox. Odată ce ați intrat în el, executați comanda wget google.com, apoi ieșiți.
  4. 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.
  5. Ștergeți toate containerele și imaginile create la punctele precedente.

Crearea unei imagini

tip

Pentru exercițiile următoare, veți porni de la această arhivă, care conține o aplicație simplă Node.Js.

  1. 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 Node.Js, adică node:21-alpine3.18
    • se va copia fișierul package.json din arhivă în directorul curent (./); acest fișier are rolul de a specifica dependențele aplicației Node.Js (de exemplu, framework-ul Express.js)
    • se va rula comanda npm install pentru a instala dependețele din fișierul de la pasul precedent
    • se va copia sursa server.js în directorul de lucru /usr/src/app/
    • se va expune portul 8080
    • în final, se va menționa comanda de rulare a aplicației; astfel, se va rula fișierul /usr/src/app/server.js cu binarul node.
  2. Folosiți Dockerfile-ul scris anterior pentru a crea o imagine numita node.jstest.
  3. Porniți un container care să ruleze imaginea node.jstest pe portul 12345 în modul detașat (daemon). Verificați că funcționează corect intrând pe http://127.0.0.1:12345 (ar trebui să vă apară un mesaj de Hello World).

Lucrul cu rețele, volume și bind mounts

tip

Pentru exercițiile următoare, veți porni de la această arhivă, care conține o aplicație Node.Js 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.

  1. Pe baza surselor și a fișierului Dockerfile din arhiva de laborator, construiți o imagine cu numele (tag-ul) api-laborator-1-image.
  2. Creați o rețea bridge numită laborator1-db-network.
  3. Creați un volum numit laborator1-db-persistent-volume.
  4. 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.
  5. 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 valoarea 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ă.
  6. Verificați că cele două containere rulează corect și au conectivitate:
    • folosind 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 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.
  7. 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.