Přejít na obsah

Nastavení cookies

Zvolte, které druhy cookies povolíte. Svou volbu můžete kdykoli změnit přes Nastavení cookies v dolní části každé stránky. Prohlášení o ochraně osobních údajů

Nezbytné

Vždy zapnuté

Potřebné pro přihlášení, uchování košíku a zapamatování vašich voleb. Jsou vždy zapnuté.

Které cookies?
  • weboke_sessie, weboke_klant, weboke_remember: vaše relace a trvalé přihlášení
  • weboke_basket: váš košík
  • wkBtwIncl: zobrazení cen s DPH nebo bez DPH
  • wok_cookies: vaše volba cookies, 12 měsíců

Měří, která reklama vede k návštěvě nebo objednávce, abychom neplatili za reklamy, které nic nepřinášejí.

Které cookies?
  • Google Ads přes Google Tag Manager (_gcl_au, _gcl_aw), až 90 dní
  • OpenAI Ads, reklamy v ChatGPT
  • wok_aff: partner, který vás k nám doporučil (partnerský program), 60 dní

4,6

Země a jazyk

Každá země má vlastní web s cenami a DPH dané země.

Zobrazit

Instalace Dockeru a Váš první kontejner

Modul 9: Docker a docker compose · Doba čtení: 11 min.

Cíl lekce: Po této lekci dokážete nainstalovat Docker Engine z oficiálního zdroje balíčků, spouštět kontejnery, prohlížet je, nahlížet do nich a uklízet je, a víte, proč se skupina docker rovná rootovi.

Klíčové pojmy: Docker Engine, Docker Desktop, oficiální 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

Který Docker?

Na server instalujete Docker Engine: službu běžící na pozadí (dockerd) a příkaz docker. Docker Desktop je něco jiného: program s okny pro Windows, macOS a desktopový Linux. Ten na server nepatří.

Pro Docker Engine existují dva spořádané zdroje:

  1. Zdroj balíčků přímo od Dockeru (download.docker.com). Vždy nejnovější verze, včetně pluginu docker compose, který použijete v lekci 9.3. Tento postup popisuje dokumentace Dockeru a používá ho i tento kurz.
  2. Balíček docker.io z Debianu nebo Ubuntu. Starší, ale distribuce ho aktualizuje v rámci Vašich běžných bezpečnostních aktualizací (lekce 4.2). Vhodné, pokud nechcete nic mimo distribuci; v tom případě ale ověřte, zda je k dispozici docker compose (s mezerou).

Vyberte si jeden z nich. Instalace z obou zdrojů najednou způsobuje konflikty; dokumentace Dockeru proto doporučuje nejprve odstranit neoficiální balíčky jako docker.io, docker-compose a podman-docker.

Instalace ze zdroje balíčků Dockeru

Toto jsou kroky z dokumentace Dockeru pro Debian, s klíčem uloženým zvlášť a vlastním Signed-By (lekce 4.1). Pokud chcete, vytvořte si předem 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

Poté soubor zdroje /etc/apt/sources.list.d/docker.sources (ve formátu deb822):

Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.asc

K Suites patří kódové jméno Vašeho vydání (cat /etc/os-release, lekce 4.3) a k Architectures výstup příkazu dpkg --print-architecture. Na Ubuntu je URL https://download.docker.com/linux/ubuntu a suite například noble.

Pak instalace:

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 a Ubuntu se Docker po instalaci spustí sám a spouští se i po každém restartu (systemctl status docker, lekce 6.1).

Pozor: unattended-upgrades (lekce 4.2) balíčky z tohoto zdroje ve výchozím nastavení automaticky neaktualizuje. Zařaďte sudo apt update && sudo apt upgrade pro Docker do svého rytmu údržby (lekce 10.4), nebo zdroj vědomě přidejte do automatických aktualizací.

Skupina docker je root

Všude na internetu se píše, že se máte přidat do skupiny docker, abyste už nemuseli psát sudo:

anna@web1:~$ sudo usermod -aG docker anna

Udělejte to jen tehdy, pokud chápete, co to znamená. Dokumentace Dockeru je v tom jasná: skupina docker dává oprávnění na úrovni roota. Kdo smí ovládat službu Docker, může spustit kontejner s připojeným celým diskem hostitele:

docker run -it -v /:/host debian chroot /host

a je tím na Vašem serveru rootem, bez hesla a bez záznamu v logu sudo. Dokumentace Dockeru to říká takto: službu Docker by měli smět ovládat jen důvěryhodní uživatelé.

U serveru, který spravujete jen Vy sami, jde o volbu: pohodlí oproti další cestě k rootovi. Bezpečnější je prostě dál psát sudo docker ...; každý příkaz se pak zapíše do logu sudo (lekce 3.2). V žádném případě do této skupiny nepřidávejte uživatele, který nesmí být rootem, například servisního uživatele pro web.

Rootless mode

Docker může běžet i bez roota: služba i kontejnery pak běží pod běžným uživatelem, s vlastním user namespace. Nainstalujete ho jako tento uživatel pomocí dockerd-rootless-setuptool.sh install (z balíčku docker-ce-rootless-extras; předem je potřeba balíček uidmap). Únik z kontejneru pak útočníkovi nedá roota na hostiteli. Má to svá omezení a nastavení je složitější; v tomto kurzu používáme běžnou instalaci a bezpečnost zajišťujeme pravidly z tohoto modulu.

