Înregistrare video
Parte 0 - Intro: de ce Docker?
Ați construit până acum un News Portal complet în Lab 12: backend ASP.NET Core, frontend Angular, autentificare cu Identity, EF Core peste SqlServer LocalDB. Pe laptopurile voastre, rulând local. Cum îl faceți să ruleze pe alt computer? Pe un server? Pe contul unui coleg care e pe Linux?
Până acum răspunsul ar fi “instalează .NET 8, instalează SqlServer, instalează Node, configurează, copiază appsettings, rulează migrări”. Pentru fiecare destinație. Cu fiecare versiune. Asta e ce rezolvă Docker.
Lab-ul asta nu cere Docker pe laptopul vostru
Tot ce facem în lab-ul asta se întâmplă pe server, nu pe laptop. Aveți un cont SSH pe VPS-ul cursului și vă conectați de pe orice mașină cu un SSH client.
Docker e instalat o singură dată pe VPS-ul cursului, eu îl instalez live în fața voastră în secțiunea 04 (așa cum ați face și voi pe un VPS personal în viitor). Voi nu îl instalați - folosiți instanța deja activă prin contul vostru Linux (sunteți în grupul docker, deci comenzile docker ps / docker compose up merg fără sudo).
Frumusețea modelului ăsta e că server-ul e uniform: aceeași versiune Linux, același Docker, același kernel pentru toți. Nu se întâmplă “merge la mine, nu merge la tine” - cel mult “merge în container, nu merge în afară”. Configurarea care urmează presupune un server existent + un user cu sudo + acces shell - exact ce vedeți voi în demo, repetabil oriunde aveți un VPS proaspăt.
Ce e un container
Un container e un proces izolat care rulează într-un environment fix:
- propriul filesystem (rădăcină diferită de host)
- propriile network namespaces (IP intern, porturi proprii)
- propriul process tree (PID 1 e procesul vostru, nu init-ul host-ului)
- limite resource (CPU, RAM, disk) impuse prin cgroups
Spre deosebire de o mașină virtuală, containerul partajează kernelul host-ului. Nu se bootează un OS - procesul pornește direct într-un mediu care arată ca un OS minimal complet. De aici diferența de greutate: o VM are 1-4GB RAM rezervați pentru OS, un container poate porni cu 50MB.
Imagine vs container
E o distincție crucială:
- Imagine (image) = template imutabil. Un fel de “clasă”. Construită o dată, distribuită prin registry-uri (Docker Hub, ghcr.io, Microsoft Container Registry).
- Container = instanță a unei imagini. Un fel de “obiect”. Pornit cu
docker run, are stare proprie, se oprește, se șterge.
Dintr-o singură imagine puteți porni N containere identice. Fiecare are propriul filesystem (modificările la runtime nu afectează imaginea).
De ce Docker pentru proiectul DAW
Concret, pentru ce construiți:
- Reproductibil: containerul rulează la fel pe Windows, macOS, Linux. “Works on my machine” devine “Works in the container, runs anywhere.”
- Multiple servicii: Postgres + .NET API + Angular frontend + nginx, fiecare în propriul container, conectate printr-un network privat. Le porniți cu o singură comandă (
docker compose up). - Deploy: serverul de producție are doar Docker instalat. Nu trebuie să instalați .NET runtime, npm, dependințe, librării native. Imaginea conține totul.
- Versionare: image-uri taggable (
myapp:1.0,myapp:1.1). Rollback la versiunea anterioară =docker run myapp:1.0. - Isolation: o aplicație nu se atinge de alta. Doi colegi pe același server, două containere, propria DB, proprii useri.
Ecosistemul
Docker e referința de facto, dar există alternative:
- Podman - daemonless (nu rulează ca root permanent), API compatibil cu Docker. Multe organizații îl preferă pentru security.
- containerd - runtime-ul de jos pe care îl folosește și Docker. Lucrați direct cu el doar în Kubernetes.
- OCI (Open Container Initiative) - standardul pentru imagini și runtime. Toate cele de mai sus sunt OCI-compliant; o imagine creată cu Docker funcționează în Podman.
În lab-ul asta folosim Docker Engine pe Ubuntu, instalat pe VPS-ul cursului. Eu îl instalez live în secțiunea 04 cu o singură comandă (curl -fsSL https://get.docker.com | sudo sh), în fața voastră, ca demonstrație de cum se face setup-ul pe orice VPS proaspăt. Voi folosiți instanța deja existentă prin contul vostru Linux.
Ce învățați în lab-ul asta
- Dockerfile - rețeta pentru a construi o imagine din cod (secțiunea 01).
- docker-compose - orchestrare a mai multor containere într-un singur fișier (secțiunea 02).
- Reverse proxy + TLS - cum face nginx TLS termination și rutare către containere (secțiunea 03).
- DNS + VPS + deploy - cum ajunge codul de pe laptop pe un server cu HTTPS valid (secțiunea 04).
- Cheatsheet - referință rapidă la comenzile uzuale (secțiunea 05).
- Deploy proiect - ghid pas cu pas pentru deploy-ul proiectului pe VPS-ul cursului (secțiunea 06).
Punctaj (4p)
Lab-ul are o singură temă de 4 puncte: deploy hello world pe contul vostru, după ce primiți credențialele. Detalii complete în secțiunea 06 și pe Teams. Pe scurt: deploy NewsPortal pe <username>.student-dev.ro, screenshot cu Adminer pe DB-ul vostru + listă de articole, cat la Dockerfile + docker-compose.yml, comenzile cu care ați copiat sursa pe server, și opțional ce ați învățat.
Ce vă trebuie înainte de a porni
- Acces SSH la VPS-ul cursului: username + parolă primite pe email după opt-in (sau, dacă nu ați optat, primiți la cerere). Conexiune:
ssh <username>@student-dev.ro. - Un client SSH pe laptop: PowerShell sau Windows Terminal (Windows), Terminal (macOS), gnome-terminal/konsole (Linux). PuTTY/MobaXterm sunt OK.
- Sursa NewsPortal (referință pentru lab): clonată sau descărcată local. Nu rulați nimic local din ea - o puneți pe server prin
scpsaursynccând ajungem la secțiunea de deploy.
Nu aveți nevoie de Docker pe laptop, nici de OpenSSL, nici de .NET SDK. Toate astea sunt pe server (sau le instalăm pe server în timpul lab-ului).