Jak fungují image Dockeru
Vzpomeňte si, že image kontejneru se stane jednotkou, kterou používáme k distribuci aplikací. Zmínili jsme se také, že kontejner je ve standardizovaném formátu, který používá náš vývojářský i provozní tým.
Tady se podíváme na rozdíly mezi softwarem, balíčky a imagemi, které se používají v Dockeru. Znalost rozdílů mezi těmito koncepty nám pomůže lépe pochopit, jak fungují image Dockeru.
Také stručně probereme role operačního systému běžícího na hostiteli a operačního systému běžícího v kontejneru.
Software zabalený do kontejneru
Software zabalený do kontejneru není omezen na aplikace, které naši vývojáři vytvářejí. Když hovoříme o softwaru, myslíme tím kód aplikace, systémové balíčky, binární soubory, knihovny, konfigurační soubory a operační systém běžící v kontejneru.
Předpokládejme například, že vyvíjíme portál pro sledování objednávek pro různé pobočky naší společnosti, které se mají používat. Musíme se podívat na kompletní sadu softwaru, ve které se naše webová aplikace bude provozovat. Aplikace, která vytváříme, je aplikace .NET Core MVC a plánujeme nasadit aplikaci pomocí serveru nginx jako reverzního proxy serveru v Ubuntu Linuxu. Všechny tyto softwarové komponenty tvoří část image kontejneru.
Co je image kontejneru?
Image kontejneru je přenosný balíček, který obsahuje software. Když tuto image spustíme, stane se kontejnerem. Kontejner je instance v paměti image.
Image kontejneru je neměnná. Jakmile vytvoříte image, nemůžete ji změnit. Jediným způsobem, jak image změnit, je vytvořit novou image. Tato funkce zaručuje, že image, kterou používáme v produkčním prostředí, je stejná jako image, kterou používáme při vývoji a kontrole kvality.
Co je operační systém hostitele?
Operační systém hostitele je operační systém, ve kterém běží Docker Engine. Kontejnery Dockeru spuštěné v Linuxu sdílejí jádro hostitelského operačního systému a nevyžadují operační systém kontejneru, pokud binární soubor má přímý přístup k jádru operačního systému.
Kontejnery Windows ale potřebují operační systém kontejneru. Při správě služeb, mezi které patří systém souborů, správa sítí, plánování procesů a správa paměti, závisí kontejner na jádru operačního systému.
Co je operační systém kontejneru?
Operační systém kontejneru je operační systém, který je součástí zabalené image. Máme možnost zahrnout do kontejneru různé verze operačních systémů Linux nebo Windows. Tato flexibilita nám umožňuje přístup ke konkrétním funkcím operačního systému nebo instalaci dalšího softwaru, který mohou naše aplikace používat.
Operační systém kontejneru je izolovaný od hostitelského operačního systému a je to prostředí, ve kterém nasazujeme a spouštíme naši aplikaci. Tato izolace v kombinaci s neměnností image znamená, že prostředí pro vývoj aplikace je stejné jako produkční prostředí.
V našem příkladu jako operační systém kontejneru používáme Ubuntu Linux a tento operační systém se nezmění z vývoje nebo produkce. Image, kterou používáme, je vždy stejná.
Co je Unionfs
(Stackable Unification File System)?
Používáme Unionfs
k vytváření imagí Dockeru. Unionfs
je systém souborů, který umožňuje naskládat několik adresářů ( označovaných jako větve) takovým způsobem, jako by se obsah sloučil. Obsah se však fyzicky uchovává odděleně. Při sestavování systému souborů umožňuje Unionfs
přidávat a odebírat větve.
Dejme tomu, že například vytváříme image pro naši webovou aplikaci z dřívějška. Distribuci Ubuntu navrstvíme jako základní image nad spouštěcí systém souborů. V dalším kroku nainstalujeme nginx a naši webovou aplikaci. Nginx a webovou aplikaci efektivně vrstvíme nad původní image Ubuntu.
Po spuštění kontejneru z image se vytvoří konečná zapisovatelná vrstva. Tato vrstva se ale při zničení kontejneru neuchová.
Co je základní image?
Základní image je image, která používá image Dockeru scratch
. Image scratch
je prázdná image kontejneru, která nevytváří vrstvu systému souborů. Tato image předpokládá, že aplikace, kterou se chystáte provozovat, dokáže přímo používat jádro operačního systému hostitele.
Co je nadřazená image?
Nadřazená image je image kontejneru, ze které vytváříte své image.
Například místo vytvoření image z scratch
Ubuntu a následné instalace Ubuntu použijeme image, která už je založená na Ubuntu. Můžeme dokonce použít image, která už má nainstalovaný nginx. Nadřazená image většinou obsahuje operační systém kontejneru.
Jaký je hlavní rozdíl mezi základní a nadřazenou imagí?
Oba typy image umožňují vytvářet opakovaně použitelnou image. Základní image nám ale umožňují větší kontrolu nad obsahem konečného obrázku. Vzpomeňte si, že obrázek je neměnný; můžete přidat pouze k obrázku a neodčítat.
Ve Windows můžete vytvářet pouze image kontejnerů založené na imagích základního kontejneru Windows. Společnost Microsoft poskytuje a poskytuje tyto základní image kontejneru Windows.
Co je soubor Dockerfile?
Dockerfile je textový soubor obsahující instrukce, které slouží k sestavení a spuštění image Dockeru. Definuje následující aspekty image:
- Základní nebo nadřazená image, kterou použijeme k vytvoření nové image
- Příkazy pro aktualizaci základního operačního systému a instalaci dalšího softwaru
- Artefakty buildu, které se mají zahrnout, například vyvinutá aplikace
- Služby, které se zpřístupňují, jako je například konfigurace úložiště a sítě
- Příkaz, který se má spustit při spuštění kontejneru
Pojďme se na tyto aspekty podívat na příkladu souboru Dockerfile. Dejme tomu, že image Dockeru vytváříme pro web ASP.NET Core. Soubor Dockerfile může vypadat jako v následujícím příkladu:
# Step 1: Specify the parent image for the new image
FROM ubuntu:18.04
# Step 2: Update OS packages and install additional software
RUN apt -y update && apt install -y wget nginx software-properties-common apt-transport-https \
&& wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \
&& dpkg -i packages-microsoft-prod.deb \
&& add-apt-repository universe \
&& apt -y update \
&& apt install -y dotnet-sdk-3.0
# Step 3: Configure Nginx environment
CMD service nginx start
# Step 4: Configure Nginx environment
COPY ./default /etc/nginx/sites-available/default
# STEP 5: Configure work directory
WORKDIR /app
# STEP 6: Copy website code to container
COPY ./website/. .
# STEP 7: Configure network requirements
EXPOSE 80:8080
# STEP 8: Define the entry point of the process that runs in the container
ENTRYPOINT ["dotnet", "website.dll"]
Tady nebudeme popisovat specifikaci souboru Dockerfile ani podrobnosti o každém příkazu v předchozím příkladu. Všimněte si však, že v tomto souboru je několik příkazů, které nám umožňují manipulovat se strukturou obrázku. Například příkaz zkopíruje obsah z konkrétní složky na místním počítači do image kontejneru, COPY
která vytváříme.
Vzpomeňte si, že dříve jsme zmínili, že image Dockeru unionfs
využívají . Při sestavování finální image kontejneru vytváří každý z těchto kroků image kontejneru v mezipaměti. Tyto dočasné image jsou vrstvené nad předchozím obrázkem a po dokončení všech kroků se zobrazí jako jeden obrázek.
Nakonec si všimněte posledního kroku 8. ENTRYPOINT
v tomto souboru udává, který proces se spustí, jakmile spustíme kontejner z image. Pokud není spuštěn žádný VSTUPNÍ BOD nebo jiný proces, Docker to interpretuje, protože kontejner nemá nic společného a kontejner se ukončí.
Jak spravovat image Dockeru
Image Dockeru jsou velké soubory, které jsou původně uložené na vašem počítači, a potřebujeme nástroje pro správu těchto souborů.
Rozhraní příkazového řádku Dockeru a Docker Desktopu nám umožňují spravovat image sestavením, výpisem, odebráním a spuštěním imagí. Ke správě imagí Dockeru používáme klienta docker
. Klient nespustí příkazy přímo a odešle všechny dotazy démonovi dockerd
.
Nebudeme zde probírat všechny příkazy klienta a jejich příznaky, ale podíváme se na některé z nejčastěji používaných. Další informace v lekci Souhrn tohoto modulu obsahuje odkazy na dokumentaci k Dockeru, která podrobně popisuje všechny příkazy a příznaky příkazů.
Jak sestavit image
K sestavování imagí Dockeru používáme příkaz docker build
. Řekněme, že k sestavení image použijeme definici v dřívějším souboru Dockerfile. Tady je příklad, který ukazuje příkaz sestavení:
docker build -t temp-ubuntu .
Tady je výstup, který vygeneruje příkaz sestavení:
Sending build context to Docker daemon 4.69MB
Step 1/8 : FROM ubuntu:18.04
---> a2a15febcdf3
Step 2/8 : RUN apt -y update && apt install -y wget nginx software-properties-common apt-transport-https && wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb && dpkg -i packages-microsoft-prod.deb && add-apt-repository universe && apt -y update && apt install -y dotnet-sdk-3.0
---> Using cache
---> feb452bac55a
Step 3/8 : CMD service nginx start
---> Using cache
---> ce3fd40bd13c
Step 4/8 : COPY ./default /etc/nginx/sites-available/default
---> 97ff0c042b03
Step 5/8 : WORKDIR /app
---> Running in 883f8dc5dcce
Removing intermediate container 883f8dc5dcce
---> 6e36758d40b1
Step 6/8 : COPY ./website/. .
---> bfe84cc406a4
Step 7/8 : EXPOSE 80:8080
---> Running in b611a87425f2
Removing intermediate container b611a87425f2
---> 209b54a9567f
Step 8/8 : ENTRYPOINT ["dotnet", "website.dll"]
---> Running in ea2efbc6c375
Removing intermediate container ea2efbc6c375
---> f982892ea056
Successfully built f982892ea056
Successfully tagged temp-ubuntu:latest
Nemějte obavy, pokud nerozumíte předchozímu výstupu. Všimněte si ale kroků uvedených v tomto výstupu. Při provádění každého kroku se do sestavované image přidá nová vrstva.
Rovněž si všimněte, že se spouští celá řada příkazů pro instalaci softwaru a správu konfigurace. Například v kroku 2 se spouští příkazy apt -y update
a apt install -y
pro aktualizaci operačního systému. Tyto příkazy se spustí ve spuštěném kontejneru vytvořeném pro tento krok. Po spuštění příkazu se zprostředkující kontejner odebere. Podkladová image v mezipaměti je zachována v hostiteli buildu a není automaticky odstraněna. Tato optimalizace zajišťuje, že novější buildy znovu použíjí tyto image ke zrychlení času sestavení.
Co je značka image?
Značka obrázku je textový řetězec, který se používá k vytvoření verze image.
V předchozím příkladu buildu si všimněte poslední zprávy „Successfully tagged temp-ubuntu: latest“ (Úspěšně opatřeno značkou temp-ubuntu: latest). Při sestavování image se k pojmenování a případnému opatření značkou používá příznak -t
. V našem příkladu jsme image pojmenovali pomocí -t temp-ubuntu
, zatímco výsledný název image byl opatřen značkou temp-ubuntu: latest. Pokud žádnou značku nezadáte, opatří se image značkou latest
.
K jedné imagi může být přiřazených několik značek. Podle konvence se nejnovější verzi image přiřadí značka latest a značka, která popisuje číslo verze image. Když vydáte novou verzi image, můžete přiřazení značky latest změnit tak, aby odkazovala na novou image.
Pro Windows Microsoft neposkytuje základní image kontejnerů s nejnovější značkou. U imagí základního kontejneru Windows musíte zadat značku, kterou chcete použít. Například základní image kontejneru Windows pro jádro serveru je mcr.microsoft.com/windows/servercore
. Mezi jeho značky patří ltsc2016
, ltsc2019
a ltsc2022
.
Tady je další příklad. Předpokládejme, že chcete použít image Dockeru s ukázkami .NET Core. Zde máme čtyři verze platforem, ze kterých si můžeme vybrat:
mcr.microsoft.com/dotnet/core/samples:dotnetapp
mcr.microsoft.com/dotnet/core/samples:aspnetapp
mcr.microsoft.com/dotnet/core/samples:wcfservice
mcr.microsoft.com/dotnet/core/samples:wcfclient
V předchozím seznamu imagí vidíme, že Microsoft poskytuje několik ukázek .NET Core. Značky určují, na které ukázky obrázek odkazuje: ASP.NET, služba WCF atd.
Jak vypsat image
Software Docker ve vašem počítači automaticky nakonfiguruje místní registr imagí. Image v tomto registru můžete vypsat příkazem docker images
.
docker images
Výstup vypadá jako v následujícím příkladu:
REPOSITORY TAG IMAGE ID CREATED SIZE
tmp-ubuntu latest f89469694960 14 minutes ago 1.69GB
tmp-ubuntu version-1.0 f89469694960 14 minutes ago 1.69GB
ubuntu 18.04 a2a15febcdf3 5 weeks ago 64.2MB
Všimněte si, že u image je uveden její název, značka a ID image. Vzpomeňte si, že u image můžeme použít několik popisků. Předchozí výstup ukazuje příklad; i když se názvy obrázků liší, vidíme, že ID jsou stejná.
ID image představuje užitečný způsob, jak identifikovat a spravovat image v případě, že jsou název nebo značka nejednoznačné.
Jak odebrat image
Z místního registru Dockeru můžete image odebrat příkazem docker rmi
. To je užitečné, pokud potřebujete ušetřit místo na disku hostitele kontejneru, protože vrstvy imagí kontejneru se sčítají do celkového dostupného místa.
Zadejte název nebo ID image, kterou chcete odebrat. Tento příkaz odebere image ukázkové webové aplikace pomocí názvu image:
docker rmi temp-ubuntu:version-1.0
Image nemůžete odebrat, pokud kontejner image stále používá. Příkaz docker rmi
vrátí chybovou zprávu, která vypíše kontejner, který závisí na imagi.
Prozkoumali jsme základy imagí Dockeru, jak spravovat tyto image a jak spustit kontejner z image. V dalším kroku se podíváme na správu kontejnerů.