Jak fungují kontejnery Dockeru

Dokončeno

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, který budou používat různé pobočky vaší společnosti. 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ů. Také se dozvíte, jak uvažovat o konfiguraci datového úložiště a síťových možností kontejnerů.

Jak spravovat kontejnery Dockeru

Kontejner Dockeru má životní cyklus, který můžete použít ke správě a sledování stavu kontejneru.

Diagram that shows the lifecycle of a container and the transition between the lifecycle phases.

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 sám opustit ze stavu spuštění. 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 příkaz pause . Tento příkaz pozastaví všechny procesy v kontejneru.

Pokud chcete zastavit spuštěný kontejner, použijte příkaz stop . Příkaz stop umožňuje řádné vypnutí pracovního procesu odesláním signálu k ukončení. Jádro kontejneru se ukončí poté, co se tento proces vypne.

Pokud potřebujete kontejner ukončit, pomocí příkazu kill odešlete signál 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 k odebrání kontejnerů, které jsou v zastaveném stavu, použijte příkaz 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žijte run příkaz.

Proč se kontejnerům dává název?

Tato funkce umožňuje spustit více instancí kontejneru ze 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. Při prvním pokusu o připojení svazku ke kontejneru Docker tento svazek vytvoří, pokud neexistuje.

Svazky jsou uložené v adresářích v systému souborů hostitele. Docker bude svazky v kontejneru připojovat a spravovat. 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 portálu pro sledování. 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: Jako svazek můžete připojit cestu SMB 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 vytvořit a nakonfigurovat aplikace, které spolu mohou vzájemně zabezpečeně 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ý umožňuje 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.

Prověřte si své znalosti

1.

Kontejner se spustí pomocí příznaku --publish 8080:80. Která z následujících možností je nejpravděpodobnější konfigurace sítě používaná pro kontejner?

2.

Která možnost úložiště je nejlepší volbou, která hostiteli a kontejneru umožňuje sdílet soubor pro překlad názvového serveru, například soubor resolve.conf v Linuxu?