GNU/Linux >> Znalost Linux >  >> Panels >> Docker

Co je Docker? Jak to funguje?

V této obsáhlé příručce jsem vysvětlil, co je Docker, jeho vývoj, základní koncepty Linuxu a jak funguje.

Docker se stal defacto standardem, pokud jde o implementace založené na kontejnerech. Docker je základem pro orchestraci založenou na kontejnerech od malých implementací až po rozsáhlé podnikové aplikace.

Docker si rychle získal takovou popularitu a přijetí v komunitě DevOps, protože byl vyvinut pro přenositelnost a navržen pro moderní architekturu mikroslužeb.

V tomto blogu se dozvíte,

  1. Co je Docker?
  2. Zjistěte více o Dockeru a zjistěte, proč je Docker přínosný a odlišný od jiných kontejnerových technologií.
  3. Architektura jádra Docker a její klíčové komponenty
  4. Vývoj kontejnerů a základní koncept linuxových kontejnerů
  5. Co je kontejner a jaké funkce systému Linux umožňují jeho fungování?
  6. Rozdíl mezi procesem, kontejnerem a virtuálním počítačem

Cílem je získat správné základy, abyste pochopili, co Docker skutečně je a jak funguje.

Co je Docker?

Docker je populární open-source projekt napsaný v go a vyvinutý společností Dotcloud (A PaaS Company).

Jedná se o kontejnerový stroj, který využívá funkce jádra Linux jako jmenné prostory a kontrolní skupiny k vytváření kontejnerů nad operačním systémem. Takže to můžete nazvat virtualizace na úrovni OS.

Docker byl původně postaven na Linuxových kontejnerech (LXC) . Později Docker nahradil LXC svým kontejnerovým runtime libcontainerem (nyní součástí runc). Na konci článku jsem vysvětlil základní koncepty LXC a kontejnerů.

Možná se ptáte, jak se Docker liší od Linuxového kontejneru (LXC), protože všechny koncepty a implementace vypadají podobně?

Kromě toho, že jde pouze o technologii kontejnerů, má Docker dobře definované komponenty wrapper, které usnadňují balení aplikací . Před Dockerem nebylo snadné provozovat kontejnery. To znamená, že udělá veškerou práci při oddělení vaší aplikace od infrastruktury tím, že všechny požadavky na aplikační systém zabalí do kontejneru.

Pokud máte například soubor Java jar, můžete jej spustit na libovolném serveru, na kterém je nainstalována Java. Stejným způsobem, jakmile zabalíte kontejner s požadovanými aplikacemi pomocí Dockeru, můžete jej spustit na jakémkoli jiném hostiteli, který má nainstalovaný Docker.

Spuštěním několika příkazů a parametrů Dockeru zprovozníme kontejnery.

Rozdíl mezi Dockerem a kontejnerem

Docker je technologie nebo nástroj vyvinutý pro efektivní správu kontejnerů.

Mohu tedy spustit kontejner bez Dockeru?

Ano! samozřejmě. Pomocí technologie LXC můžete spouštět kontejnery na serverech Linux. Nejnovější nástroje jako Podman navíc nabízejí podobné pracovní postupy jako Docker.

Věci, které byste měli vědět o Dockeru:

  1. Docker není LXC
  2. Docker není řešení pro virtuální stroje.
  3. Docker není systém pro správu konfigurace a nenahrazuje Chef, Puppet, Ansible atd.
  4. Docker není platforma jako technologie služby.
  5. Docker není kontejner.

Co dělá Docker tak skvělým?

Docker má efektivní pracovní postup pro přesun aplikace z vývojářského notebooku do testovacího prostředí do produkce. Více o tom pochopíte, když se podíváte na praktický příklad zabalení aplikace do obrázku Docker.

Víte, že spuštění kontejneru docker trvá méně než sekundu ?

Je neuvěřitelně rychlý a může běžet na jakémkoli hostiteli s kompatibilním linuxovým jádrem. (Podporuje také Windows)

Poznámka: nemůžete spustit kontejner Windows na hostiteli Linux, protože pro Windows neexistuje podpora jádra Linuxu. O kontejnerech Windows si můžete přečíst zde

Docker používá pro ukládání obrázků unijní souborový systém Copy-on-write. Proto, když jsou provedeny změny v kontejneru, budou na disk zapsány pouze změny pomocí kopírování na zapisovacím modelu.

S funkcí Kopírovat při zápisu budete mít optimalizované vrstvy sdíleného úložiště pro všechny své kontejnery.

Statistiky přijetí dockeru

