Načtení existující image Dockeru a její místní nasazení

Dokončeno

Docker je technologie, která umožňuje rychle a snadno nasazovat aplikace a služby. Aplikace Dockeru běží s využitím image Dockeru. Image Dockeru je předpřipravené prostředí obsahující kód aplikace a prostředí, ve kterém se tento kód provádí.

V dříve popsané firemní situaci chcete prozkoumat vhodnost zabalení a provozování aplikace pomocí Dockeru. Rozhodnete se sestavit a nasadit image Dockeru, ve které běží testovací webová aplikace.

V této lekci se dozvíte o klíčových konceptech a postupech, které se používají při provozování kontejnerizované aplikace uložené v imagi Dockeru.

Přehled Dockeru

Docker je nástroj pro provozování kontejnerizovaných aplikací. Kontejnerizovaná aplikace zahrnuje aplikaci a systém souborů, který vytváří prostředí, ve kterém se aplikace spouští. Kontejnerizovaná aplikace by se například mohla skládat z databáze a dalšího přidruženého softwaru a konfiguračních údajů potřebných ke spuštění aplikace.

Kontejnerizovaná aplikace má zpravidla mnohem menší nároky na prostor než virtuální počítač nakonfigurovaný pro stejnou aplikaci. Nároky jsou menší proto, že virtuální počítač musí poskytovat kompletní operační systém a přidružené podpůrné prostředí. Kontejner Dockeru tuto režii nemá, protože Docker využívá k provozu kontejneru jádro operačního systému hostitelského počítače. Stažení a spuštění image Dockeru je rychlejší a efektivnější než stahování a spouštění virtuálního počítače, který poskytuje podobné funkce.

Kontejnerizovanou aplikaci vytvoříte vytvořením image , která obsahuje sadu souborů, a oddíl informací o konfiguraci, které Docker používá. Aplikaci spustíte tak, že Docker požádáte o spuštění kontejneru založeného na této imagi. Když se kontejner spustí, Docker pomocí konfigurace image určí, jaká aplikace má uvnitř kontejneru běžet. Docker poskytuje prostředky operačního systému a potřebné zabezpečení. Zajišťuje, aby kontejnery běžely souběžně a zůstaly relativně izolované.

Důležité

Docker neposkytuje úroveň izolace dostupnou u virtuálních počítačů. Virtuální počítač implementuje izolaci na úrovni hardwaru. Kontejnery Dockeru sdílejí základní prostředky a knihovny operačního systému. Docker ale zajišťuje, že jeden kontejner nemůže získat přístup k prostředkům jiného, pokud tak nejsou kontejnery nakonfigurované.

Pokud vyvíjíte a testujete místně, můžete Docker spustit ve stolním nebo přenosném počítači. U produkčních systémů je Docker dostupný pro serverová prostředí včetně mnoha variant Linuxu a Microsoft Windows Serveru 2016. Mnozí dodavatelé také podporují Docker v cloudu. Image Dockeru můžete například uložit do služby Azure Container Registry a kontejnery spouštět pomocí služby Azure Container Instances.

V tomto modulu použijete Docker místně k sestavení a spuštění image. Pak image nahrajete do služby Azure Container Registry a spustíte ji v instanci kontejneru Azure. Tato verze Dockeru je vhodná pro místní vývoj a testování imagí Dockeru.

Image Dockeru s Linuxem a Windows

Docker byl původně vyvinut pro Linux a od té doby se rozšířil na podporu Windows. Jednotlivé image Dockeru jsou založené na Windows nebo Linuxu, ale nikoli na obou systémech současně. Operační systém image určuje, jaký druh prostředí operačního systému se používá v kontejneru.

Autoři imagí Dockeru, kteří chtějí nabídnout podobnou funkčnost jak v imagi založené na Linuxu, tak v imagi založené na Windows, mohou tyto image vytvořit samostatně. Microsoft například nabízí image Dockeru pro Windows a Linux obsahující prostředí ASP.NET Core, které můžete použít jako základ pro kontejnerizované aplikace ASP.NET Core.

