Pokud se blíže podíváme na produkty LEGO®, můžeme vidět, že jsou všechny vyrobeny ze stejných stavebních bloků. Složení těchto bloků je však klíčovým rozdílem pro to, zda stavíme hrad nebo vesmírnou loď. Je to téměř stejné pro Podman a jeho sourozenecké projekty Buildah, Skopeo a CRI-O. Namísto recyklovaného plastu jsou však stavební kameny našich kontejnerových nástrojů vyrobeny z otevřeného zdrojového kódu. Sdílení těchto stavebních bloků nám umožňuje poskytovat robustní kontejnerové nástroje podnikové úrovně. Funkce se dodávají rychleji, chyby jsou rychleji opraveny a kód je testován v bitvě. A místo toho, aby přinášely radost do heren, přinášejí kontejnerové nástroje radost do datových center a pracovních stanic.
Nejzákladnějším stavebním kamenem našich nástrojů pro kontejnery je knihovna kontejnerů/úložišť, která lokálně ukládá a spravuje kontejnery a obrázky kontejnerů. Když přejdeme o úroveň výše, najdeme knihovnu kontejnerů/obrázků. Jak název napovídá, tato knihovna se zabývá obrázky kontejnerů a je neuvěřitelně výkonná. Umožňuje nám stahovat a tlačit obrázky, manipulovat s obrázky (např. měnit kompresi vrstev), kontrolovat obrázky spolu s jejich konfigurací a vrstvami a kopírovat obrázky mezi takzvanými přenosy obrázků. Transport může odkazovat na místní úložiště kontejnerů, registr kontejnerů, archiv tar a mnoho dalšího. Dan Walsh napsal skvělý blogový příspěvek o různých transportech, který vřele doporučuji přečíst.
Knihovna obrázků také podporuje několik konfiguračních souborů, kde je bezpochyby registries.conf
je pro drtivou většinu uživatelů nejdůležitější. Tento blogový příspěvek chci věnovat registries.conf
konfigurační soubor, vysvětlí jeho různé možnosti a knoflíky a jak je můžeme použít ve výrobě.
Správa registrů kontejnerů pomocí registry.conf
Soubor registries.conf
konfigurace je ve hře, kdykoli zatlačíme nebo vytáhneme obrázek. Nebo, obecněji řečeno, kdykoli kontaktujeme registr kontejnerů. To je jednoduché pravidlo. Umístění celého systému je /etc/containers/registries.conf
, ale pokud to chcete změnit pro jednoho uživatele, můžete vytvořit nový soubor na $HOME/.config/containers/registries.conf
.
Pojďme se tedy do toho rovnou ponořit. V následujících částech projdeme několik příkladů, které vysvětlují různé možnosti konfigurace v registries.conf
. Příklady jsou scénáře ze skutečného světa a mohou být zdrojem inspirace pro řešení vašeho individuálního případu použití.
Vytahování krátkých jmen
Lidé jsou líní a já v tom nejsem výjimkou. Mnohem pohodlnější je provést podman pull ubi8
spíše než podman pull registry.access.redhat.com/ubi8:latest
. Stále zapomínám, který obrázek žije na kterém registru, a existuje mnoho obrázků a mnoho registrů. Existuje Docker Hub a Quay.io plus registry pro Amazon, Microsoft, Google, Red Hat a mnoho dalších distribucí Linuxu.
Docker vyřešil naši lenost tím, že se vždy obrátil na Docker Hub. docker pull alpine
bude vyřešen na docker.io/library/alpine:latest
a docker pull repo/image:tag
se převede na docker.io/repo/image:tag
(všimněte si zadaného repo). Podman a jeho sourozenecké projekty nechtěly uzamknout uživatele, aby používali pouze jeden registr, takže krátké názvy lze přeložit na více než docker.io, a jak můžete očekávat, můžeme to nakonfigurovat v registries.conf
takto:
unqualified-search-registries = ['registry.fedoraproject.org', 'registry.access.redhat.com', 'registry.centos.org', 'docker.io']
Výše uvedený úryvek je převzat přímo z registries.conf
ve Fedoře 33. Je to seznam registrů, které jsou kontaktovány v určeném pořadí při stahování obrázku s krátkým jménem. Pokud nelze obrázek najít v prvním registru, Podman se pokusí stáhnout z druhého registru a tak dále. Buildah a CRI-O se řídí stejnou logikou, ale všimněte si, že Skopeo se vždy normalizuje na docker.io.
[ Také by se vám mohlo líbit: Jakou další zátěž Linuxu plánujete kontejnerizovat? ]
Vyhledávání obrázků
Podobně jako v předchozí části o stahování se obrázky běžně vyhledávají podle názvu. Při podman search
, většinou nevím nebo jsem prostě zapomněl, na kterém registru daný obrázek žije. Při používání Dockeru můžete vyhledávat pouze na Docker Hub. Podman dává uživatelům větší svobodu a umožňuje vyhledávání obrázků v jakémkoli registru. A nepřekvapivě registries.conf
má řešení.
Podobně jako stahování, unqualified-search-registries
se také používají při použití krátkého názvu s podman search
. podman search foo
bude hledat obrázky s názvem foo ve všech registrech nekvalifikovaného vyhledávání.
Velké korporace mají obvykle místní registry kontejnerů. Integrace takových registrů do vašeho pracovního postupu je stejně jednoduchá jako jejich přidání do seznamu registrů pro nekvalifikované vyhledávání.
Aliasy s krátkými názvy
Novější verze Podman, Buildah a CRI-O přicházejí s novým způsobem řešení krátkých jmen, především pomocí aliasů. Aliasy jsou jednoduchá TOML tabulka [aliases]
ve tvaru "name" = "value"
, podobně jako fungují aliasy Bash. Udržujeme centrální seznam aliasů společně s komunitou upstream na github.com/containers/shortnames
. Pokud vlastníte obrázek a chcete mít alias, můžete otevřít žádost o stažení nebo nás kontaktovat.
Některé distribuce, jako RHEL8, plánují dodávat své vlastní seznamy krátkých jmen, aby uživatelům pomohly a zabránily jim v náhodném stahování obrázků ze špatného registru.
Podrobné vysvětlení, jak fungují aliasy s krátkými jmény, by tento příspěvek na blogu výrazně rozšířilo, takže pokud máte zájem, podívejte se na dřívější příspěvek na blogu o aliasech s krátkými jmény.
Konfigurace místního registru kontejnerů
Spuštění místního registru kontejnerů je docela běžné. Jeden mám neustále spuštěný, takže mohu ukládat obrázky do mezipaměti a vyvíjet a testovat nové funkce, jako jsou automatické aktualizace v Podmanu. Šířka pásma v mé domácí kanceláři je omezená, takže oceňuji rychlé zatlačení a vytažení. Protože vše běží lokálně, nemusím se starat o nastavování TLS pro registr. To znamená připojení k registru přes HTTP spíše než přes HTTPS. Podman vám to umožňuje zadáním --tls-verify=false
na příkazovém řádku, což přeskočí ověření TLS a umožní nezabezpečená připojení.
Alternativním přístupem k přeskočení ověření TLS prostřednictvím příkazového řádku je použití registries.conf
. To může být pohodlnější, zvláště u automatických skriptů, kde nechceme ručně přidávat příznaky příkazového řádku. Podívejme se na fragment konfigurace níže.
[[registry]]
location="localhost:5000"
insecure=true
Formát registry.conf je TOML. Dvojité složené závorky [[registry]]
označte, že můžeme zadat seznam (nebo tabulku) [registry]
objektů. V tomto příkladu je pouze jeden registr, kde je umístění (tj. jeho adresa) nastaveno na localhost:5000
. To je místo, kde běžně běží místní registr. Kdykoli se zobrazí containers/image
Knihovna se připojí k registru kontejnerů s tímto umístěním, vyhledá svou konfiguraci a podle toho bude jednat. V tomto případě je registr nakonfigurován jako nezabezpečený a ověření TLS bude přeskočeno. Podman a další kontejnerové nástroje nyní mohou mluvit s místním registrem, aniž by byla připojení odmítnuta.
Blokování registru, jmenného prostoru nebo obrázku
V případě, že chcete uživatelům nebo nástrojům zabránit v stahování z konkrétního registru, můžete postupovat následovně.
[[registry]]
location="registry.example.org"
blocked=true
blocked=true
zabraňuje připojení k tomuto registru nebo alespoň blokuje stahování dat z něj.
Mezi uživateli je však překvapivě běžné blokovat pouze konkrétní jmenné prostory nebo jednotlivé obrázky, ale ne celý registr. Předpokládejme, že chceme uživatelům zabránit v stahování obrázků z oboru názvů registry.example.org/namespace
. Soubor registries.conf
bude nyní vypadat takto:
[[registry]]]
location="registry.example.org"
prefix="registry.example.org/example"
blocked=true
Právě jsem představil nový konfigurační knoflík:prefix
. Předpona dává pokyn pouze k výběru zadané konfigurace, když se pokoušíme stáhnout obrázek, který odpovídá konkrétní předponě. Pokud bychom například spustili podman pull registry.example.org/example/image:latest
, zadaná předpona by se shodovala a Podman by nemohl stáhnout obrázek. Pokud chcete zablokovat konkrétní obrázek, můžete to nastavit pomocí následujícího:
prefix="registry.example.org/namespace/image"
Použití předpony je velmi mocný nástroj pro splnění všech druhů případů použití. Lze jej kombinovat se všemi knoflíky [registry]
. Všimněte si, že použití předpony je volitelné. Není-li zadána žádná, předpona bude implicitně nastavena na (povinné) umístění.
Zrcadlení registrů
Předpokládejme, že svou pracovní zátěž provozujeme v prostředí se vzduchovou mezerou. Všechny naše servery jsou odpojeny od internetu. Je pro to mnoho důvodů. Možná běžíme na hraně nebo běžíme v prostředí vysoce citlivém na zabezpečení, které nám zakazuje připojení k internetu. V tomto případě se nemůžeme připojit k původnímu registru, ale musíme spustit registr, který zrcadlí obsah místní sítě.
Zrcadlo registru je registr, který bude kontaktován před pokusem o stažení z původního. Je to běžný případ použití a jeden z nejstarších požadavků na funkce v ekosystému kontejnerů.
[[registry]]
location="registry.access.redhat.com"
[[registry.mirror]]
location="internal.registry.mirror"
S touto konfigurací při vytahování Universal Base Image přes podman pull ubi8
, bude obrázek stažen ze zrcadla namísto z registru kontejnerů Red Hatu.
Všimněte si, že můžeme zadat více zrcadel, která budou kontaktována v určeném pořadí. Pojďme se rychle podívat, co to znamená:
[[registry]]
location="registry.example.com"
[[registry.mirror]]
location="mirror-1.com"
[[registry.mirror]]
location="mirror-2.com"
[[registry.mirror]]
location="mirror-3.com"
Předpokládejme, že se pokoušíme stáhnout obrázek registry.example.com/myimage:latest
. Zrcadla jsou kontaktována v určeném pořadí (tj. shora dolů), což znamená, že se Podman nejprve pokusí stáhnout obrázek z mirror-1.com
. Pokud obrázek není přítomen nebo stahování selže z jiných důvodů, Podman kontaktuje mirror-2.com
a tak dále. Pokud všechna zrcadlení selžou, Podman bude kontaktovat hlavní registry.example.com
.
Všimněte si, že zrcadla také podporují insecure
knoflík. Pokud chcete přeskočit ověření TLS pro konkrétní zrcadlo, stačí přidat insecure=true
.
Přemapování referencí
Jak jsme prozkoumali výše, prefix
se používá k výběru konkrétního [registry]
v registries.conf
. I když jsou předpony mocným prostředkem k zablokování stahování konkrétních jmenných prostorů nebo určitých obrázků, lze je také použít k přemapování celých obrázků. Podobně jako u mirrorů můžeme použít předponu k vytažení z jiného registru a jiného jmenného prostoru.
Pro ilustraci toho, co myslím přemapováním , předpokládejme, že běžíme v prostředí se vzduchovou mezerou. Nemáme přístup k registrům kontejnerů, protože jsme odpojeni od internetu. Naše pracovní zátěž využívá obrázky z Quay.io, Docker Hub a registru kontejnerů Red Hat. I když bychom mohli mít jedno síťové zrcadlo na každý registr, mohli bychom také použít jedno s následující konfigurací.
[[registry]]
prefix="quay.io"
location="internal.registry.mirror/quay"
[[registry]]
prefix="docker.io"
location="internal.registry.mirror/docker"
[[registry]]
prefix="registry.access.redhat.com"
location="internal.registry.mirror/redhat"
podman pull quay.io/buildah/stable:latest
nyní místo toho stáhne internal.registry.mirror/quay/buildah/stable:latest
. Vytažený obrázek však zůstane quay.io/buildah/stable:latest
protože přemapování a zrcadlení probíhá transparentně pro Podman a další kontejnerové nástroje.
Jak můžeme vidět na úryvku výše, internal.registry.mirror
je naše místní síťové zrcadlo, které používáme k stahování obrázků jménem Quay.io, Docker Hub a registru kontejnerů Red Hat. Obrázky každého registru jsou umístěny v samostatných jmenných prostorech v registru (tj. „nábřeží“, „docker“, „redhat“) – jednoduchý, ale účinný trik pro přemapování obrázků při stahování. Možná se sami sebe ptáte, jak můžeme předem naplnit vnitřní zrcadlo obrázky ze tří registrů. Nedoporučuji to dělat ručně, ale použít skopeo sync
namísto. Pomocí skopeo sync
, správce systému může snadno načíst všechny obrázky na jednotku USB, přenést je do clusteru se vzduchovou mezerou a předem načíst zrcadlo.
Existuje nespočet případů použití, kdy takové přemapování může pomoci. Například při použití jiného registru během testů se může hodit transparentní stahování z jiného (testovacího nebo přípravného) registru než ve výrobě. Nejsou potřeba žádné změny kódu.
Tom Sweeney a Ed Santiago použili přemapování k vývoji kreativního řešení, které by řešilo limity rychlosti Docker Hub. Koncem listopadu 2020 začal Docker Hub omezovat počet stažení na uživatele v daném časovém rámci. Zpočátku jsme měli obavy, protože velké části našich testovacích systémů a neustálá integrace používaly obrazy Docker Hub. Ale s jednoduchou změnou v registries.conf
na našich systémech našli Tom a Ed skvělé řešení. To nás ušetřilo od ručního a zdlouhavého úkolu měnit všechny obrázky odkazující na docker.io v našich testech.
Pokročilá správa konfigurace pomocí konfiguračních souborů drop-on
Správa konfigurací je náročná. Naše systémy jsou neustále aktualizovány a s aktualizacemi mohou přijít i změny konfigurace. Můžeme chtít přidat nové registry, nakonfigurovat nová zrcadla, opravit předchozí nastavení nebo rozšířit výchozí konfiguraci Fedory. Existuje mnoho motivací a pro určité registries.conf
podporuje to prostřednictvím takzvaných konfiguračních souborů drop-in.
Při načítání konfigurace se zobrazí containers/image
knihovna nejprve načte hlavní konfigurační soubor na /etc/containers/registries.conf
a poté všechny soubory v /etc/containers/registries.conf.d
adresář v alfanumerickém pořadí.
Pomocí takového drop-in registries.conf
soubory je přímo vpřed. Stačí umístit .conf
soubor v adresáři a Podman získá aktualizovanou konfiguraci. Všimněte si, že tabulky v konfiguraci jsou sloučeny, zatímco jednoduché knoflíky jsou přepsány. To v praxi znamená, že [[registry]]
tabulku lze snadno rozšířit o nové registry. Pokud registr se stejnou předponou již existuje, bude nastavení registru přepsáno. Totéž platí pro [aliases]
stůl. Jednoduché konfigurační knoflíky, jako jsou nekvalifikované vyhledávací registry, jsou vždy přepsány.
[ Začínáte s kontejnery? Podívejte se na tento bezplatný kurz. Nasazení kontejnerových aplikací:technický přehled. ]
Závěr
Soubor registries.conf
je základním stavebním kamenem našich kontejnerových nástrojů. Umožňuje konfiguraci všech druhů vlastností při komunikaci s registrem kontejnerů. Pokud máte zájem prostudovat konfiguraci podrobněji, můžete buď provést man containers-registries.conf
přečtěte si manuálovou stránku na vašem počítači se systémem Linux nebo navštivte upstream dokumentaci.