Zde jsou údaje o trendech Google na Dockeru. Můžete vidět, že to bylo posledních pět let explodující téma.

Zde je výsledek průzkumu společnosti Datadog, který ukazuje nárůst přijetí Dockeru.

Základní architektura Docker

Následující části se zaměří na architekturu Docker a její přidružené součásti. Podíváme se také na to, jak jednotlivé komponenty spolupracují, aby Docker fungoval.

Architektura Dockeru se od svého vzniku několikrát změnila. Když jsem publikoval první verzi tohoto článku, byl Docker postaven na LXC

Zde jsou některé pozoruhodné architektonické změny, ke kterým došlo pro Docker

  1. Docker se v roce 2014 přesunul z LXC na libcontainer
  2. runc – rozhraní CLI pro vytváření kontejnerů, které splňují všechny specifikace OCI.
  3. containerd – Docker v roce 2016 oddělil svou komponentu pro správu kontejnerů na kontejnery

OCI:Open Container Initiative je otevřený průmyslový standard pro běh kontejnerů a specifikace.

Když byl Docker původně spuštěn, měl monolitickou architekturu. Nyní je rozdělena do následujících tří různých složek.

  1. Docker Engine (dockerd)
  2. docker-containerd (containerd)
  3. docker-runc (runc)

Docker a další velké organizace přispěly ke standardnímu běhu kontejneru a vrstvám správy. Proto containerd a runc jsou nyní součástí Cloud Native Foundation s přispěvateli ze všech organizací.

Poznámka: Při instalaci Dockeru se nainstalují všechny tyto součásti. Nemusíte jej instalovat samostatně. Pro vysvětlení jej zobrazujeme jako různé komponenty.

Nyní se podívejme na jednotlivé komponenty Docker.

Docker Engine

Docker engine obsahuje démona dockeru, rozhraní API a rozhraní příkazového řádku Dockeru. Démon Docker (dockerd) běží nepřetržitě jako dockerd systemd služba. Je zodpovědný za vytváření obrazů dockeru.

Chcete-li spravovat obrázky a spouštět kontejnery, dockerd volá docker-containerd API.

docker-containerd (containerd)

containerd je další služba systémového démona, která je zodpovědná za stahování obrazů dockeru a jejich spouštění jako kontejner. Vystavuje své API, aby přijímalo pokyny z dockerd služba

docker-runc

runc je běhový modul kontejneru zodpovědný za vytváření jmenných prostorů a skupin cgroups požadovaných pro kontejner. Poté spustí příkazy kontejneru uvnitř těchto jmenných prostorů. runc runc je implementován podle specifikace OCI.

Přečtěte si tuto vynikající 3dílnou sérii blogových příspěvků, abyste se dozvěděli více o běhu kontejnerů.

Jak Docker funguje?

Viděli jsme základní stavební kameny Dockeru.

Nyní se podívejme na pracovní postup Dockeru pomocí komponent Docker.

Komponenty dockeru

Následující oficiální architektura dockeru na vysoké úrovni diagram ukazuje běžný pracovní postup Docker.

Ekosystém Docker se skládá z následujících čtyř komponent

  1. Docker Daemon (dockerd)
  2. Klient Docker
  3. Obrázky dockeru
  4. Registry Docker
  5. Docker Containers

Co je to démon Docker?

Docker má architekturu klient-server. Docker Daemon (dockerd ) nebo server je odpovědný za všechny akce související s kontejnery.

Démon přijímá příkazy z klienta Docker prostřednictvím rozhraní CLI nebo REST API. Klient Docker může být na stejném hostiteli jako démon nebo může být přítomen na jakémkoli jiném hostiteli.

Ve výchozím nastavení démon docker naslouchá docker.sock UNIX socket. Pokud máte nějaký případ použití pro vzdálený přístup k API dockeru, musíte jej zpřístupnit přes hostitelský port. Jedním z takových případů použití je spuštění Dockeru jako agentů Jenkins.

Pokud chcete spustit Docker v Dockeru, můžete použít docker.sock z hostitelského počítače.

Co je to obrázek Dockeru?

Obrázky jsou základními stavebními kameny Dockeru. Obsahuje knihovny OS, závislosti a nástroje pro spuštění aplikace.

Obrazy lze předem sestavit se závislostmi aplikací pro vytváření kontejnerů. Chcete-li například spustit webový server Nginx jako kontejner Ubuntu, musíte vytvořit bitovou kopii Docker s binárním souborem Nginx a všemi knihovnami OS potřebnými ke spuštění Nginx.

Co je to Dockerfile?

Docker má koncept Dockerfile který se používá pro vytváření obrazu. Dockerfile textový soubor, který obsahuje jeden příkaz (instrukce) na řádek.

