Modul 9 · 9.2
Inštalácia Dockeru a váš prvý kontajner
Modul 9: Docker a docker compose · Čas čítania: 11 minút
Cieľ lekcie: Po tejto lekcii dokážete nainštalovať Docker Engine z oficiálneho zdroja balíkov, spúšťať kontajnery, prezerať ich, nahliadnuť do nich a upratať ich. Budete tiež vedieť, prečo sa skupina docker rovná rootu.
Kľúčové pojmy: Docker Engine, Docker Desktop, oficiálny zdroj apt, docker.io z Debianu, skupina 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
Aký Docker?
Na server inštalujete Docker Engine: službu bežiacu na pozadí (dockerd) a príkaz docker. Docker Desktop je niečo iné: program s oknami pre Windows, macOS a desktopový Linux. Na server nepatrí.
Docker Engine môžete získať z dvoch spoľahlivých zdrojov:
- Zdroj balíkov priamo od Dockeru (
download.docker.com). Vždy najnovšia verzia vrátane zásuvného moduludocker compose, ktorý použijete v lekcii 9.3. Tento postup opisuje dokumentácia Dockeru a používa ho aj tento kurz. - Balík
docker.ioz Debianu alebo Ubuntu. Je starší, ale distribúcia ho aktualizuje prostredníctvom vašich bežných bezpečnostných aktualizácií (lekcia 4.2). Je to dobrá voľba, ak nechcete nič mimo distribúcie; overte si však, či je dostupnýdocker compose(s medzerou).
Vyberte si jeden z nich. Kombinovaná inštalácia spôsobuje konflikty, preto dokumentácia Dockeru odporúča najprv odstrániť neoficiálne balíky ako docker.io, docker-compose a podman-docker.
Inštalácia zo zdroja balíkov Dockeru
Toto sú kroky z dokumentácie Dockeru pre Debian, s kľúčom uloženým samostatne a s vlastným Signed-By (lekcia 4.1). Ak chcete, vytvorte si najprv 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.ascPotom súbor so zdrojom /etc/apt/sources.list.d/docker.sources (vo formáte deb822):
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.ascDo Suites patrí kódové meno vášho vydania (cat /etc/os-release, lekcia 4.3) a do Architectures výstup príkazu dpkg --print-architecture. Na Ubuntu je URL https://download.docker.com/linux/ubuntu a suite napríklad noble.
Potom inštalácia:
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 Debiane a Ubuntu sa Docker po inštalácii spustí automaticky a rovnako aj po každom reštarte (systemctl status docker, lekcia 6.1).
Pozor: unattended-upgrades (lekcia 4.2) balíky z tohto zdroja v predvolenom nastavení neaktualizuje automaticky. Zaraďte sudo apt update && sudo apt upgrade pre Docker do svojho rytmu údržby (lekcia 10.4), alebo tento zdroj vedome pridajte k automatickým aktualizáciám.
Skupina docker je root
Na internete sa všade píše, že sa máte pridať do skupiny docker, aby ste už nemuseli písať sudo:
anna@web1:~$ sudo usermod -aG docker annaUrobte to len vtedy, ak rozumiete, čo to znamená. Dokumentácia Dockeru je v tom jasná: skupina docker dáva oprávnenia na úrovni rootu. Kto môže ovládať službu Docker, môže spustiť kontajner s pripojeným celým diskom hostiteľa:
docker run -it -v /:/host debian chroot /hosta tým je na vašom serveri root, bez hesla a bez záznamu v logu sudo. Dokumentácia Dockeru to hovorí takto: službu Docker by mali môcť ovládať iba dôveryhodní používatelia.
Pri serveri, ktorý spravujete iba sami, je to voľba: pohodlie verzus ďalšia cesta k rootu. Bezpečnejšie je jednoducho naďalej písať sudo docker ...; každý príkaz sa potom zapíše do logu sudo (lekcia 3.2). V každom prípade do tejto skupiny nikdy nepridávajte používateľa, ktorý nemá byť root, napríklad servisného používateľa pre webovú stránku.
Rootless mode
Docker môže bežať aj bez rootu: služba aj kontajnery potom bežia pod bežným používateľom s vlastným user namespace. Nainštalujete ho ako tento používateľ príkazom dockerd-rootless-setuptool.sh install (z balíka docker-ce-rootless-extras; vopred je potrebný balík uidmap). Zraniteľnosť v kontajneri potom neprinesie root na hostiteľovi. Má to obmedzenia a nastavenie je náročnejšie; v tomto kurze používame bežnú inštaláciu a bezpečnosť zaistíme pravidlami z tohto modulu.
Prvý skutočný kontajner
Spustíme webový server nginx v kontajneri, dostupný iba zo samotného servera:
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...Jednotlivé časti:
| Časť | Význam |
|---|---|
-d | Beh na pozadí (detached) |
--name proef | Názov, aby ste nemuseli pracovať s dlhými ID |
-p 127.0.0.1:8080:80 | Port 80 v kontajneri sa stane portom 8080 na hostiteľovi, iba na loopbacku |
nginx:stable | Oficiálny image nginx, tag stable |
Kontrola:
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 (lekcia 5.1) potvrdzuje: iba na 127.0.0.1. Keby ste zadali -p 8080:80, zobrazilo by sa 0.0.0.0:8080 a [::]:8080 a váš kontajner by bol dostupný z internetu, aj keď ufw port 8080 nepovoľuje (lekcia 9.3). Verzia v hlavičke Server sa u vás môže líšiť.
Prezeranie a zásahy
anna@web1:~$ sudo docker logs proef # čo program vypísal (stdout a stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef # posledných 20 riadkov a ďalej sledovať
anna@web1:~$ sudo docker exec -it proef sh # shell v bežiacom kontajneri
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef # zastaviť a odstrániťdocker logs je prvé miesto, kam sa pozriete, keď sa kontajner nespráva podľa očakávania, rovnako ako journalctl pri bežných službách (lekcia 6.2). Pomocou docker exec nahliadnete dovnútra, ale radšej tam nič nemeňte: zmeny v kontajneri pri ďalšej aktualizácii zmiznú (lekcia 9.1).
Upratovanie
Image a zastavené kontajnery zostávajú, kým ich neupracete. Na VPS s malým diskom sa to nepozorovane nahromadí.
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 odstráni image bez názvu, ktoré už k ničomu nepatria; s -a aj všetky image, ktoré nepoužíva žiadny kontajner. Buďte opatrní s docker system prune --volumes: odstráni aj anonymné volumes (bez názvu), ktoré v tej chvíli nepatria k žiadnemu kontajneru, a docker volume prune -a dokonca aj pomenované volumes. Môžu v nich byť vaše dáta. Preto volumes vždy pomenujte alebo použite bind mount (lekcia 9.1) a najprv si ich pozrite pomocou docker volume ls.
Aj logy kontajnerov môžu rásť. Docker ich v predvolenom nastavení ukladá do súborov JSON bez obmedzenia veľkosti. Limit nastavíte v /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}Potom sudo systemctl restart docker; nastavenie platí iba pre novo vytvorené kontajnery, existujúce kontajnery vytvorte nanovo.
V praxi
Docker funguje na VPS od WebOké rovnako ako u akéhokoľvek iného poskytovateľa: je to softvér vo vašom vlastnom serveri, ktorý si sami inštalujete a aktualizujete. Pri malom VPS pravidelne kontrolujte miesto na disku pomocou docker system df a df -h (lekcia 1.4).
Zhrnutie
- Docker Engine inštalujte zo zdroja balíkov Dockeru (s vlastným kľúčom a
Signed-By) alebodocker.ioz distribúcie, nie oboje. - Skupina docker sa rovná rootu;
sudo dockerzanecháva stopu v logu sudo. Rootless mode je bezpečnejšia, ale obmedzenejšia alternatíva. docker run -d --name ... -p 127.0.0.1:host:container image:tagspustí kontajner dostupný iba lokálne; overte to pomocouss.docker ps,logs,exec,stop,rmsú vaše každodenné nástroje.- Image upratujte pomocou
docker image prune, obmedzte logy kontajnerov (predvolene bez limitu) a s--volumesnarábajte šetrne.
Kvíz
Úloha
Úloha O9.2: Váš prvý kontajner. Nainštalujte Docker Engine na svoj server podľa tejto lekcie (alebo na testovací počítač). Spustite kontajner nginx, ktorý počúva iba na 127.0.0.1:8080, overte to pomocou docker ps, curl -I a ss -tlnp, pozrite si logy a potom ho upracte. Odpovedzte na otázky: z akého zdroja ste Docker nainštalovali, čo zobrazil ss pri porte 8080 a pridali ste sa do skupiny docker (prečo áno alebo prečo nie)?
Úloha O9.2: Váš prvý kontajner
Túto úlohu vykonávate sami, nikto ju nekontroluje. Odškrtnite, čo ste urobili, a označte úlohu ako splnenú.
Ak pochádza Docker zo zdroja Dockera, unattended-upgrades ho predvolene neaktualizuje; docker.io z distribúcie áno. ss by mal ukázať 127.0.0.1:8080, nie 0.0.0.0:8080. Skupina docker dáva práva roota; pri sudo docker zostáva každý príkaz v logu sudo.
Vaše zaškrtnutia a poznámky zostávajú iba v tomto prehliadači, nikam ich neposielame. Po prihlásení si v sekcii Moje kurzy uchovávame iba to, že ste úlohu splnili.
Ďalšie čítanie
- Dokumentácia Dockeru, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Dokumentácia Dockeru, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Dokumentácia Dockeru, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Dokumentácia Dockeru, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Dokumentácia Dockeru, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Dokumentácia Dockeru, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
- VPS: od prvého prihlásenia po bezpečný server 6.1: Inštalácia Dockeru z oficiálneho zdroja
