Modul 9 · 9.2
Namestitev Dockerja in Vaš prvi vsebnik
Modul 9: Docker in docker compose · Čas branja: 11 minut
Učni cilj: Po tej lekciji boste znali namestiti Docker Engine iz uradnega vira paketov, zagnati, pregledati, pogledati v notranjost in počistiti vsebnike, poleg tega pa boste vedeli, zakaj je skupina docker enakovredna rootu.
Ključni pojmi: Docker Engine, Docker Desktop, uradni vir apt, docker.io iz Debiana, skupina docker, način rootless, docker run, -d, -p, -v, --name, docker ps, docker logs, docker exec, docker stop, docker rm, docker image prune, docker system df
Kateri Docker?
Na strežnik namestite Docker Engine: storitev v ozadju (dockerd) in ukaz docker. Docker Desktop je nekaj drugega: program z okni za Windows, macOS in namizja Linux. Ta na strežnik ne spada.
Za Docker Engine obstajata dva urejena vira:
- Vir paketov samega Dockerja (
download.docker.com). Vedno najnovejša različica, vključno z vtičnikomdocker compose, ki ga boste uporabili v lekciji 9.3. To opisuje dokumentacija Dockerja in to uporablja ta tečaj. - Paket
docker.ioiz Debiana ali Ubuntuja. Starejši, a ga distribucija posodablja prek Vaših običajnih varnostnih posodobitev (lekcija 4.2). Odlična izbira, če ne želite ničesar od zunaj distribucije; v tem primeru pa preverite, ali je na voljodocker compose(s presledkom).
Izberite enega. Mešana namestitev povzroča spore; dokumentacija Dockerja zato svetuje, da najprej odstranite neuradne pakete, kot so docker.io, docker-compose in podman-docker.
Namestitev iz vira paketov Dockerja
To so koraki iz dokumentacije Dockerja za Debian, s ključem v ločeni datoteki in lastnim Signed-By (lekcija 4.1). Če želite, najprej naredite posnetek stanja.
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.ascNato datoteka vira /etc/apt/sources.list.d/docker.sources (oblika deb822):
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.ascPri Suites vpišete kodno ime svoje izdaje (cat /etc/os-release, lekcija 4.3), pri Architectures pa izpis ukaza dpkg --print-architecture. Na Ubuntuju je URL https://download.docker.com/linux/ubuntu, suite pa na primer noble.
Nato namestitev:
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 in Ubuntuju se Docker po namestitvi zažene samodejno, prav tako po vsakem ponovnem zagonu (systemctl status docker, lekcija 6.1).
Pozor: unattended-upgrades (lekcija 4.2) paketov iz tega vira privzeto ne posodablja samodejno. Vključite sudo apt update && sudo apt upgrade za Docker v svoj ritem vzdrževanja (lekcija 10.4) ali pa vir zavestno dodajte med samodejne posodobitve.
Skupina docker je root
Povsod na internetu piše, da se dodajte v skupino docker, da Vam ne bo več treba tipkati sudo:
anna@web1:~$ sudo usermod -aG docker annaTo storite le, če razumete, kaj pomeni. Dokumentacija Dockerja je jasna: skupina docker daje pravice na ravni roota. Kdor sme upravljati storitev Docker, lahko zažene vsebnik, v katerega je priklopljen celoten disk gostitelja:
docker run -it -v /:/host debian chroot /hostin je s tem root na Vašem strežniku, brez gesla in brez zapisa v dnevniku sudo. Dokumentacija Dockerja pravi: storitev Docker smejo upravljati samo zaupanja vredni uporabniki.
Pri strežniku, ki ga upravljate samo Vi, je to stvar izbire: udobje v zameno za dodatno pot do roota. Varneje je, da še naprej tipkate sudo docker ...; tako je vsak ukaz zapisan v dnevniku sudo (lekcija 3.2). V nobenem primeru pa v skupino ne dodajte uporabnika, ki ne sme biti root, na primer storitvenega uporabnika za spletno mesto.
Način rootless
Docker lahko teče tudi brez roota: storitev in vsebniki takrat tečejo pod običajnim uporabnikom, z lastnim uporabniškim imenskim prostorom (user namespace). Kot ta uporabnik ga namestite z dockerd-rootless-setuptool.sh install (iz paketa docker-ce-rootless-extras; predhodno potrebujete paket uidmap). Ranljivost v vsebniku tako ne prinese roota na gostitelju. Obstajajo omejitve in nastavitev je zahtevnejša; v tem tečaju uporabljamo običajno namestitev in poskrbimo za varnost s pravili iz tega modula.
Prvi pravi vsebnik
Zaženemo spletni strežnik nginx v vsebniku, dosegljiv samo s strežnika samega:
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...Sestavni deli:
| Del | Pomen |
|---|---|
-d | Tek v ozadju (detached) |
--name proef | Ime, da Vam ni treba delati z dolgimi ID-ji |
-p 127.0.0.1:8080:80 | Vrata 80 v vsebniku postanejo vrata 8080 na gostitelju, samo na loopbacku |
nginx:stable | Uradna slika nginx, oznaka stable |
Preverjanje:
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) potrdi: samo na 127.0.0.1. Če bi vtipkali -p 8080:80, bi tam pisalo 0.0.0.0:8080 in [::]:8080, Vaš vsebnik pa bi bil dosegljiv z interneta, tudi če ufw vrat 8080 ne dovoljuje (lekcija 9.3). Različica v glavi Server je lahko pri Vas drugačna.
Pregledovanje in posredovanje
anna@web1:~$ sudo docker logs proef # kar je program izpisal (stdout in stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef # zadnjih 20 vrstic in nadaljnje spremljanje
anna@web1:~$ sudo docker exec -it proef sh # lupina v delujočem vsebniku
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef # ustavite in odstranitedocker logs je prvo mesto, ki ga pogledate, ko vsebnik ne dela, kar pričakujete, tako kot journalctl pri običajnih storitvah (lekcija 6.2). Z docker exec pogledate v notranjost, a tam raje ničesar ne spreminjajte: spremembe v vsebniku ob naslednji posodobitvi izginejo (lekcija 9.1).
Čiščenje
Slike in ustavljeni vsebniki ostanejo, dokler jih ne počistite. Na VPS z majhnim diskom se to neopazno nabira.
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 odstrani slike brez imena, ki ne pripadajo ničemur več; z -a tudi vse slike, ki jih ne uporablja noben vsebnik. Bodite previdni z docker system prune --volumes: ta odstrani tudi anonimne nosilce (brez imena), ki v tistem trenutku ne pripadajo nobenemu vsebniku, docker volume prune -a pa celo poimenovane nosilce. V njih so lahko Vaši podatki. Zato nosilce vedno poimenujte ali uporabite bind mount (lekcija 9.1) in najprej preverite z docker volume ls.
Tudi dnevniki vsebnikov lahko rastejo. Docker jih privzeto shranjuje v datoteke JSON brez omejitve velikosti. Omejitev nastavite v /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}Nato sudo systemctl restart docker; nastavitev velja samo za na novo ustvarjene vsebnike, obstoječe vsebnike ustvarite znova.
V praksi
Docker na VPS pri WebOké deluje enako kot pri vsakem drugem ponudniku: gre za programsko opremo na Vašem lastnem strežniku, ki jo namestite in posodabljate sami. Pri majhnem VPS z docker system df in df -h (lekcija 1.4) redno preverjajte prostor na disku.
Povzetek
- Docker Engine namestite iz vira paketov Dockerja (z lastnim ključem in
Signed-By) alidocker.ioiz distribucije, ne obojega. - Skupina docker je enakovredna rootu;
sudo dockerpusti sled v dnevniku sudo. Način rootless je varnejša, a bolj omejena alternativa. docker run -d --name ... -p 127.0.0.1:host:container image:tagzažene vsebnik, ki je dosegljiv samo lokalno; preverite zss.docker ps,logs,exec,stop,rmso Vaše vsakodnevno orodje.- Slike čistite z
docker image prune, omejite dnevnike vsebnikov (privzeto neomejeni) in bodite varčni z--volumes.
Kviz
Naloga
Naloga O9.2: Vaš prvi vsebnik. Namestite Docker Engine na svoj strežnik po navodilih iz lekcije (ali na testni računalnik). Zaženite vsebnik nginx, ki posluša samo na 127.0.0.1:8080, preverite z docker ps, curl -I in ss -tlnp, poglejte dnevnike in ga nato počistite. Odgovorite na vprašanja: iz katerega vira ste namestili Docker, kaj je ss pokazal pri vratih 8080 in ali ste se dodali v skupino docker (zakaj da ali zakaj ne)?
Naloga O9.2: Vaš prvi vsebnik
To nalogo opravite sami; nihče je ne pregleda. Odkljukajte, kar ste naredili, in nalogo označite kot opravljeno.
Če Docker namestite iz Dockerjevega vira, ga unattended-upgrades privzeto ne posodablja; docker.io iz distribucije pa ga. ss mora pokazati 127.0.0.1:8080, ne 0.0.0.0:8080. Skupina docker daje pravice root; s sudo docker ostane vsak ukaz zabeležen v dnevniku sudo.
Vaše kljukice in zapiski ostanejo samo v tem brskalniku, nikamor jih ne pošiljamo. Če ste prijavljeni, v Moji tečaji shranimo samo podatek, da ste nalogo opravili.
Za nadaljnje branje
- Dokumentacija Dockerja, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Dokumentacija Dockerja, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Dokumentacija Dockerja, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Dokumentacija Dockerja, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Dokumentacija Dockerja, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Dokumentacija Dockerja, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