Zde je příklad souboru Dockerfile.

Obraz ukotvitelného panelu je uspořádán ve vrstvách. Každá instrukce v Dockerfile je přidána vrstva do obrázku. Nejvyšší zapisovatelnou vrstvou obrázku je kontejner.

Každý obrázek je vytvořen ze základního obrázku.

Například, pokud můžete použít základní bitovou kopii Ubuntu a vytvořit další bitovou kopii pomocí aplikace Nginx. Základní obraz může být nadřazený obraz nebo obraz vytvořený z nadřazeného obrazu. Podívejte se na jeho článek o dockeru, kde se o tom dozvíte více.

Můžete se zeptat, odkud pochází tento základní obrázek (nadřazený obrázek)? K vytvoření počátečního nadřazeného základního obrazu existují nástroje dockeru. Vezme požadované knihovny OS a upeče je do základního obrazu. Nemusíte to dělat, protože získáte oficiální základní obrazy pro distribuce Linuxu.

Do horní vrstvy obrázku lze zapisovat a používá ji běžící kontejner. Ostatní vrstvy v obrázku jsou pouze pro čtení.

Co je to registr Docker?

Je to úložiště (úložiště) pro obrázky Docker.

Registr může být veřejný nebo soukromý. Například společnost Docker Inc poskytuje hostovanou službu registru s názvem Docker Hub. Umožňuje vám nahrávat a stahovat obrázky z centrálního umístění.

Poznámka: Ve výchozím nastavení, když nainstalujete docker, hledá obrázky z veřejného centra Docker, pokud v nastavení Dockeru neurčíte vlastní registr.

Ostatní uživatelé centra Docker mají přístup ke všem vašim obrázkům, pokud je vaše úložiště veřejné. Můžete také vytvořit soukromý registr v Docker Hub.

Docker hub funguje jako git, kde můžete vytvářet své obrázky lokálně na vašem notebooku, odevzdávat je a poté být odeslány do centra Docker.

Tip: Když používáte docker v podnikových sítích/projektech, nastavte si vlastní registry dockerů namísto použití veřejného docker hubu. Všichni poskytovatelé cloudu mají své vlastní služby registru kontejnerů.

Co je to kontejner Docker?

Kontejnery Docker se vytvářejí z existujících obrázků. Je to zapisovatelná vrstva obrázku.

Pokud se pokusíte propojit vrstvy obrázků a kontejner, zde je návod, jak to vypadá u obrázku založeného na ubuntu.

Své aplikace můžete zabalit do kontejneru, odevzdat jej a vytvořit z něj zlatý obrázek, abyste z něj mohli sestavit další kontejnery.

Kontejnery lze spustit, zastavit, potvrdit a ukončit. Pokud kontejner ukončíte bez jeho potvrzení, všechny změny kontejneru budou ztraceny.

V ideálním případě se s kontejnery zachází jako s neměnnými objekty a nedoporučuje se provádět změny na běžícím kontejneru. Místo toho provádějte změny v běžícím kontejneru pouze pro účely testování.

Dva nebo více kontejnerů lze propojit a vytvořit tak vrstvenou aplikační architekturu. Hostování vysoce škálovatelných aplikací pomocí Dockeru se však zjednodušilo s příchodem nástrojů pro orchestraci kontejnerů, jako je kubernetes.

Vývoj kontejnerů

Pokud si myslíte, že kontejnerizace je nová technologie, není tomu tak. Google používá svou technologii kontejnerů ve své infrastruktuře již léta.

Koncept kontejnerů začal již v roce 2000. Ve skutečnosti kořeny sahají až do roku 1979, kdy jsme měli chroot, koncept změny kořenového adresáře procesu.

Zde je seznam projektů založených na kontejnerech, které začaly v roce 2000.

Rok Technologie
2000 Vězení FreeBSD představilo koncept kontejneru.
2003 Projekt serveru Linux-V vydán s konceptem virtualizace na úrovni OS
2005 Solaris Zones – představen projekt virtualizace na úrovni OS
2007 Google vydal dokument o generických procesních kontejnerech
2008 První vydání kontejnerů LXC
2011 cloudfoundry oznámil správce
2013 lcmcty – Open source od společnosti Google
2013 Projekt Docker byl oznámen společností DotCloud
2014 Raketa. (rkt) oznámil CoreOS
2016 Náhled kontejneru Windows vydaný jako součást Windows Server 2016

Co je to kontejner Linux (LXC)?

Nyní pochopíme, co je to Linuxový kontejner.