Linuxové počítače s nainstalovaným Dockerem dokážou spustit jen linuxové kontejnery. Počítače s Windows s nainstalovaným Dockerem dokážou spustit oba druhy kontejnerů. Systém Windows běží na virtuálním počítači ke spuštění systému Linux a ke spouštění kontejnerů Linuxu používá virtuální systém Linux.

V tomto modulu sestavíte a spustíte image založenou na Linuxu.

Registry Dockeru a Docker Hub

Image Dockeru se ukládají a zpřístupňují prostřednictvím registrů. Registr je webová služba, ke které se Docker může připojit za účelem nahrání a stažení imagí kontejnerů. Nejznámějším registrem je Docker Hub, který je veřejný. Do Docker Hubu publikuje image spousta jednotlivců a organizací; tyto image si můžete stáhnout a spustit pomocí Dockeru provozovaného na počítači, na serveru nebo v cloudu. Účet na Docker Hubu si můžete vytvořit zdarma a nahrávat tam své image.

Registr je uspořádaný jako řada úložišť. Každé úložiště obsahuje několik imagí Dockeru, které sdílejí společný název a obecně stejný účel a funkčnosti. Tyto image mají obvykle různé verze identifikované značkou. Tento mechanismus umožňuje publikovat a uchovávat více verzí imagí z důvodů kompatibility. Při stažení a spuštění nějaké image musíte u této image určit registr, úložiště a značku verze. Značky jsou textové popisky, přičemž můžete použít svůj systém číslování verzí (v1.0, v1.1, v1.2, v2.0 atd.).

Předpokládejme, že chcete použít image Dockeru s modulem ASP.NET Core Runtime. Tato image je k dispozici ve dvou verzích:

  • mcr.microsoft.com/dotnet/core/aspnet:2.2
  • mcr.microsoft.com/dotnet/core/aspnet:2.1

Dále předpokládejme, že chcete použít image Dockeru s ukázkami .NET Core. Zde máme k dispozici čtyři verze, ze kterých si můžete vybrat:

  • mcr.microsoft.com/dotnet/samples:dotnetapp
  • mcr.microsoft.com/dotnet/samples:aspnetapp

Poznámka:

K jedné imagi může být přiřazených několik značek. Podle konvence je nejnovější verzi image přiřazena nejnovější značka kromě značky, která popisuje její číslo verze. Když vydáte novou verzi image, můžete přiřazení značky latest změnit tak, aby odkazovala na novou image.

Úložiště zároveň určuje úroveň soukromí image. Pokud image nechcete sdílet, můžete úložiště nastavit jako privátní. Můžete udělit přístup jiným uživatelům, se kterými chcete image sdílet.

Procházení Docker Hubu a stažení image

Poznámka:

V následujících částech nemusíte provádět žádné příklady ani spouštět žádný kód. Uděláte to v další lekci.

Často najdete image v Docker Hubu, která úzce odpovídá typu aplikace, kterou chcete kontejnerizovat. Tuto image si můžete stáhnout a rozšířit pomocí vlastního kódu aplikace.

Docker Hub obsahuje tisíce imagí. Registr můžete prohledávat a procházet pomocí Dockeru z příkazového řádku nebo na webu Docker Hub. Web umožňuje vyhledávat, filtrovat a vybírat image podle typu a vydavatele. Následující obrázek znázorňuje příklad vyhledávací stránky.

Snímek obrazovky s vyhledávací stránkou v Docker Hubu, která uvádí různé image kontejnerů

