Salt la conținut

Setări cookie-uri

Alegeți pentru fiecare tip ce cookie-uri permiteți. Puteți modifica oricând alegerea prin Setări cookie-uri, în partea de jos a fiecărei pagini. Declarație de confidențialitate

Necesare

Mereu active

Necesare pentru autentificare, pentru păstrarea coșului și pentru a vă reține alegerile. Acestea sunt mereu active.

Ce cookie-uri?
  • weboke_sessie, weboke_klant, weboke_remember: sesiunea și menținerea autentificării
  • weboke_basket: coșul de cumpărături
  • wkBtwIncl: afișarea prețurilor cu sau fără TVA
  • wok_cookies: alegerea privind cookie-urile, 12 luni

Măsoară ce reclamă duce la o vizită sau o comandă, ca să nu plătim pentru reclame care nu aduc nimic.

Ce cookie-uri?
  • Google Ads prin Google Tag Manager (_gcl_au, _gcl_aw), până la 90 de zile
  • OpenAI Ads, reclame în ChatGPT
  • wok_aff: prin ce partener ați ajuns la noi (program de afiliere), 60 de zile

4,6

Țară și limbă

Fiecare țară are propriul site, cu prețurile și TVA-ul pentru țara respectivă.

Vedeți

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:

  1. Sursa de pachete a Docker (download.docker.com). Întotdeauna cea mai nouă versiune, inclusiv pluginul docker compose pe care îl veți folosi în lecția 9.3. Aceasta este varianta descrisă în documentația Docker și cea folosită în acest curs.
  2. Pachetul docker.io din 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.asc

Apoi 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.asc

La 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 anna

Faceț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:

ParteSemnificație
-dRulare în fundal (detached)
--name proefUn nume, ca să nu fie nevoie să lucrați cu ID-uri lungi
-p 127.0.0.1:8080:80Portul 80 din container devine portul 8080 pe gazdă, doar pe loopback
nginx:stableImaginea 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 ștergere

docker 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 prune

docker 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) sau docker.io din distribuție, nu ambele.
  • Grupul docker echivalează cu root; sudo docker lasă 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:tag pornește un container accesibil doar local; verificați cu ss.
  • docker ps, logs, exec, stop, rm sunt 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)

1. De ce apartenența la grupul docker oferă, de fapt, drepturi de root?



2. După docker run -d -p 8080:80 nginx, ss -tlnp afișează linia 0.0.0.0:8080. Ce ar fi trebuit să tastați pentru a publica portul doar local?



3. Un container pornește, dar site-ul din el nu funcționează. Ce verificați mai întâi?



4. De ce alegeți o singură sursă pentru Docker și nu instalați amestecat docker.io și docker-ce?



5. Ce face docker system prune --volumes și trebuie să știți neapărat?



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.




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

Un moment…

Configurați domeniile

Stabiliți pentru fiecare domeniu nameserverele, legătura cu hostingul și cine devine titularul.

Se încarcă domeniile…