Jak fungují kontejnery Dockeru
Dříve jste zjistili, že kontejner se stane jednotkou, kterou použijete k distribuci aplikací. Také jste se dozvěděli, že kontejner je ve standardizovaném formátu, který používají vývojářské i provozní týmy.
V našem příkladu vyvíjíte portál pro sledování objednávek pro různé pobočky vaší společnosti, které se mají použít. Díky sestavené imagi Dockeru teď váš provozní tým zodpovídá za nasazování, zavádění aktualizací a správu portálu pro sledování objednávek.
V předchozí lekci jste se podívali na to, jak se sestavuje image Dockeru. Zde se podíváte na životní cyklus kontejneru Dockeru a způsob správy kontejnerů. Dozvíte se také, jak nakonfigurovat úložiště dat a možnosti sítě pro kontejnery.
Jak spravovat kontejnery Dockeru
Kontejner Dockeru má životní cyklus, který můžete použít ke správě a sledování stavu kontejneru.
Pokud chcete umístit kontejner do stavu spuštění, použijte příkaz run . Můžete také restartovat kontejner, který už běží. Při restartování kontejneru obdrží kontejner signál ukončení, který umožní, aby se všechny spuštěné procesy řádně vypnuly před ukončením jádra kontejneru.
Kontejner se považuje za spuštěný, dokud není pozastavený, zastavený nebo ukončený. Kontejner se ale může také ukončit ze spuštěného stavu sám. Stane se tak po dokončení spuštěného procesu nebo v případě, že proces přejde do chybového stavu.
Pokud chcete pozastavit spuštěný kontejner, použijte pause
příkaz. Tento příkaz pozastaví všechny procesy v kontejneru.
Pokud chcete zastavit spuštěný kontejner, použijte stop
příkaz. Příkaz stop
umožňuje řádné vypnutí pracovního procesu odesláním signálu ukončení. Jádro kontejneru se ukončí poté, co se tento proces vypne.
Pokud potřebujete kontejner ukončit, použijte kill
příkaz k odeslání signálu kill. Jádro kontejneru zachytí signál k ukončení, ale spuštěný proces ne. Tento příkaz vynuceně ukončí pracovní proces v kontejneru.
Nakonec pomocí příkazu odeberte kontejnery, které jsou v zastaveném stavu remove
. Po odebrání kontejneru se všechna v něm uložená data zničí.
Jak zobrazit dostupné kontejnery
K výpisu spuštěných kontejnerů se používá příkaz docker ps
. Pokud chcete zobrazit všechny kontejnery ve všech stavech, předejte argument -a
.
Tady je příklad:
docker ps -a
Tady je výstup tohoto příkazu:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d93d40cc1ce9 tmp-ubuntu:latest "dotnet website.dll …" 6 seconds ago Up 5 seconds 8080/tcp happy_wilbur
33a6cf71f7c1 tmp-ubuntu:latest "dotnet website.dll …" 2 hours ago Exited (0) 9 seconds ago adoring_borg
V předchozím výstupu se dají zkontrolovat tři položky:
Název image uvedený ve sloupci IMAGE. V tomto příkladu tmp-ubuntu: latest. Uvědomte si, že ze stejné image můžete vytvořit více než jeden kontejner. Jedná se o výkonnou funkci správy, kterou můžete použít k povolení škálování ve vašich řešeních.
Stav kontejneru uvedený ve sloupci STATUS . V tomto příkladu máte jeden kontejner, který je spuštěný, a jeden kontejner, který se ukončil. Stav kontejneru je obvykle vaším prvním indikátorem stavu kontejneru.
Název kontejneru uvedený ve sloupci NAMES . Kromě ID kontejneru v prvním sloupci dostanou kontejnery také název. V tomto příkladu jste explicitně nezadali názvy jednotlivých kontejnerů, proto Docker přiřadil kontejneru náhodný název. Pokud chcete kontejneru dát explicitní název pomocí příznaku
--name
, použijterun
příkaz.
Proč se kontejnerům dává název?
Tato funkce umožňuje spustit více instancí kontejneru stejné image. Názvy kontejnerů jsou jedinečné, což znamená, že pokud zadáte název, nemůžete tento název znovu použít k vytvoření nového kontejneru. Jediným způsobem, jak znovu použít konkrétní název, je odebrat předchozí kontejner.
Jak spustit kontejner
Ke spuštění kontejneru docker run
použijte příkaz. Ke spuštění kontejneru z dané image stačí zadat spouštěnou image pomocí jejího názvu nebo ID. Kontejner spuštěný tímto způsobem poskytuje interaktivní prostředí.
Zde přidáváte příznak -d
, který kontejner s webem spustí na pozadí.
docker run -d tmp-ubuntu
Příkaz v tomto případě vrátí jen ID nového kontejneru.
Po zadání image, která se má spustit, Docker tuto image najde, načte z image kontejner a spustí příkaz zadaný jako vstupní bod. V tomto okamžiku je kontejner dostupný pro správu.
Jak pozastavit kontejner
Kontejner se pozastaví příkazem docker pause
. Tady je příklad:
docker pause happy_wilbur
Pozastavení kontejneru pozastaví všechny procesy. Tento příkaz umožňuje, aby kontejner v pozdější fázi procesy obnovil. Příkaz docker unpause
zruší přidělení všech procesů v zadaných kontejnerech.
Jak restartovat kontejner
Kontejnery se restartují příkazem docker restart
. Tady je příklad:
docker restart happy_wilbur
Kontejner obdrží příkaz stop následovaný spouštěcím příkazem. Pokud kontejner na příkaz k zastavení nereaguje, odešle se signál k ukončení.
Jak zastavit kontejner
Spuštěný kontejner se zastaví příkazem docker stop
. Tady je příklad:
docker stop happy_wilbur
Příkaz stop odešle do kontejneru signál ukončení a procesy spuštěné v kontejneru.
Jak odebrat kontejner
Kontejner se odebere příkazem docker rm
. Tady je příklad:
docker rm happy_wilbur
Po odebrání kontejneru jsou všechna data v tomto kontejneru zničena. Pokud jde o ukládání dat, je nezbytné považovat kontejnery za dočasné.
Konfigurace úložiště kontejneru Dockeru
Jak jsme popsali dříve, vždy zvažte kontejnery jako dočasné, když aplikace v kontejneru potřebuje ukládat data.
Předpokládejme, že váš sledovací portál vytvoří soubor protokolu v podsložce kořenovému adresáři aplikace; to znamená, že přímo do systému souborů kontejneru. Když aplikace zapisuje data do souboru protokolu, zapisuje systém tato data do zapisovatelné vrstvy kontejneru.
I když tento přístup funguje, má bohužel několik nevýhod.
Úložiště kontejnerů je dočasné.
Soubor protokolu se neuchová mezi instancemi kontejneru. Dejme tomu, že kontejner například zastavíte a odeberete. Když spustíte novou instanci kontejneru, nová instance se zakladne na zadané imagi a všechna předchozí data budou chybět. Pamatujte, že při odebrání kontejneru se všechna data v kontejneru zničí spolu s kontejnerem.
Úložiště kontejnerů je svázané se základním hostitelským počítačem.
Přístup k souboru protokolu z kontejneru nebo jeho přesunutí je složitý, protože kontejner je propojený s základním hostitelským počítačem. Abyste mohli získat přístup k souboru, musíte se připojit k instanci kontejneru.
Jednotky úložiště kontejnerů jsou méně výkonné.
Kontejnery implementují ovladač úložiště, který umožňuje aplikacím zapisovat data. Tento ovladač zavádí další abstrakci pro komunikaci s jádrem hostitelského operačního systému a je méně výkonný než zápis přímo do systému souborů hostitele.
K zachování dat mohou kontejnery využít dvě možnosti. První možností je využití svazků, druhou možností jsou vázaná připojení.
Co je svazek?
Svazek je uložený v systému souborů hostitele v určitém umístění složky. Zvolte složku, ve které víte, že data nebudou upravena procesy mimo Docker.
K vytvoření a správě nového svazku spouští Docker příkaz docker volume create
. Tento příkaz může být součástí definice souboru Dockerfile, což znamená, že v rámci procesu vytváření kontejneru můžete vytvářet svazky. Docker vytvoří svazek, pokud neexistuje při prvním pokusu o připojení svazku do kontejneru.
Svazky jsou uložené v adresářích v systému souborů hostitele. Docker připojí a spravuje svazky v kontejneru. Po připojení jsou tyto svazky izolované od hostitelského počítače.
Stejné svazky může současně používat několik kontejnerů. Svazky se také neodstraní automaticky, když kontejner přestane svazek používat.
V tomto příkladu můžete vytvořit adresář na hostiteli kontejneru a připojit tento svazek do kontejneru při vytváření kontejneru sledovacího portálu. Když sledovací portál začne protokolovat data, můžete se k těmto informacím dostat přes systém souborů hostitele kontejneru. K tomuto souboru protokolu budete mít přístup i po odebrání kontejneru.
Docker také poskytuje společnostem třetích stran způsob, jak vytvářet doplňky, které se mají používat jako svazky. Například Azure Storage poskytuje modul plug-in pro připojení Azure Storage jako svazků v kontejnerech Dockeru.
Co je vázané připojení?
Připojení vazby je koncepčně stejné jako svazek; Místo použití konkrétní složky však můžete připojit jakýkoli soubor nebo složku na hostiteli. Očekáváte také, že hostitel může změnit obsah těchto připojení. Stejně jako svazky se připojení vazby vytvoří, pokud ho připojíte a na hostiteli ještě neexistuje.
Vázaná připojení mají oproti svazkům omezenou funkčnost a přestože jsou výkonnější, závisejí na tom, aby měl hostitel připravenou konkrétní strukturu složek.
Svazky se považují za upřednostňovanou strategii úložiště dat pro použití s kontejnery.
Pro kontejnery Windows je k dispozici další možnost: můžete připojit cestu SMB jako svazek a prezentovat ji kontejnerům. To umožňuje kontejnerům na různých hostitelích používat stejné trvalé úložiště.
Konfigurace sítě kontejneru Dockeru
Výchozí konfigurace sítě Dockeru umožňuje izolovat kontejnery na hostiteli Dockeru. Tato funkce umožňuje vytvářet a konfigurovat aplikace, které spolu můžou bezpečně komunikovat.
Docker poskytuje různá nastavení sítě pro Linux a Windows.
Pro Linux existuje šest předkonfigurovaných možností sítě:
- Most
- Hostitelský počítač
- Překryv
- IPvLan
- MACvLan
- Nic
Pro Windows je k dispozici šest předkonfigurovaných možností sítě:
- PŘEKLAD ADRES (Překlad síťových adres)
- Průhledné
- Překryv
- L2Bridge
- L2Tunnel
- Nic
V závislosti na požadavcích na síť můžete zvolit, které z těchto konfigurací sítě se mají použít pro váš kontejner.
Co je síť typu Most?
Síť mostu je výchozí konfigurace použitá pro kontejnery při spuštění bez zadání jakékoli jiné konfigurace sítě. Tato síť je interní privátní síť, kterou kontejner používá, a izoluje síť kontejnerů od hostitelské sítě Dockeru.
Každému kontejneru v síti mostu se přiřadí IP adresa a maska podsítě s výchozím názvem hostitele s názvem kontejneru. Kontejnery připojené k výchozí síti mostu mají povolený přístup k jiným kontejnerům připojeným přes most podle IP adresy. Síť typu Most neumožňuje komunikaci mezi kontejnery pomocí názvů hostitelů.
Docker standardně nepublikuje žádné porty kontejnerů. Mapování portů mezi porty kontejneru a porty hostitele Dockeru umožňuje příznak --publish
u portu Dockeru.
Příznak publish v podstatě nakonfiguruje pravidlo brány firewall, které mapuje porty.
V tomto příkladu je sledovací portál přístupný klientům, kteří přejdou na port 80. Port 80 z kontejneru budete muset namapovat na nějaký dostupný port hostitele. Na hostiteli máte otevřený port 8080, který vám umožní nastavit příznak takto:
--publish 8080:80
Jakýkoli klient, který přejde na IP adresu hostitele Dockeru a port 8080, má přístup ke sledovacímu portálu.
Kromě konfigurací specifických pro Linux funguje síť NAT ve Windows stejně jako síť mostu. Překlad adres (NAT) je také výchozí síť ve Windows a všechny kontejnery se k ní připojí, pokud neurčíte jinak.
Co je síť typu Hostitel?
Síť typu Hostitel umožňuje spustit kontejner přímo v síti hostitele. Tato konfigurace vlastně odebere izolaci mezi hostitelem a kontejnerem na úrovni sítě.
Předpokládejme, že se v tomto příkladu rozhodnete změnit konfiguraci sítě na možnost Hostitel. Sledovací portál je pořád přístupný pomocí IP adresy hostitele. Teď můžete místo namapovaného portu použít dobře známý port 80.
Mějte na paměti, že kontejner může používat jenom porty, které hostitel ještě nepoužívá.
Ve Windows není hostitelská síť dostupná. Na hostitelích s Windows není možné sdílet stejnou IP adresu (zásobník sítí) mezi hostitelem a kontejnerem. Síť NAT funguje podobně jako síť mostu a možnost Překrytí poskytuje IP adresu kontejneru ze stejné sítě jako hostitel, ale ne stejnou IP adresu.
Překrytí a další možnosti sítě
Pro pokročilejší scénáře poskytují Linux i Windows další možnosti sítě. Možnost překrytí například vytvoří virtuální přepínač z hostitelské sítě, takže kontejnery v této síti mohou získat IP adresy ze serverů DHCP nebo pracovat s IP adresami z daného segmentu sítě. Kromě toho Docker umožňuje externím dodavatelům vytvářet síťové moduly plug-in.
Co je síť typu Žádná?
Pokud chcete zakázat sítě pro kontejnery, použijte možnost žádná síť. To může být užitečné, pokud máte aplikaci, která síť nepoužívá, nebo pokud chcete jenom ověřit, že aplikace běží v kontejneru podle očekávání.
Aspekty operačního systému
Mějte na paměti, že existují rozdíly mezi desktopovým operačním systémem pro možnosti konfigurace sítě Dockeru. Například síťové rozhraní Docker0 není při použití sítě mostu k dispozici v systému macOS a konfigurace hostitelské sítě není podporovaná pro stolní počítače s Windows i macOS.
Tyto rozdíly mohou ovlivnit způsob, jakým vývojáři postupují při vývoji pomocí kontejnerů. Kromě toho orchestrátory kontejnerů můžou také poskytovat další konfigurace sítí nad nastavením Dockeru.