Modul 9 · 9.2
Instalacija Dockera i Vaš prvi kontejner
Modul 9: Docker i docker compose · Vrijeme čitanja: 11 minuta
Cilj učenja: Nakon ove lekcije moći ćete instalirati Docker Engine iz službenog repozitorija paketa, pokretati, pregledavati, istraživati iznutra i čistiti kontejnere te ćete znati zašto je grupa docker jednaka rootu.
Ključni pojmovi: Docker Engine, Docker Desktop, službeni apt repozitorij, docker.io iz Debiana, grupa 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
Koji Docker?
Na poslužitelj instalirate Docker Engine: pozadinsku uslugu (dockerd) i naredbu docker. Docker Desktop je nešto drugo: program s prozorima za Windows, macOS i Linux radne površine. On ne pripada na poslužitelj.
Postoje dva uredna izvora za Docker Engine:
- Repozitorij paketa samog Dockera (
download.docker.com). Uvijek najnovija verzija, uključujući dodatakdocker composekoji koristite u lekciji 9.3. To opisuje Docker dokumentacija i to koristi ovaj tečaj. - Paket
docker.ioiz Debiana ili Ubuntua. Stariji, ali ga distribucija ažurira putem Vaših uobičajenih sigurnosnih ažuriranja (lekcija 4.2). Odličan izbor ako ne želite ništa izvan distribucije; u tom slučaju ipak provjerite je lidocker compose(s razmakom) dostupan.
Odaberite jedan. Miješana instalacija uzrokuje sukobe; Docker dokumentacija zato savjetuje da najprije uklonite neslužbene pakete kao što su docker.io, docker-compose i podman-docker.
Instalacija iz repozitorija Dockera
Ovo su koraci iz Docker dokumentacije za Debian, s ključem zasebno i vlastitim Signed-By (lekcija 4.1). Ako Vam tako više odgovara, najprije napravite snimku (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.ascZatim datoteka izvora /etc/apt/sources.list.d/docker.sources (u obliku deb822):
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.ascUz Suites ide kodno ime Vašeg izdanja (cat /etc/os-release, lekcija 4.3), a uz Architectures izlaz naredbe dpkg --print-architecture. Na Ubuntuu je URL https://download.docker.com/linux/ubuntu, a suite na primjer noble.
Zatim instalacija:
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.Na Debianu i Ubuntuu Docker se nakon instalacije pokreće sam, kao i nakon svakog ponovnog pokretanja (systemctl status docker, lekcija 6.1).
Pozor: unattended-upgrades (lekcija 4.2) pakete iz ovog izvora prema zadanim postavkama ne ažurira automatski. Uvrstite sudo apt update && sudo apt upgrade za Docker u svoj ritam održavanja (lekcija 10.4) ili svjesno dodajte izvor u svoja automatska ažuriranja.
Grupa docker je root
Posvuda na internetu piše da se trebate dodati u grupu docker, kako više ne biste morali tipkati sudo:
anna@web1:~$ sudo usermod -aG docker annaUčinite to samo ako razumijete što to znači. Docker dokumentacija je jasna: grupa docker daje prava na razini roota. Tko smije upravljati Docker uslugom, može pokrenuti kontejner u koji je montiran cijeli disk domaćina:
docker run -it -v /:/host debian chroot /hosti time je root na Vašem poslužitelju, bez lozinke i bez zapisa u sudo zapisniku. Docker dokumentacija to kaže ovako: samo pouzdani korisnici smiju upravljati Docker uslugom.
Za poslužitelj kojim upravljate samo Vi, to je stvar izbora: udobnost nasuprot dodatnom putu do roota. Sigurnije je jednostavno nastaviti tipkati sudo docker ...; tada je svaka naredba zabilježena u sudo zapisniku (lekcija 3.2). U svakom slučaju nikada ne dodajte u grupu korisnika koji ne smije biti root, primjerice uslužnog korisnika za web-stranicu.
Rootless mode
Docker može raditi i bez roota: usluga i kontejneri tada rade pod običnim korisnikom, s vlastitim user namespaceom. Instalirate ga kao taj korisnik naredbom dockerd-rootless-setuptool.sh install (iz paketa docker-ce-rootless-extras; prethodno je potreban paket uidmap). Propust u kontejneru tada ne donosi root na domaćinu. Postoje ograničenja i postavljanje je zahtjevnije; u ovom tečaju koristimo uobičajenu instalaciju i održavamo sigurnost pravilima iz ovog modula.
Prvi pravi kontejner
Pokrećemo nginx web-poslužitelj u kontejneru, dostupan samo sa samog poslužitelja:
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...Dijelovi:
| Dio | Značenje |
|---|---|
-d | Rad u pozadini (detached) |
--name proef | Ime, kako ne biste morali raditi s dugim ID-ovima |
-p 127.0.0.1:8080:80 | Priključak 80 u kontejneru postaje priključak 8080 na domaćinu, samo na loopbacku |
nginx:stable | Službeni nginx image, oznaka stable |
Provjera:
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 (lekcija 5.1) potvrđuje: samo na 127.0.0.1. Da ste upisali -p 8080:80, pisalo bi 0.0.0.0:8080 i [::]:8080, a Vaš bi kontejner bio dostupan s interneta, čak i ako ufw ne dopušta priključak 8080 (lekcija 9.3). Verzija u zaglavlju Server kod Vas može biti drugačija.
Razgledavanje i intervencija
anna@web1:~$ sudo docker logs proef # ono što je program ispisao (stdout i stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef # zadnjih 20 redaka i nastavak praćenja
anna@web1:~$ sudo docker exec -it proef sh # shell u pokrenutom kontejneru
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef # zaustavi i uklonidocker logs je prvo mjesto koje pogledate kada kontejner ne radi ono što očekujete, baš kao journalctl za obične usluge (lekcija 6.2). Pomoću docker exec gledate unutra, ali ondje radije ništa ne mijenjajte: promjene u kontejneru nestaju pri sljedećem ažuriranju (lekcija 9.1).
Čišćenje
Imagei i zaustavljeni kontejneri ostaju dok ih ne očistite. Na VPS-u s malim diskom to neprimjetno raste.
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 uklanja imagee bez imena koji više nikamo ne pripadaju; s -a i sve imagee koje ne koristi nijedan kontejner. Budite oprezni s docker system prune --volumes: to uklanja i anonimne volumene (bez imena) koji u tom trenutku ne pripadaju nijednom kontejneru, a docker volume prune -a čak i imenovane volumene. U njima mogu biti Vaši podaci. Zato volumenima uvijek dajte ime ili koristite bind mount (lekcija 9.1) i najprije provjerite s docker volume ls.
Zapisi kontejnera također mogu rasti. Docker ih prema zadanim postavkama čuva u JSON datotekama bez ograničenja veličine. Ograničenje postavljate u /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}Zatim sudo systemctl restart docker; postavka vrijedi samo za novostvorene kontejnere, postojeće kontejnere stvorite ponovno.
U praksi
Docker na VPS-u kod WebOkéa radi jednako kao kod bilo kojeg drugog pružatelja: to je softver unutar Vašeg vlastitog poslužitelja, koji sami instalirate i ažurirate. Na malom VPS-u redovito provjeravajte prostor na disku pomoću docker system df i df -h (lekcija 1.4).
Sažetak
- Instalirajte Docker Engine iz repozitorija Dockera (s vlastitim ključem i
Signed-By) ilidocker.ioiz distribucije, ne oboje. - Grupa docker jednaka je rootu;
sudo dockerostavlja trag u sudo zapisniku. Rootless mode je sigurnija, ali ograničenija alternativa. docker run -d --name ... -p 127.0.0.1:host:container image:tagpokreće kontejner dostupan samo lokalno; provjerite sss.docker ps,logs,exec,stop,rmVaš su svakodnevni alat.- Čistite imagee s
docker image prune, ograničite zapise kontejnera (prema zadanim postavkama neograničeni) i budite štedljivi s--volumes.
Kviz
Zadatak
Zadatak O9.2: Vaš prvi kontejner. Instalirajte Docker Engine na svoj poslužitelj prema lekciji (ili na testno računalo). Pokrenite nginx kontejner koji sluša samo na 127.0.0.1:8080, provjerite s docker ps, curl -I i ss -tlnp, pregledajte zapise i zatim ga očistite. Odgovorite na pitanja: iz kojeg ste izvora instalirali Docker, što je ss prikazao za priključak 8080 i jeste li se dodali u grupu docker (zašto da ili zašto ne)?
Zadatak O9.2: Vaš prvi kontejner
Ovaj zadatak rješavate sami; nitko ga ne provjerava. Označite što ste napravili i označite zadatak kao završen.
Ako je Docker instaliran iz Dockerova izvora, unattended-upgrades ga prema zadanim postavkama ne ažurira; docker.io iz distribucije ažurira. ss bi trebao prikazati 127.0.0.1:8080, a ne 0.0.0.0:8080. Grupa docker daje root ovlasti; uz sudo docker svaka naredba ostaje zabilježena u sudo zapisniku.
Vaše kvačice i bilješke ostaju samo u ovom pregledniku; ne šaljemo ih nikamo. Ako ste prijavljeni, u Moji tečajevi čuvamo samo podatak da ste zadatak završili.
Dodatno štivo
- Docker dokumentacija, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Docker dokumentacija, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Docker dokumentacija, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Docker dokumentacija, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Docker dokumentacija, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Docker dokumentacija, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
- VPS: od prve prijave do sigurnog poslužitelja 6.1: Instalacija Dockera iz službenog izvora
