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:
- Zdroj balíčků přímo od Dockeru (
download.docker.com). Vždy nejnovější verze, včetně pluginudocker compose, který použijete v lekci 9.3. Tento postup popisuje dokumentace Dockeru a používá ho i tento kurz. - Balíček
docker.ioz 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 dispozicidocker 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.ascPoté 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.ascK 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 annaUdě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 /hosta 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:
| Část | Význam |
|---|---|
-d | Běh na pozadí (detached) |
--name proef | Název, abyste nemuseli pracovat s dlouhými ID |
-p 127.0.0.1:8080:80 | Port 80 v kontejneru se stane portem 8080 na hostiteli, jen na loopbacku |
nginx:stable | Oficiá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 odstranitdocker 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 prunedocker 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), nebodocker.ioz distribuce, ne obojí. - Skupina docker se rovná rootovi;
sudo dockerzanechá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:tagspustí kontejner dostupný jen lokálně; ověřte to pomocíss.docker ps,logs,exec,stop,rmjsou Vaše každodenní nástroje.- Uklízejte image pomocí
docker image prune, omezte logy kontejnerů (ve výchozím nastavení neomezené) a s--volumeszacházejte střídmě.
Kvíz
Ú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ý.
Z repozitáře Dockeru ho unattended-upgrades ve výchozím nastavení neaktualizuje; docker.io z distribuce ano. ss by měl ukázat 127.0.0.1:8080, ne 0.0.0.0:8080. Skupina docker dává práva roota; se sudo docker zůstane každý příkaz v logu sudo.
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í
- Dokumentace Dockeru, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Dokumentace Dockeru, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Dokumentace Dockeru, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Dokumentace Dockeru, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Dokumentace Dockeru, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Dokumentace Dockeru, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
