Exerciții
Comenzi de bază
- Aduceți în cache-ul local imaginea busybox din registrul oficial Docker.
- Rulați un container de busybox care să execute comanda uptime.
- Rulați un container interactiv de busybox. Odată ce ați intrat în el, executați comanda wget google.com, 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.
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.
- 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.
- Folosiți Dockerfile-ul scris anterior pentru a crea o imagine numita node.jstest.
- 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.
- Pe baza surselor și a fișierului Dockerfile din arhiva de laborator, 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 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ă.
- 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.
- 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.