V typickém virtualizovaném prostředí běží jeden nebo více virtuálních strojů nad fyzickým serverem pomocí hypervizoru, jako je Xen, Hyper-V atd.

Na druhou stranu kontejnery běží nad jádrem operačního systému. Můžete tomu říkat virtualizace na úrovni OS. Než se pustíte do základních konceptů kontejnerů, musíte pochopit dva klíčové koncepty Linuxu.

  1. Uživatelský prostor: Veškerý kód potřebný ke spuštění uživatelských programů (aplikací, procesů) se nazývá uživatelský prostor. Když spustíte akci programu, například za účelem vytvoření souboru, proces v uživatelském prostoru zavolá systémové volání do prostoru jádra.
  2. Prostor jádra :Toto je srdce operačního systému, kde máte kód jádra, který spolupracuje s hardwarem systému, úložištěm atd.

Kontejner je proces.

Proces spustíte při spuštění aplikace, například webového serveru Nginx. Proces sám o sobě je samostatná instrukce s omezenou izolací.

Co když můžeme izolovat proces pouze pomocí souborů a konfigurace, které jsou nutné ke spuštění a provozu. To je to, co kontejner dělá.

Kontejner je proces s dostatečnou izolací komponent uživatelského prostoru, aby byl dojem samostatného operačního systému.

Proces nadřazeného kontejneru může mít podřízený proces. Dá se tedy říci, že kontejner je také skupina procesů .

Když například spustíte službu Nginx, spustí se nadřazený proces Nginx. Nadřazený proces zahrnuje podřízené procesy, jako je správce mezipaměti, zavaděč mezipaměti a pracovníci.

Když tedy spustíte kontejner Nginx, spustíte hlavní proces Nginx v jeho izolovaném prostředí.

Ukážu vám to prakticky v následujících částech.

Každý kontejner má svůj izolovaný uživatelský prostor a na jednom hostiteli můžete provozovat více kontejnerů.

Znamená to, že kontejner má celý OS ?

Ne. Na rozdíl od virtuálního počítače s jeho jádrem kontejner obsahuje požadované soubory související s konkrétní distribucí a používá sdílené hostitelské jádro.

Ještě zajímavější je, že na jednom hostiteli můžete spouštět různé kontejnery založené na distribucích Linuxu který sdílí stejný prostor jádra.

Můžete například spustit RHEL, CentOS, kontejner založený na SUSE na serveru Ubuntu. Je to možné, protože pouze uživatelský prostor se liší pro všechna linuxová distribuce a prostor jádra je stejný.

Základní koncept linuxových kontejnerů

Následující obrázek vám poskytuje vizuální reprezentaci linuxových kontinentů.

Kontejnery jsou izolované pomocí dvou funkcí linuxového jádra nazývaných jmenné prostory a kontrolní skupiny.

Analogií v reálném světě by byl bytový dům. I když se jedná o jednu velkou budovu, každý byt/byt je izolovaný pro jednotlivé domácnosti, které mají svou vlastní identitu s měřenou vodou, plynem a elektřinou. K vytvoření této izolace používáme beton, ocelové konstrukce a další stavební materiály. Nemáte výhled do jiných domů, pokud vám nedovolí dovnitř.

Podobně to můžete vztáhnout k jednomu hostiteli obsahujícímu více kontejnerů. Chcete-li izolovat kontejnery s jejich CPU, pamětí, IP adresou, přípojnými body, procesy, potřebujete dvě funkce linuxového jádra nazývané jmenné prostory a kontrolní skupiny.

Linuxové jmenné prostory

Kontejner je o tom, že má dobře izolované prostředí pro spouštění služby (procesu). K dosažení této úrovně izolace by měl mít kontejner svůj souborový systém, IP adresu, přípojné body, ID procesů atd. Toho lze dosáhnout pomocí Linux Namespaces.

Jmenné prostory jsou zodpovědné za přípojné body kontejnerů, uživatele, IP adresu, správu procesů atd. V podstatě tedy nastavují hranice pro kontejnery.

Následují klíčové jmenné prostory v Linux

  1. jmenný prostor pid :Zodpovědnost za izolaci procesu (PID:ID procesu).
  2. čistý jmenný prostor :Spravuje síťová rozhraní (NET:Networking).
  3. jmenný prostor ipc :Spravuje přístup ke zdrojům IPC (IPC:InterProcess Communication).
  4. jmenný prostor mnt :Zodpovědný za správu přípojných bodů souborového systému (MNT:Mount).
  5. jmenný prostor uts :Izoluje identifikátory jádra a verze. (UTS:Unix Timesharing System).
  6. jmenný prostor usr: Izoluje ID uživatelů. Jednoduše řečeno, izoluje ID uživatelů mezi hostitelem a kontejnerem.
  7. Jmenný prostor Cgroup: Izoluje informace o kontrolní skupině od kontejnerového procesu