První skutečný kontejner

Spustíme webový server nginx v kontejneru, dostupný jen ze samotného serveru:

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é části:

ČástVýznam
-dBěh na pozadí (detached)
--name proefNázev, abyste nemuseli pracovat s dlouhými ID
-p 127.0.0.1:8080:80Port 80 v kontejneru se stane portem 8080 na hostiteli, jen na loopbacku
nginx:stableOficiální 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 (lekce 5.1) potvrzuje: jen na 127.0.0.1. Kdybyste napsali -p 8080:80, uviděli byste 0.0.0.0:8080 a [::]:8080 a Váš kontejner by byl dostupný z internetu, i když ufw port 8080 nepovoluje (lekce 9.3). Verze v hlavičce Server se u Vás může lišit.

Rozhlížení a zásahy

anna@web1:~$ sudo docker logs proef            # co program vypsal (stdout a stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef   # posledních 20 řádků a dále sledovat
anna@web1:~$ sudo docker exec -it proef sh     # shell v běžícím 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           # zastavit a odstranit

docker logs je první místo, kam se podíváte, když kontejner nedělá to, co čekáte, stejně jako journalctl u běžných služeb (lekce 6.2). Pomocí docker exec nahlédnete dovnitř, ale raději tam nic neměňte: změny v kontejneru při příští aktualizaci zmizí (lekce 9.1).

Úklid

Image a zastavené kontejnery zůstávají, dokud je neuklidíte. Na VPS s malým diskem to nepozorovaně narůstá.

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 odstraní image bez názvu, které už k ničemu nepatří; s -a také všechny image, které nepoužívá žádný kontejner. Buďte opatrní s docker system prune --volumes: odstraní totiž i anonymní volumes (bez názvu), které v tu chvíli nepatří k žádnému kontejneru, a docker volume prune -a dokonce i pojmenované volumes. V nich mohou být Vaše data. Proto volumes vždy pojmenujte nebo použijte bind mount (lekce 9.1) a nejprve se podívejte pomocí docker volume ls.

Logy kontejnerů mohou také narůstat. Docker je ve výchozím nastavení ukládá do souborů JSON bez omezení velikosti. Limit nastavíte v /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}

Poté sudo systemctl restart docker; nastavení platí jen pro nově vytvořené kontejnery, stávající kontejnery vytvořte znovu.

V praxi

Docker na VPS u WebOké funguje stejně jako u kteréhokoli jiného poskytovatele: je to software uvnitř Vašeho vlastního serveru, který si sami instalujete a aktualizujete. U malé VPS pravidelně kontrolujte místo na disku pomocí docker system df a df -h (lekce 1.4).

Shrnutí

  • Nainstalujte Docker Engine ze zdroje balíčků Dockeru (s vlastním klíčem a Signed-By), nebo docker.io z distribuce, ne obojí.
  • Skupina docker se rovná rootovi; sudo docker zanechává stopu v logu sudo. Rootless mode je bezpečnější, ale omezenější alternativa.
  • docker run -d --name ... -p 127.0.0.1:host:container image:tag spustí kontejner dostupný jen lokálně; ověřte to pomocí ss.
  • docker ps, logs, exec, stop, rm jsou Vaše každodenní nástroje.
  • Uklízejte image pomocí docker image prune, omezte logy kontejnerů (ve výchozím nastavení neomezené) a s --volumes zacházejte střídmě.

Kvíz

1. Proč členství ve skupině docker ve skutečnosti dává práva roota?



2. Po docker run -d -p 8080:80 nginx ukazuje ss -tlnp řádek 0.0.0.0:8080. Co jste měli napsat, aby byl port publikován jen lokálně?



3. Kontejner se spustí, ale web v něm nefunguje. Co zkontrolujete jako první?



4. Proč si vybíráte jeden zdroj Dockeru a neinstalujete docker.io a docker-ce současně?



5. Co dělá docker system prune --volumes, o čem byste měli dobře vědět?



Úkol

Úkol O9.2: Váš první kontejner. Nainstalujte Docker Engine na svůj server podle lekce (nebo na testovací stroj). Spusťte kontejner nginx, který naslouchá jen na 127.0.0.1:8080, ověřte to pomocí docker ps, curl -I a ss -tlnp, prohlédněte si logy a poté ho ukliďte. Odpovězte na otázky: z jakého zdroje jste Docker nainstalovali, co ukázal ss u portu 8080 a přidali jste se do skupiny docker (proč ano, nebo proč ne)?

Úkol O9.2: Váš první kontejner

Tento úkol provádíte sami; nikdo ho nekontroluje. Odškrtněte, co jste udělali, a označte úkol jako splněný.




Vaše zaškrtnutí a poznámky zůstávají pouze v tomto prohlížeči; nikam je neposíláme. Pokud jste přihlášeni, ukládáme v sekci Moje kurzy pouze to, že jste úkol splnili.

Doporučujeme k přečtení

Chvíli strpení…

Nastavení vašich domén

U každé domény nastavte jmenné servery, propojení s hostingem a to, kdo bude držitelem.

Načítání vašich domén…