Modulul 9 · 9.2
Instalarea Docker și primul dumneavoastră container
Modulul 9: Docker și docker compose · Timp de citire: 11 minute
Obiectivul lecției: După această lecție veți putea instala Docker Engine din sursa oficială de pachete, veți putea porni, examina, inspecta din interior și curăța containere și veți ști de ce grupul docker echivalează cu root.
Noțiuni cheie: Docker Engine, Docker Desktop, sursa apt oficială, docker.io din Debian, grupul docker, rootless mode, docker run, -d, -p, -v, --name, docker ps, docker logs, docker exec, docker stop, docker rm, docker image prune, docker system df
Ce Docker?
Pe un server instalați Docker Engine: serviciul de fundal (dockerd) plus comanda docker. Docker Desktop este altceva: un program cu ferestre pentru Windows, macOS și desktopuri Linux. Acesta nu are ce căuta pe un server.
Există două surse corecte pentru Docker Engine:
- Sursa de pachete a Docker (
download.docker.com). Întotdeauna cea mai nouă versiune, inclusiv pluginuldocker composepe care îl veți folosi în lecția 9.3. Aceasta este varianta descrisă în documentația Docker și cea folosită în acest curs. - Pachetul
docker.iodin Debian sau Ubuntu. Mai vechi, dar actualizat de distribuție prin actualizările de securitate obișnuite (lecția 4.2). Este o alegere bună dacă preferați să nu aveți nimic din afara distribuției; verificați însă dacădocker compose(cu spațiu) este disponibil.
Alegeți una dintre ele. Instalarea amestecată produce conflicte; de aceea documentația Docker recomandă să eliminați mai întâi pachetele neoficiale precum docker.io, docker-compose și podman-docker.
Instalarea din sursa de pachete a Docker
Iată pașii din documentația Docker pentru Debian, cu cheia separată și un Signed-By propriu (lecția 4.1). Dacă doriți, faceți mai întâi un snapshot.
anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install ca-certificates curl
anna@web1:~$ sudo install -m 0755 -d /etc/apt/keyrings
anna@web1:~$ sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
anna@web1:~$ sudo chmod a+r /etc/apt/keyrings/docker.ascApoi fișierul sursei /etc/apt/sources.list.d/docker.sources (format deb822):
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.ascLa Suites se trece numele de cod al versiunii dumneavoastră (cat /etc/os-release, lecția 4.3), iar la Architectures rezultatul comenzii dpkg --print-architecture. Pe Ubuntu, URL-ul este https://download.docker.com/linux/ubuntu, iar suita este, de exemplu, noble.
Apoi instalați:
anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
anna@web1:~$ sudo docker run hello-world
...
Hello from Docker!
This message shows that your installation appears to be working correctly.Pe Debian și Ubuntu, Docker pornește automat după instalare și după fiecare repornire (systemctl status docker, lecția 6.1).
Atenție: unattended-upgrades (lecția 4.2) nu actualizează automat, în mod implicit, pachetele din această sursă. Includeți sudo apt update && sudo apt upgrade pentru Docker în ritmul dumneavoastră de întreținere (lecția 10.4) sau adăugați în mod conștient sursa la actualizările automate.
Grupul docker înseamnă root
Peste tot pe internet veți citi că trebuie să vă adăugați în grupul docker, ca să nu mai fie nevoie să tastați sudo:
anna@web1:~$ sudo usermod -aG docker annaFaceți acest lucru doar dacă înțelegeți ce înseamnă. Documentația Docker este clară: grupul docker oferă drepturi la nivel de root. Cine poate controla serviciul Docker poate porni un container în care este montat întregul disc al gazdei:
docker run -it -v /:/host debian chroot /hostși devine astfel root pe serverul dumneavoastră, fără parolă și fără jurnal sudo. Documentația Docker o spune așa: doar utilizatorii de încredere ar trebui să aibă voie să controleze serviciul Docker.
Pentru un server pe care îl administrați doar dumneavoastră, este o alegere: comoditate în schimbul unei căi suplimentare spre root. Mai sigur este să continuați să tastați sudo docker ...; astfel, fiecare comandă apare în jurnalul sudo (lecția 3.2). În orice caz, nu adăugați niciodată în grup un utilizator care nu are voie să fie root, cum ar fi un utilizator de serviciu pentru un site web.
Rootless mode
Docker poate rula și fără root: serviciul și containerele rulează atunci sub un utilizator obișnuit, cu un user namespace propriu. Îl instalați ca acel utilizator cu dockerd-rootless-setuptool.sh install (din pachetul docker-ce-rootless-extras; în prealabil este necesar pachetul uidmap). O breșă într-un container nu vă oferă atunci root pe gazdă. Există limitări și configurarea este mai dificilă; în acest curs folosim instalarea obișnuită și o păstrăm sigură cu regulile din acest modul.
Un prim container adevărat
Pornim un server web nginx într-un container, accesibil doar de pe server:
anna@web1:~$ sudo docker run -d --name proef -p 127.0.0.1:8080:80 nginx:stable
Unable to find image 'nginx:stable' locally
stable: Pulling from library/nginx
...
3f1c9e0d7a2b...Componentele:
| Parte | Semnificație |
|---|---|
-d | Rulare în fundal (detached) |
--name proef | Un nume, ca să nu fie nevoie să lucrați cu ID-uri lungi |
-p 127.0.0.1:8080:80 | Portul 80 din container devine portul 8080 pe gazdă, doar pe loopback |
nginx:stable | Imaginea oficială nginx, tag stable |
Verificați:
anna@web1:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
3f1c9e0d7a2b nginx:stable "/docker-entrypoint.…" Up 5 seconds 127.0.0.1:8080->80/tcp proef
anna@web1:~$ curl -I http://127.0.0.1:8080
HTTP/1.1 200 OK
Server: nginx/1.28.0
anna@web1:~$ sudo ss -tlnp | grep 8080
LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:* users:(("docker-proxy",pid=2211,fd=7))ss (lecția 5.1) confirmă: doar pe 127.0.0.1. Dacă ați fi tastat -p 8080:80, ar fi apărut 0.0.0.0:8080 și [::]:8080, iar containerul dumneavoastră ar fi fost accesibil de pe internet, chiar dacă ufw nu permite portul 8080 (lecția 9.3). Versiunea din antetul Server poate fi diferită la dumneavoastră.
Examinare și intervenție
anna@web1:~$ sudo docker logs proef # ce a scris programul (stdout și stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef # ultimele 20 de rânduri, apoi urmărire continuă
anna@web1:~$ sudo docker exec -it proef sh # un shell în containerul care rulează
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef # oprire și ștergeredocker logs este primul loc în care vă uitați când un container nu se comportă cum vă așteptați, la fel ca journalctl pentru serviciile obișnuite (lecția 6.2). Cu docker exec vă uitați în interior, dar e preferabil să nu modificați nimic acolo: modificările din container dispar la următoarea actualizare (lecția 9.1).
Curățenie
Imaginile și containerele oprite rămân pe disc până le curățați. Pe un VPS cu un disc mic, spațiul ocupat crește pe nesimțite.
anna@web1:~$ sudo docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 7 3 1.9GB 1.2GB (63%)
Containers 3 3 12MB 0B (0%)
Local Volumes 2 2 180MB 0B (0%)
Build Cache 0 0 0B 0B
anna@web1:~$ sudo docker image prunedocker image prune elimină imaginile fără nume care nu mai aparțin de nimic; cu -a elimină și toate imaginile pe care nu le folosește niciun container. Fiți atenți la docker system prune --volumes: acesta elimină și volumele anonime (fără nume) care în acel moment nu aparțin unui container, iar docker volume prune -a elimină chiar și volumele cu nume. În ele se pot afla datele dumneavoastră. De aceea, dați întotdeauna un nume volumelor sau folosiți un bind mount (lecția 9.1) și verificați mai întâi cu docker volume ls.
Și jurnalele containerelor pot crește. Implicit, Docker le păstrează în fișiere JSON fără limită de dimensiune. O limită se setează în /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}Apoi rulați sudo systemctl restart docker; setarea se aplică doar containerelor nou create, iar containerele existente trebuie create din nou.
În practică
Docker funcționează pe un VPS de la WebOké la fel ca la orice alt furnizor: este software în propriul dumneavoastră server, pe care îl instalați și îl actualizați singuri. Pe un VPS mic, verificați regulat spațiul pe disc cu docker system df și df -h (lecția 1.4).
Rezumat
- Instalați Docker Engine din sursa de pachete a Docker (cu cheie proprie și
Signed-By) saudocker.iodin distribuție, nu ambele. - Grupul docker echivalează cu root;
sudo dockerlasă o urmă în jurnalul sudo. Rootless mode este o alternativă mai sigură, dar mai limitată. docker run -d --name ... -p 127.0.0.1:host:container image:tagpornește un container accesibil doar local; verificați cuss.docker ps,logs,exec,stop,rmsunt instrumentele dumneavoastră zilnice.- Curățați imaginile cu
docker image prune, limitați jurnalele containerelor (implicit nelimitate) și folosiți cu prudență--volumes.
Test (quiz)
Exercițiu
Exercițiul O9.2: Primul dumneavoastră container. Instalați Docker Engine pe serverul dumneavoastră conform lecției (sau pe o mașină de test). Porniți un container nginx care ascultă doar pe 127.0.0.1:8080, verificați cu docker ps, curl -I și ss -tlnp, examinați jurnalele și apoi curățați-l. Răspundeți la întrebări: din ce sursă ați instalat Docker, ce a arătat ss la portul 8080 și v-ați adăugat în grupul docker (de ce da sau de ce nu)?
Exercițiul O9.2: Primul dumneavoastră container
Acest exercițiu îl faceți singur; nimeni nu îl verifică. Bifați ce ați făcut și marcați exercițiul ca finalizat.
Din sursa Docker, unattended-upgrades nu îl actualizează implicit; docker.io din distribuție, da. ss trebuie să afișeze 127.0.0.1:8080, nu 0.0.0.0:8080. Grupul docker oferă drepturi de root; cu sudo docker, fiecare comandă rămâne în jurnalul sudo.
Bifele și notițele dumneavoastră rămân doar în acest browser; nu le trimitem nicăieri. Dacă sunteți autentificat, păstrăm în Cursurile mele doar faptul că ați finalizat exercițiul.
Lecturi suplimentare
- Documentația Docker, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Documentația Docker, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Documentația Docker, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Documentația Docker, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Documentația Docker, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Documentația Docker, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