Pomocí výše uvedených jmenných prostorů může mít kontejner svá síťová rozhraní, IP adresu atd. Každý kontejner bude mít svůj jmenný prostor a procesy běžící v tomto jmenném prostoru nebudou mít žádná oprávnění mimo jeho jmenný prostor.

Zajímavé je, že jmenné prostory v počítači se systémem Linux můžete vypsat pomocí lsns příkaz.

Linux Control groups

Při spouštění služby neurčujeme žádný limit paměti nebo CPU. Místo toho ponecháváme na jádru, aby určilo priority a alokovalo zdroje pro služby.

Můžete však explicitně nastavit limity paměti CPU pro své služby pomocí funkce linuxového jádra nazvané CGroups . Není to přímočarý přístup; musíte provést nějaké další konfigurace a vylepšení, aby to fungovalo.

Vzhledem k tomu, že uvnitř hostitele můžete provozovat více kontejnerů, měl by existovat mechanismus pro omezení využití zdrojů, přístupu k zařízení atd. Zde přicházejí na scénu kontrolní skupiny.

Řídicí skupiny Linuxu spravují prostředky používané kontejnerem. Můžete omezit CPU, paměť, síť a IO zdroje kontejnerové řídicí skupiny Linuxu.

Co se tedy stane, když neomezím prostředky CPU a paměti kontejneru?

Jediný kontejner může využívat všechny zdroje hostitele, takže ostatní kontejnery se zhroutí kvůli nedostupnosti zdrojů.

Nástroje jako Docker abstrahují všechny složité konfigurace backendu a umožňují vám specifikovat tyto limity zdrojů pomocí jednoduchých parametrů.

Proč jsou kontejnery lepší než virtuální počítače?

Kontejnery mají oproti virtuálním počítačům některé klíčové výhody. Pojďme se na ně podívat.

Využití zdrojů a náklady

  1. Virtuální počítače můžete používat k samostatnému spouštění aplikací, což znamená jednu službu na každý virtuální počítač. Ale stále může být nedostatečně využita. A změna velikosti virtuálního počítače není pro produkční aplikaci snadný úkol.
  2. Na druhou stranu mohou kontejnery běžet s velmi minimálními nároky na CPU a paměť. Můžete také spustit více kontejnerů uvnitř virtuálního počítače pro segregaci aplikací. Navíc změna velikosti kontejneru trvá několik sekund.

Provisioning &Deployment

  1. Zřízení virtuálního počítače a nasazení aplikací na něm může trvat minuty až hodiny v závislosti na pracovním postupu. I vrácení zpět vyžaduje čas.
  2. Kontejner však můžete nasadit během několika sekund a vrátit jej zpět během několika sekund.

Správa snosů

  1. Správa posunu ve virtuálních počítačích není snadná. Musíte mít plnohodnotnou automatizaci a procesy, abyste zajistili, že všechna prostředí budou podobná. Dodržování neměnných modelů nasazení zabrání posunu v prostředí virtuálních počítačů.
  2. Jakmile bude obrázek zálohován, bude stejný ve všech prostředích kontejnerů. Takže pro jakékoli změny musíte začít provádět změny ve vývojovém prostředí a znovu upéct obrázek kontejneru.

Nejčastější dotazy k Dockeru

Jaký je rozdíl mezi kontejnery a runc?

containerd je zodpovědný za správu kontejneru a runc je zodpovědný za spouštění kontejnerů (vytváření jmenných prostorů, cgroups a spouštění příkazů uvnitř kontejneru) se vstupy z containerd

Jaký je rozdíl mezi modulem Docker a démonem Docker?

Docker engine se skládá z docker démona, odpočinkového rozhraní a docker CLI. Démon Docker je služba systemd dockerd zodpovědná za vytváření obrazů dockeru a odesílání pokynů dockeru do kontejneru runtime.


Docker
  1. Co je Makefile a jak funguje?

  2. Co je webový server a jak webový server funguje?

  3. Jak přiřadit statickou IP ke kontejneru Docker

  1. Co je kontejner a jak to souvisí s Dockerem a Kubernetes?

  2. Jak nainstalovat Vim do kontejneru Docker

  3. Co je DNS a jak funguje?

  1. Co je NGINX? Jak to funguje?

  2. Jak spustit MySQL v kontejneru Docker

  3. Jak SSH do kontejneru Docker