====== Docker ======
Docker este o platformă open source care permite rularea aplicațiilor în containere - medii izolate, ușoare și portabile, care conțin tot ce are nevoie o aplicație ca să funcționeze: cod, biblioteci, configurații. Spre deosebire de mașinile virtuale, containerele Docker nu virtualizează hardware-ul, ci împart kernel-ul sistemului gazdă, ceea ce le face mult mai rapide și mai puțin consumatoare de resurse.
Docker a devenit standardul de facto pentru deployment-ul aplicațiilor moderne, atât în homelab-uri, cât și în medii de producție.
===== Concepte de bază =====
Înainte de instalare, câteva noțiuni esențiale:
* **Imagine (image)** - un șablon read-only din care se creează containerele. O imagine poate fi descărcată din Docker Hub sau construită local cu un Dockerfile.
* **Container** - o instanță rulantă a unei imagini. Poate fi pornit, oprit, șters și recreat oricând.
* **Docker Hub** - registrul public oficial de imagini Docker, de unde se descarcă imaginile cu comanda ''docker pull''.
* **Volume** - mecanism de persistență a datelor în afara containerului. Fără volume, datele se pierd când containerul este șters.
* **Docker Compose** - unealtă care permite definirea și rularea mai multor containere împreună, folosind un fișier ''docker-compose.yml''.
===== Instalare =====
Metoda recomandată pe toate distribuțiile este instalarea din repozitoriul oficial Docker, nu din repozitoriile distribuției, deoarece versiunile din urmă pot fi mai vechi.
# Instalează dependențele necesare
sudo apt update
sudo apt install -y ca-certificates curl gnupg
# Adaugă cheia GPG oficială Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Adaugă repozitoriul Docker
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Instalează Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Instalează dependențele necesare
sudo apt update
sudo apt install -y ca-certificates curl gnupg
# Adaugă cheia GPG oficială Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Adaugă repozitoriul Docker
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Instalează Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Adaugă repozitoriul Docker
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
# Instalează Docker
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Pe Arch Linux, Docker este disponibil direct din repozitoriile oficiale, fără a fi nevoie de repozitorii suplimentare:
sudo pacman -S docker docker-compose
Pe openSUSE Tumbleweed și Leap, Docker se instalează din repozitoriile oficiale:
sudo zypper install docker docker-compose
===== Configurare inițială =====
După instalare, pașii următori sunt comuni tuturor distribuțiilor.
**Pornește și activează serviciul Docker:**
sudo systemctl enable --now docker
**Adaugă utilizatorul curent în grupul ''docker''** pentru a putea rula comenzi Docker fără ''sudo'':
sudo usermod -aG docker $USER
După această comandă, este necesar să te deloghezi și să te reloghezi (sau să rulezi ''newgrp docker'' în sesiunea curentă) pentru ca modificarea să aibă efect.
**Verifică instalarea:**
docker --version
docker run hello-world
Dacă totul funcționează corect, ''hello-world'' va descărca o imagine de test și va afișa un mesaj de confirmare.
===== Utilizare de bază =====
==== Imagini ====
# Caută o imagine pe Docker Hub
docker search nginx
# Descarcă o imagine
docker pull nginx
# Listează imaginile descărcate local
docker images
# Șterge o imagine
docker rmi nginx
==== Containere ====
# Pornește un container (descarcă imaginea automat dacă nu există local)
docker run nginx
# Pornește un container în fundal (detached)
docker run -d nginx
# Pornește un container cu un nume și mapare de port
docker run -d --name webserver -p 8080:80 nginx
# Listează containerele active
docker ps
# Listează toate containerele (inclusiv cele oprite)
docker ps -a
# Oprește un container
docker stop webserver
# Pornește un container oprit
docker start webserver
# Șterge un container (trebuie să fie oprit)
docker rm webserver
# Șterge un container forțat (chiar dacă rulează)
docker rm -f webserver
==== Interacțiune cu containerele ====
# Deschide un shell interactiv într-un container care rulează
docker exec -it webserver bash
# Pornește un container și deschide direct un shell
docker run -it ubuntu bash
# Vizualizează log-urile unui container
docker logs webserver
# Urmărește log-urile în timp real
docker logs -f webserver
==== Volume ====
Fără volume, datele din container se pierd la ștergerea acestuia. Există două metode principale:
**Bind mount** - mapezi un director de pe sistemul gazdă direct în container:
docker run -d --name webserver \
-p 8080:80 \
-v /opt/mysite:/usr/share/nginx/html \
nginx
**Volume Docker** - gestionat de Docker, stocat în ''/var/lib/docker/volumes/'':
# Creează un volume
docker volume create mydata
# Folosește volumul
docker run -d --name db \
-v mydata:/var/lib/postgresql/data \
postgres
# Listează volumele
docker volume ls
# Șterge un volume
docker volume rm mydata
===== Docker Compose =====
Docker Compose simplifică gestionarea aplicațiilor formate din mai multe containere. Configurația se definește într-un fișier ''docker-compose.yml''.
Un exemplu simplu cu Nginx și un volum:
services:
web:
image: nginx:latest
container_name: webserver
ports:
- "8080:80"
volumes:
- ./site:/usr/share/nginx/html
restart: unless-stopped
Un exemplu mai complex, cu o aplicație web și o bază de date:
services:
app:
image: wordpress:latest
container_name: wordpress
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: parola_secreta
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
restart: unless-stopped
depends_on:
- db
db:
image: mariadb:11
container_name: wordpress_db
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: parola_secreta
MYSQL_ROOT_PASSWORD: root_parola_secreta
volumes:
- db_data:/var/lib/mysql
restart: unless-stopped
volumes:
wp_data:
db_data:
Comenzi utile Docker Compose (se rulează din directorul unde se află fișierul ''docker-compose.yml''):
# Pornește toate serviciile (în fundal)
docker compose up -d
# Oprește toate serviciile
docker compose down
# Oprește și șterge și volumele (atenție: șterge datele!)
docker compose down -v
# Vizualizează log-urile tuturor serviciilor
docker compose logs -f
# Recreează un singur serviciu
docker compose up -d --force-recreate app
# Actualizează imaginile și repornește
docker compose pull && docker compose up -d
===== Întreținere =====
În timp, Docker acumulează imagini, containere și volume nefolosite care ocupă spațiu pe disc. Curățarea periodică se poate face cu:
# Șterge toate resursele neutilizate (containere oprite, imagini orfane, rețele)
docker system prune
# Include și volumele nefolosite (atenție: ireversibil)
docker system prune --volumes
# Verifică spațiul ocupat de Docker
docker system df
===== Resurse utile =====
* [[https://docs.docker.com|Documentația oficială Docker]]
* [[https://hub.docker.com|Docker Hub]] - registrul public de imagini
* [[https://docs.docker.com/compose/|Docker Compose]] - documentație oficială
* [[https://github.com/docker/compose|Docker Compose pe GitHub]]
{{tag>docker containere virtualizare instalare linux devops homelab}}