Image můžete načíst pomocí příkazu docker pull s názvem image. Pokud zadáte jenom název úložiště, stáhne Docker ve výchozím nastavení image, která má v daném úložišti v Docker Hubu značku latest. Mějte na paměti, že příkaz můžete upravit tak, aby stahoval jiné značky a z jiných úložišť. Tento příklad načte image se značkou aspnetapp z úložiště mcr.microsoft.com/dotnet/core/samples:aspnetapp. Tato image obsahuje jednoduchou webovou aplikaci ASP.NET Core.

Poznámka:

Příklady v této lekci ukazují syntaxi různých příkazů Dockeru. Při procházení této lekce nemusíte tyto příkazy spouštět. Ve cvičeních, která následují za touto lekcí, budete s Dockerem pracovat přímo.

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp

Když image načtete, uloží ji Docker místně a zpřístupní pro spuštěné kontejnery. Příkazem docker image list můžete zobrazit image ve svém místním registru.

docker image list

Výstup vypadá jako v následujícím příkladu:

REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/samples   aspnetapp           6e2737d83726        6 days ago          263MB

ID názvu image se používá k odkazování na image v mnoha jiných příkazech Dockeru.

Spuštění kontejneru Dockeru

Ke spuštění kontejneru se používá příkaz docker run. Pomocí názvu nebo ID určete image, která se má spustit. Pokud jste image ještě nestáhli příkazem docker pull, udělá to Docker za vás.

docker run mcr.microsoft.com/dotnet/samples:aspnetapp

V tomto příkladu příkaz odpoví následující zprávou:

warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
 No XML encryptor configured. Key {d8e1e1ea-126a-4383-add9-d9ab0b56520d} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.

Tato image obsahuje webovou aplikaci, která teď naslouchá žádostem přicházejícím na portu HTTP 80. Pokud ale otevřete webový prohlížeč a přejdete na adresu http://localhost:80, tuto aplikaci neuvidíte.

Ve výchozím nastavení Docker nepovoluje, aby se příchozí síťové požadavky dostaly do kontejneru. Je třeba, abyste přidáním parametru -p do příkazu docker run dali Dockeru pokyn, aby přiřadil konkrétní číslo portu vašeho počítače ke konkrétnímu číslu portu v kontejneru. Tento pokyn umožní síťové požadavky na kontejner na zadaném portu.

Webová aplikace v této imagi navíc nepředpokládá interaktivní používání z příkazového řádku. Když ji spustíme, chceme, aby ji Docker spustil na pozadí a pouze nechal běžet. Pomocí příznaku -d můžete dát Dockeru pokyn, aby webovou aplikaci spustil na pozadí.

Stisknutím kombinace kláves Ctrl+C zastavíte obrázek a pak ho restartujte, jak je znázorněno v následujícím příkladu:

docker run -p 8080:80 -d mcr.microsoft.com/dotnet/samples:aspnetapp

Tento příkaz namapuje port 80 v kontejneru na port 8080 ve vašem počítači. Když v prohlížeči navštívíte stránku http://localhost:8080, tato webová aplikace se zobrazí.

Snímek obrazovky s ukázkovou webovou aplikaci běžící v prohlížeči

Kontejnery a soubory

Pokud spuštěný kontejner provede změny souborů ve své imagi, existují tyto změny jen v kontejneru, ve kterém se změny provádějí. Pokud nezaberete konkrétní kroky pro zachování stavu kontejneru, při odebrání kontejneru se tyto změny ztratí. Podobně několik kontejnerů založených na stejné imagi, která běží současně, nesdílí soubory v imagi. Každý kontejner má vlastní nezávislou kopii. Všechna data zapsaná jedním kontejnerem do systému souborů se ostatním nezobrazují.

Do kontejneru je možné přidat zapisovatelné svazky. Svazek představuje systému souborů, který může být připojen kontejnerem a zpřístupněn aplikaci běžící v tomto kontejneru. Data na svazku zůstanou, když se kontejner zastaví, přičemž jeden svazek může být sdílen několika kontejnery. Podrobnosti o vytváření a používání svazků jsou nad rámec tohoto modulu.

