Prejsť na obsah

Nastavenia súborov cookie

Vyberte, aké druhy súborov cookie povolíte. Svoj výber môžete kedykoľvek zmeniť cez Nastavenia súborov cookie v dolnej časti každej stránky. Vyhlásenie o ochrane osobných údajov

Nevyhnutné

Vždy zapnuté

Potrebné na prihlásenie, uchovanie košíka a zapamätanie vašich volieb. Sú vždy zapnuté.

Ktoré súbory cookie?
  • weboke_sessie, weboke_klant, weboke_remember: vaša relácia a trvalé prihlásenie
  • weboke_basket: váš košík
  • wkBtwIncl: zobrazovanie cien s DPH alebo bez DPH
  • wok_cookies: váš výber súborov cookie, 12 mesiacov

Merajú, ktorá reklama vedie k návšteve alebo objednávke, aby sme neplatili za reklamy, ktoré nič neprinášajú.

Ktoré súbory cookie?
  • Google Ads cez Google Tag Manager (_gcl_au, _gcl_aw), najviac 90 dní
  • OpenAI Ads, reklamy v ChatGPT
  • wok_aff: ktorý partner vás k nám odporučil (partnerský program), 60 dní

4,6

Krajina a jazyk

Každá krajina má vlastný web s cenami a DPH danej krajiny.

Zobraziť

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:

  1. Zdroj balíkov priamo od Dockeru (download.docker.com). Vždy najnovšia verzia vrátane zásuvného modulu docker compose, ktorý použijete v lekcii 9.3. Tento postup opisuje dokumentácia Dockeru a používa ho aj tento kurz.
  2. Balík docker.io z 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.asc

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

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

Urobte 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 /host

a 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
-dBeh na pozadí (detached)
--name proefNázov, aby ste nemuseli pracovať s dlhými ID
-p 127.0.0.1:8080:80Port 80 v kontajneri sa stane portom 8080 na hostiteľovi, iba na loopbacku
nginx:stableOficiá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 prune

docker 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) alebo docker.io z distribúcie, nie oboje.
  • Skupina docker sa rovná rootu; sudo docker zanechá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:tag spustí kontajner dostupný iba lokálne; overte to pomocou ss.
  • docker ps, logs, exec, stop, rm sú vaše každodenné nástroje.
  • Image upratujte pomocou docker image prune, obmedzte logy kontajnerov (predvolene bez limitu) a s --volumes narábajte šetrne.

Kvíz

1. Prečo členstvo v skupine docker v skutočnosti dáva oprávnenia roota?



2. Po docker run -d -p 8080:80 nginx zobrazí ss -tlnp riadok 0.0.0.0:8080. Čo ste mali zadať, aby sa port publikoval iba lokálne?



3. Kontajner sa spustí, ale webová stránka v ňom nefunguje. Čo skontrolujete ako prvé?



4. Prečo si vyberiete jeden zdroj Dockeru a neinštalujete docker.io a docker-ce súčasne?



5. Čo robí docker system prune --volumes, o čom musíte dobre vedieť?



Ú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ú.




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

Chvíľu strpenia…

Nastavte svoje domény

Pri každej doméne nastavte nameservery, prepojenie s hostingom a to, kto bude jej vlastníkom.

Načítavajú sa vaše domény…