📖 1. Ce este Docker?
Docker este o platformă open-source care permite dezvoltatorilor să împacheteze aplicații în containere - medii izolate ce conțin tot ce este necesar pentru a rula aplicația: cod, runtime, librării, variabile de mediu și fișiere de configurare.
Docker a revoluționat modul în care dezvoltăm, livrăm și operăm aplicații. În 2025, peste 85% dintre companii folosesc containere în producție, iar Docker rămâne standardul de facto.
De ce Docker?
- Consistență - "Funcționează pe laptopul meu" nu mai e o problemă. Același container rulează identic în dezvoltare, testare și producție.
- Izolare - Containerele sunt izolate între ele și de sistemul gazdă.
- Portabilitate - Rulează pe orice sistem care are Docker instalat (Linux, Windows, macOS).
- Eficiență - Containerele sunt mult mai ușoare decât mașinile virtuale.
- Scalabilitate - Poți rula sute de containere pe același server.
⚖️ 2. Docker vs Mașini Virtuale
Înțelegerea diferenței dintre containere și mașini virtuale este fundamentală:
| Caracteristică | Docker Containere | Mașini Virtuale |
|---|---|---|
| Dimensiune | MB - sute de MB | GB - zeci de GB |
| Timp de pornire | Secunde (<1s) | Minute |
| Izolare | La nivel de proces | La nivel de sistem complet |
| Performanță | Nativă (fără overhead) | Overhead semnificativ |
| Portabilitate | Excelentă | Limitată |
| Cazuri de utilizare | Microservicii, CI/CD, Dev/Test | Sisteme complete, kernel diferit |
📥 3. Instalare Docker
Pe Ubuntu/Debian Linux
# Actualizează sistemul sudo apt update && sudo apt upgrade -y # Instalează dependințe sudo apt install -y apt-transport-https ca-certificates curl software-properties-common # Adaugă cheia GPG oficială Docker curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # Adaugă repository-ul Docker echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # Instalează Docker Engine sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # Adaugă utilizatorul în grupul docker (pentru a rula fără sudo) sudo usermod -aG docker $USER # Verifică instalarea docker --version docker-compose --version # Pornește și activează serviciul sudo systemctl enable docker sudo systemctl start docker
Logout și login din nou pentru ca modificările grupului să aibă efect.
Pe Windows / macOS
Descarcă Docker Desktop de pe site-ul oficial. Instalează și rulează. Necesită WSL2 pe Windows.
⌨️ 4. Comenzi fundamentale Docker
Iată comenzile esențiale pe care le vei folosi zilnic:
# Informații sistem docker version # Versiunea Docker docker info # Informații detaliate sistem docker system df # Spațiu folosit de Docker # Management imagini docker images # Listează imaginile locale docker pull nginx:latest # Descarcă o imagine docker rmi <image_id> # Șterge o imagine # Management containere docker ps # Containere rulează docker ps -a # Toate containerele (incluse oprite) docker run nginx # Rulează un container docker stop <id> # Oprește un container docker start <id> # Pornește un container oprit docker rm <id> # Șterge un container docker logs <id> # Vezi log-urile unui container docker exec -it <id> bash # Intră în shell-ul containerului # Curățenie docker system prune # Șterge resursele nefolosite docker container prune # Șterge containerele oprite docker image prune # Șterge imaginile nefolosite
🚀 5. Primele tale containere
Exemplu 1: Server web Nginx
# Rulează Nginx pe portul 80 docker run -d --name webserver -p 80:80 nginx # -d : rulează în fundal (detached) # --name : numește containerul # -p 80:80 : mapează portul 80 gazdă la portul 80 container # Verifică curl http://localhost # Sau deschide browser-ul la http://localhost
Exemplu 2: Bază de date MySQL
# Rulează MySQL cu parolă și volum pentru date docker run -d --name mysql-db \ -e MYSQL_ROOT_PASSWORD=parola123 \ -e MYSQL_DATABASE=testdb \ -p 3306:3306 \ mysql:8.0 # Conectează-te la MySQL docker exec -it mysql-db mysql -u root -p
Exemplu 3: Aplicație Node.js
# Creează un fișier app.js
echo "console.log('Hello from Docker!');" > app.js
# Rulează Node.js cu codul montat
docker run --rm -v $(pwd):/app -w /app node:18 node app.js
# --rm : șterge containerul automat după ce se oprește
# -v : montează directorul curent în /app în container
# -w : setează directorul de lucru
📝 6. Crearea propriilor imagini cu Dockerfile
Dockerfile este un fișier text cu instrucțiuni pentru construirea unei imagini Docker.
Exemplu: Aplicație Python Flask
Creează următoarele fișiere:
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello from Docker!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
# requirements.txt flask==2.3.0
# Dockerfile FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY app.py . EXPOSE 5000 CMD ["python", "app.py"]
Construiește și rulează imaginea:
# Construiește imaginea docker build -t flask-app . # Rulează containerul docker run -d -p 5000:5000 --name my-flask-app flask-app # Accesează http://localhost:5000
- Folosește imagini slim sau alpine pentru dimensiuni mai mici
- Combină RUN comenzi pentru a reduce layer-ele
- Folosește .dockerignore pentru a exclude fișiere inutile
- Rulează aplicațiile ca non-root user
- Specifică versiuni explicite pentru imagini de bază
🔧 7. Docker Compose - Aplicații multi-container
Docker Compose permite definirea și rularea aplicațiilor cu mai multe containere folosind un singur fișier YAML.
Exemplu: Aplicație web + Redis + PostgreSQL
# docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
environment:
- REDIS_URL=redis://redis:6379
- DATABASE_URL=postgresql://postgres:password@db:5432/app
depends_on:
- redis
- db
volumes:
- ./app:/app
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
db:
image: postgres:15
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=password
- POSTGRES_DB=app
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- web
volumes:
redis_data:
postgres_data:
Comenzi utile Docker Compose:
# Pornește toate serviciile docker-compose up -d # Oprește serviciile docker-compose down # Vezi log-urile docker-compose logs -f # Reconstruiește și pornește docker-compose up -d --build # Rulează comenzi într-un serviciu docker-compose exec web bash # Verifică statusul docker-compose ps
🌐 8. Rețele în Docker
Docker oferă mai multe tipuri de rețele pentru izolare și comunicare între containere:
# Tipuri de rețele implicite docker network ls # Bridge (implicit) - rețea privată între containere pe același host docker network create my-bridge docker run --network my-bridge nginx # Host - containerul folosește rețeaua host-ului direct docker run --network host nginx # None - fără rețea, complet izolat docker run --network none nginx # Overlay - pentru comunicare între mai mulți Docker host (Swarm/K8s) # Crează o rețea personalizată docker network create --driver bridge myapp-network # Rulează containere în aceeași rețea docker run -d --name db --network myapp-network postgres docker run -d --name app --network myapp-network -p 80:80 nginx
💾 9. Volumuri și persistența datelor
Containerele sunt efemere - când sunt șterse, toate datele se pierd. Volumurile rezolvă această problemă.
Tipuri de volumuri
# 1. Volum numit (recomandat) docker volume create mydata docker run -v mydata:/app/data nginx # 2. Bind mount (montare director gazdă) docker run -v /cale/gazda:/cale/container nginx # 3. tmpfs mount (date în RAM, volatile) docker run --tmpfs /app/temp nginx
Exemplu complet cu volum pentru MySQL
# Crează volumul docker volume create mysql-data # Rulează MySQL cu volum docker run -d \ --name mysql-prod \ -e MYSQL_ROOT_PASSWORD=securepass \ -v mysql-data:/var/lib/mysql \ mysql:8.0 # Datele persistă chiar dacă ștergem containerul docker rm -f mysql-prod docker run -d --name mysql-new -v mysql-data:/var/lib/mysql mysql:8.0 # Datele sunt încă acolo!
🛠️ 10. Proiecte practice
Proiect 1: WordPress cu MySQL
# docker-compose.yml
version: '3.8'
services:
db:
image: mysql:8.0
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppass
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppass
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
volumes:
db_data:
wp_data:
Proiect 2: Monitorizare cu Prometheus + Grafana
# docker-compose.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana_data:/var/lib/grafana
volumes:
grafana_data:
Proiect 3: API REST cu Node.js + MongoDB
# docker-compose.yml
version: '3.8'
services:
mongodb:
image: mongo:6
volumes:
- mongo_data:/data/db
api:
build: ./api
ports:
- "3000:3000"
environment:
- MONGODB_URI=mongodb://mongodb:27017/app
depends_on:
- mongodb
volumes:
mongo_data:
✅ Concluzie
Felicitări! Ai învățat bazele Docker - de la instalare la aplicații complexe multi-container. Acum poți:
- ✅ Instala și configura Docker pe orice sistem
- ✅ Rula containere și gestiona imagini
- ✅ Crea propriile imagini cu Dockerfile
- ✅ Orhestra aplicații complexe cu Docker Compose
- ✅ Gestiona rețele și volumuri pentru persistență
- Kubernetes (K8s) - Orhestrare containere la scară largă
- Docker Swarm - Clustering nativ Docker
- CI/CD cu GitLab CI sau GitHub Actions - Automatizare build și deploy
- Docker Security - Scanare vulnerabilități, user namespace
- Docker in Production - Logging, monitoring, rolling updates