Osvědčeným postupem je vyhnout se nutnosti provádět změny systému souborů imagí pro aplikace nasazené pomocí Dockeru. Používejte ho jenom pro dočasné soubory, které se můžou ztratit.

Správa kontejnerů Dockeru

Aktivní kontejnery zobrazíte příkazem docker ps.

docker ps

Výstup zahrnuje stav kontejneru – up, pokud je spuštěný, ukončený, pokud je ukončený – mimo jiné hodnoty, jako jsou příznaky příkazového řádku zadané při spuštění image, a další informace. Docker umožňuje spustit více kontejnerů ze stejné image současně, takže každému kontejneru je přiřazeno jedinečné ID a jedinečný název čitelný člověkem. Ve většině příkazů Dockeru sloužících ke správě jednotlivých kontejnerů lze pomocí ID nebo názvu odkázat na konkrétní kontejner.

V následujícím výstupu vidíte dva kontejnery. Pole PORTS ukazuje, že kontejner s ID elegant_ramanujan je image běžící s portem 80 na hostiteli Dockeru, který je namapovaný na port 8080 ve vašem počítači. Instance youthful_heisenberg je kontejner pro předchozího spuštění této image. Pole COMMAND ukazuje příkaz, jehož spuštěním kontejner spustil aplikaci v dané imagi. V tomto případě je to pro oba kontejnery dotnet aspnetapp.dll. ID image pro kontejnery je také stejné, protože oba kontejnery spouští stejnou image.

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   42 seconds ago      Up 41 seconds       0.0.0.0:8080->80/tcp   elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   5 minutes ago      Up 5 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

Poznámka:

docker ps je zkratka pro docker container ls. Názvy těchto příkazů jsou založené na linuxových nástrojích ps a ls, které vypisují běžící procesy a soubory.

Aktivní kontejner můžete zastavit pomocí docker stop příkazu a zadat ID kontejneru.

docker stop elegant_ramanujan

Když příkaz docker ps spustíte znovu, uvidíte, že kontejner elegant_ramanujan se ve výstupu už nenachází. Kontejner stále existuje, ale už není hostitelem spuštěného procesu. Do výstupu příkazu docker ps můžete zastavené kontejnery zahrnout přidáním příznaku -a:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   2 minutes ago       Exited (0) 21 seconds ago                       elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   7 minutes ago      Up 7 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

Zastavený kontejner znovu spustíte příkazem docker start. Hlavní proces kontejneru se spustí znovu.

docker start elegant_ramanujan

Jakmile je kontejner zastaven, měl by být zpravidla také odebrán. Odebráním kontejneru se vyčistí všechny prostředky, které po něm zbyly. Jakmile kontejner odeberete, jsou všechny změny provedené v systému souborů image trvale ztraceny.

docker rm elegant_ramanujan

Kontejner, který je spuštěný, nemůžete odebrat, ale můžete vynutit zastavení a odebrání kontejneru pomocí příznaku -f příkazu docker rm . Jedná se o rychlý způsob zastavení a odebrání kontejneru, ale měl by se použít jenom v případě, že aplikace uvnitř kontejneru nemusí provádět řádné vypnutí.

docker container rm -f elegant_ramanujan

Odebrání imagí Dockeru

Z místního počítače můžete image odebrat příkazem docker image rm. Zadejte ID image, kterou chcete odebrat. Následující příklad odebere obrázek ukázkové webové aplikace.

docker image rm mcr.microsoft.com/dotnet/core/samples:aspnetapp

Kontejnery, ve kterých image běží, musí být před odebráním image ukončeny. Pokud image stále používá kontejner, zobrazí se chybová zpráva podobná té, která následuje. V tomto příkladu k chybě dochází, protože kontejner youthful_heisenberg stále používá image.

Error response from daemon: conflict: unable to delete 575d85b4a69b (cannot be forced) - image is being used by running container c13165988cfe