Sari la conținutul principal

Exerciții

Docker Compose

sugestie

Puteți accesa resursele practice pentru acest laborator pe repository-ul oficial al materiei IDP. Exercițiile urmăresc înțelegerea conceptelor de Docker Compose.

  1. Scrieți configurația containerelor de la ultimul set de exerciții din laboratorul 1 în maniera Compose:
    • pentru containerul de API, folosiți sursele și Dockerfile-ul din directorul API aflat pe repository, sau direct imaginea mobylab/idp-laborator2-api de pe Docker Hub
    • pentru containerul de Postgres, găsiți fișierul init-db.sql în directorul Database din repository.
  2. Introduceți un al treilea serviciu bazat pe imaginea adminer, care face parte dintr-o rețea comună cu baza de date, alta decât cea pe care baza de date o folosește la comunicația cu API-ul (așadar, trebui să aveți două rețele).
  3. Spargeți configurația în două fișiere de Compose, unul de bază și unul care să folosească secrete (găsiți fișierele pentru secrete în directorul secrets din repository). Rulați cele două configurații împreună.
atenție

După ce veți sparge configurația inițială în două, o să observați că trebuie să renunțați la niște variabile de mediu ale bazei de date din fișierul de bază, și anume POSTGRES_USER și POSTGRES_PASSWORD. În configurația cu secrete, numele de utilizator și parola vor fi setate prin variabilele de mediu POSTGRES_USER_FILE și POSTGRES_PASSWORD_FILE, care sunt disjuncte cu cele menționate anterior. Este important de menționat că valorile pentru aceste două variabile de mediu reprezintă căile complete ale fișierelor secret, de forma /run/secrets/NUME_SECRET.

atenție

Pentru a introduce secrete și în serviciul de API, trebuie să setați variabila de mediu NODE_ENV la valoarea „staging” și să setați variabilele de mediu PGPASSWORD_SECRET și PGUSER_SECRET doar cu numele secretului, nu cu toată calea /run/secrets/NUME_SECRET precum în cazul bazei de date.

Docker Swarm

Pentru exercițiile din această secțiune, vom lucra cu o variantă extinsă a aplicației bibliotecă de mai sus. Astfel, codul (care se găsește pe repository-ul oficial IDP) este format din trei mici microservicii scrise în Node.Js și un script de inițializare pentru o bază de date PostgreSQL. Cele trei microservicii sunt:

  • ApiGateway - mediază accesul dinspre lumea exterioară și redirecționează cererile HTTP către serviciul de cărți
  • Books - se ocupă de partea de „business logic” ce ține de cărți și apelează serviciul IO pentru date
  • IO - gestionează datele sistemului și realizează comunicația cu baza de date.

Scop exerciții

Scopul exercițiilor este ca, plecând de la codul propus, să realizați o stivă de servicii care să funcționeze corect. Funcționalitatea este reprezentată de trei acțiuni:

  • adăugarea unei cărți în bibliotecă
  • vizualizarea informațiilor despre toate cărțile din bibliotecă
  • vizualizarea detaliilor unei cărți.

Pe scurt, va trebui să scrieți unul sau mai multe fișiere Docker Compose pe care să le folosiți pentru a rula configurația sub forma unei stive de servicii Docker Swarm. Stiva creată va fi formată din 5 servicii:

  • gateway - puteți să creați imaginea pe baza surselor din repository, sau puteți folosi imaginea mobylab/idp-laborator2-gateway
  • books-service - puteți să creați imaginea pe baza surselor din repository, sau puteți folosi imaginea mobylab/idp-laborator2-books
  • io-service - puteți să creați imaginea pe baza surselor din repository, sau puteți folosi imaginea mobylab/idp-laborator2-io
  • db - folosiți imaginea postgres:12
  • adminer - folosiți imaginea adminer.

Variabile de mediu

Variabilele de mediu ce vor trebui puse in fișierul Docker Compose sunt următoarele:

  • serviciul gateway:
    • BOOKS_SERVICE_API_ROUTE: books-service/api
    • NODE_ENV: development
  • serviciul books-service:
    • IO_SERVICE_API_ROUTE: io-service/api
    • NODE_ENV: development
  • serviciul io-service:
    • PGUSER: admin
    • PGPASSWORD: admin
    • PGHOST: db
    • PGPORT: 5432
    • PGDATABASE: books
    • NODE_ENV: development
  • serviciul db:
    • POSTGRES_DB: books
    • POSTGRES_USER: admin
    • POSTGRES_PASSWORD: admin.

Rețele

Pentru a izola accesul serviciilor asupra clusterului, sunt necesare mai multe rețele, astfel:

  • serviciul gateway va comunica doar cu serviciul books-service
  • serviciul books-service va comunica atât cu serviciul de gateway, cât și cu io-service
  • serviciul io-service va comunica atât cu serviciul books-service, cât și cu serviciul db
  • serviciul db va comunica atât cu serviciul io-service, cât și cu adminer.

Volume și bind mounts

Configurația de volume și bind mounts este la fel ca cea de la exercițiile de mai sus. Astfel, serviciul de bază de date are nevoie de un volum pentru persistență și de un bind mount pentru a se injecta scriptul de inițializare.

Porturi publice

Singurele servicii accesibile din exterior vor fi gateway și adminer. Pentru gateway, trebuie expus portul intern 80, peste care se mapează alt port (de exemplu, 3000), iar pentru adminer trebuie expus portul intern 8080 (peste care se poate de asemenea mapa alt port extern).

Rute HTTP

Dacă reușiți să rulați configurația, puteți să o testați folosind cURL sau Postman pe următoarele rute:

  • POST localhost:PORT_PUBLIC/api/books cu corpul JSON {"title": "Harry Potter and the Prisoner of Azkaban", "author": "J.K. Rowling", "genre": "Fantasy"}
  • GET localhost:PORT_PUBLIC/api/books
  • GET localhost:PORT_PUBLIC/api/books/ID_CARTE.
sugestie

Pentru a adăuga un corp JSON unei cereri POST in Postman, selectați Body → Raw → JSON și scrieți JSON-ul aferent.

Secrete

Opțional, puteți adăuga secrete aplicației, pentru numele de utilizator și parola necesare logării în baza de date. Astfel, serviciile care vor avea nevoie de secrete sunt io-service și db. În cele două servicii, va trebui să sufixați variabilele de mediu destinate numelui de utilizator și parolei cu _FILE și să puneți valorile acestor variabile de mediu în funcție de documentație:

  • pentru io-service, la variabilele de mediu pentru numele de utilizator și parolă se pune doar numele secretului, iar NODE_ENV se setează la staging
  • pentru serviciul db, la variabilele de mediu se pune toată calea secretului (/run/secrets/nume-secret).

Enunțuri

  1. Scrieți un fișier Docker Compose care să folosească un build local și rulați pe mașina voastră
  2. Construiți imaginile și urcați-le pe Docker Hub sau orice alt registru
  3. Scrieți un fișier Docker Compose care să folosească imaginile din registru și rulați pe mașina voastră
  4. Adăugați elemente de Docker Swarm la serviciile din fișierul Docker Compose (la proprietatea deploy) și rulați stiva de servicii într-un cluster (folosind Play with Docker sau Docker Machine)
  5. Modificați fișierul Docker Compose ca să utilizați secrete externe pentru numele de utilizator și parolă în containerele de IO și bază de date.