Modul 7 — Virtualizace a kontejnery: Docker
33. Registry a distribuce image (Docker Hub, privátní registry)
Jak jsou image pojmenovány a verzovány, jak je publikovat na Docker Hub a jak provozovat vlastní privátní registry.
Úvod a kontext
Sestavený Docker image je k ničemu, pokud ho nemůže použít nikdo jiný
než stroj, na kterém byl vytvořen. Registry je server, který image
ukládá a distribuuje — obdoba Gitu pro zdrojový kód, jen pro binární
artefakty kontejnerů. Tato lekce vysvětluje, jak jsou image
pojmenovány, jak je nahrát na veřejný Docker Hub a jak si postavit
vlastní privátní registry pro interní použití ve firmě.
Teorie
Anatomie jména image
Plné jméno image má tvar:
[registry-host[:port]/]jmenny-prostor/nazev-image[:tag]
Příklady:
nginx:1.25— oficiální image bez explicitního registry hostu (Docker
Hub je výchozí), bez jmenného prostoru (oficiální knihovna).mycompany/backend:1.4.0— image v jmenném prostorumycompanyna
Docker Hubu.registry.firma.cz:5000/team/backend:1.4.0— image v privátním
registry běžícím naregistry.firma.cz:5000.
Pokud tag vynecháte, Docker automaticky doplní :latest — to je ale
jen konvence, ne technická záruka nejnovější verze. latest je
prostý název tagu jako kterýkoliv jiný a v produkci se mu doporučuje
vyhýbat — nasazení podle latest není reprodukovatelné (nevíte
přesně, jaký obsah jste nasadili, a příští docker pull může přinést
jinou verzi). Produkční nasazení má vždy cílit na konkrétní verzovaný
tag, ideálně i s ověřením přes digest (kryptografický hash obsahu
image, sha256:...), který je na rozdíl od tagu neměnný.
Docker Hub a přihlášení
Docker Hub (hub.docker.com) je výchozí veřejný registry. Postup
publikování:
docker login # přihlášení účtem na Docker Hub
docker build -t mycompany/backend:1.4.0 .
docker push mycompany/backend:1.4.0
Kdokoliv pak může image stáhnout příkazem docker pull
mycompany/backend:1.4.0. Veřejné repozitáře jsou zdarma, privátní
repozitáře na Docker Hubu mají v bezplatném tarifu omezený počet.
Privátní registry
Firmy typicky nechtějí interní image na veřejném Docker Hubu (byť
soukromém repozitáři třetí strany) a provozují si vlastní registry.
Nejjednodušší varianta je oficiální open-source image registry:
docker run -d -p 5000:5000 --name registry \
-v registry-data:/var/lib/registry \
registry:2
Poté se s ním pracuje stejně jako s Docker Hubem, jen s explicitním
hostname a portem v názvu image:
docker tag mycompany/backend:1.4.0 localhost:5000/backend:1.4.0
docker push localhost:5000/backend:1.4.0
docker pull localhost:5000/backend:1.4.0
V produkci se privátní registry provozuje s TLS certifikátem (jinak
Docker odmítne k němu bez dalšího nastavení přistupovat) a
autentizací (htpasswd, nebo napojení na LDAP/OAuth) — bez TLS a auth
by kdokoliv s síťovým přístupem mohl nahrávat i stahovat interní
image. Větší organizace často místo holého registry:2 používají
plnohodnotná řešení jako Harbor, GitLab Container Registry
(zabudovaný do GitLabu) nebo spravované cloudové registry (AWS ECR,
Google Artifact Registry, Azure Container Registry) — ty navíc
přidávají bezpečnostní skenování image, řízení přístupu po projektech a
politiky retence starých verzí.
Tagovací strategie
Běžná praxe je nastavit CI pipeline tak, aby při každém buildu
vytvořila image se dvěma tagy: jedním neměnným (např. commit hash nebo
sémantická verze 1.4.0) a případně pohyblivým (latest nebo
staging) pro pohodlné odkazování na "aktuální" verzi v neprodukčním
prostředí. Produkční nasazení ale vždy odkazuje na neměnný tag.
Praktický příklad
Kompletní tok od buildu po nasazení z privátního registry:
# 1. build s verzovaným tagem
docker build -t backend:1.4.0 .
# 2. přetagování pro cílový registry
docker tag backend:1.4.0 registry.firma.cz:5000/team/backend:1.4.0
# 3. přihlášení k privátnímu registry
docker login registry.firma.cz:5000
# 4. nahrání
docker push registry.firma.cz:5000/team/backend:1.4.0
# 5. na produkčním serveru: stažení konkrétní verze podle digestu
docker pull registry.firma.cz:5000/team/backend@sha256:3f29a6...
Poslední krok ukazuje nasazení podle digestu — i kdyby někdo omylem
znovu napushoval jiný obsah pod stejný tag 1.4.0, nasazení podle
konkrétního digestu zůstane nezměněné a reprodukovatelné.
Shrnutí
Registry je server pro ukládání a distribuci image, analogie Gitu pro
binární artefakty. Jméno image kóduje registry host, jmenný prostor,
název a tag; produkční nasazení by mělo cílit na konkrétní verzovaný
tag nebo digest, nikoliv na latest. Docker Hub je výchozí veřejná
volba, firmy pro interní image typicky provozují vlastní registry
(jednoduchý registry:2, nebo plnohodnotné Harbor/GitLab
Registry/cloudové registry) s TLS a autentizací.
Kontrolní otázky
- Z čeho se skládá plné jméno Docker image a co se stane, když tag
vynecháte? - Proč se
latestnedoporučuje pro produkční nasazení a čím ho
nahradit? - Jaký je rozdíl mezi nasazením podle tagu a podle digestu?
- Mini cvičení: spusťte lokálně
registry:2na portu 5000, stáhněte
libovolný veřejný image (např.alpine), přetagujte ho na
localhost:5000/alpine:testa nahrajte ho do svého lokálního
registry příkazemdocker push.
Lekce na sebe nejsou zamčené — libovolnou lekci můžete otevřít i označit jako hotovou v jakémkoliv pořadí.