🐳 Docker pentru începători - Ghid complet 2025

Învață să folosești containere Linux de la zero

📖 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.

📊 Statistici 2025: Conform Cloud Native Computing Foundation, peste 15 milioane de dezvoltatori folosesc Docker activ. Peste 8 milioane de aplicații sunt containerizate global.

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 ContainereMașini Virtuale
DimensiuneMB - sute de MBGB - zeci de GB
Timp de pornireSecunde (<1s)Minute
IzolareLa nivel de procesLa nivel de sistem complet
PerformanțăNativă (fără overhead)Overhead semnificativ
PortabilitateExcelentăLimitată
Cazuri de utilizareMicroservicii, CI/CD, Dev/TestSisteme complete, kernel diferit
💡 Analogie: O mașină virtuală este ca o casă completă cu fundație, pereți, utilități proprii. Un container este ca un apartament într-un bloc - împarte infrastructura cu alții dar este izolat.

📥 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
💡 Best practices Dockerfile:
  • 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
📌 Notă: Containerele din aceeași rețea bridge personalizată se pot vedea între ele folosind numele containerului ca hostname.

💾 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!
⚠️ Important: Backup-ul volumurilor este esențial pentru datele importante.

🛠️ 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ță
🎯 Următorii pași pentru avansare:
  • 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
📌 Ai nevoie de ajutor cu containerizarea aplicațiilor tale? ServiciiLinux oferă consultanță și implementare pentru migrarea aplicațiilor în containere Docker și Kubernetes.
📞 Solicită consultanță Docker → ← Înapoi la toate articolele