Docker a systém v kontejnerech

Docker a systém v kontejnerech
« kdy: 16. 06. 2020, 12:01:20 »
Zdravím,
má zde někdo zkušenosti s dockerem? Čtu, že jednotlivé kontejnery mají nějaký vlastní OS (nějaké linuxové distribuce) - to je definované imagem. Nicméně jestli to dobře chápu, tak kontejnery využívají jádro OS, na kterém ten docker běží.

1.) Můžete mi prosím vysvětlit, jestli to tak je, tak proč ty kontejnery mají vlastní OS, když využívají to jádro OS, na kterém docker běží?
2.) K čemu konkrétně je ten OS v těch kontejnerech? Čeho se tím dosahuje?
3.) Proč tedy ty image u dockeru jsou relativně malé vůči image u virutal machine, když mají vlastní taky OS?

Díky
« Poslední změna: 16. 06. 2020, 13:32:21 od Petr Krčmář »


Re:Docker
« Odpověď #1 kdy: 16. 06. 2020, 12:54:23 »
Tak trochu si odpovidas sam:

1.) Můžete mi prosím vysvětlit, jestli to tak je, tak proč ty kontejnery mají vlastní OS, když využívají to jádro OS, na kterém docker běží?
Vyuzivaji jen jadro... potrebuji dodat "to kolem"


2.) K čemu konkrétně je ten OS v těch kontejnerech? Čeho se tím dosahuje?
Abys mel v dockeru k dispozici "plnohodnotny" system... protoze host doda jen jadro, ale ty chces aby ti v tom kontejneru bezela nejaka sluzba... treba... co neco potrebuje. Treba nejaka databaze... java, python... webserver...

3.) Proč tedy ty image u dockeru jsou relativně malé vůči image u virutal machine, když mají vlastní taky OS?

To nejspis neni uplne podminkou... Co je male a co je velke?

Re:Docker
« Odpověď #2 kdy: 16. 06. 2020, 13:04:35 »
Tak trochu si odpovidas sam:

1.) Můžete mi prosím vysvětlit, jestli to tak je, tak proč ty kontejnery mají vlastní OS, když využívají to jádro OS, na kterém docker běží?
Vyuzivaji jen jadro... potrebuji dodat "to kolem"


2.) K čemu konkrétně je ten OS v těch kontejnerech? Čeho se tím dosahuje?
Abys mel v dockeru k dispozici "plnohodnotny" system... protoze host doda jen jadro, ale ty chces aby ti v tom kontejneru bezela nejaka sluzba... treba... co neco potrebuje. Treba nejaka databaze... java, python... webserver...

3.) Proč tedy ty image u dockeru jsou relativně malé vůči image u virutal machine, když mají vlastní taky OS?

To nejspis neni uplne podminkou... Co je male a co je velke?

Díky.
A jak se liší ty kontejnery od virtual machine? Je to tím, že VM používají ten svůj virutální OS pro svůj běh, zatímco kontejnery využívají OS, na kterém běží?

Re:Docker
« Odpověď #3 kdy: 16. 06. 2020, 13:31:43 »
Na tomto obrázku je to pěkně vidět:


Zdroj: https://www.weave.works/blog/a-practical-guide-to-choosing-between-docker-containers-and-vms

Kontejnerům stačí aplikace + potřebné knihovny, virtuální stroje navíc potřebují ještě operační systém (včetně jádra). Kontejnery pak s sebou nemusí tahat jádro, operační systém včetně spousty knihoven, které pro svůj běh nepotřebují. Nicméně to zase musí obstarat stroj, na kterém kontejner spouštíš.

Re:Docker a systém v kontejnerech
« Odpověď #4 kdy: 16. 06. 2020, 14:03:20 »
3.) Proč tedy ty image u dockeru jsou relativně malé vůči image u virutal machine, když mají vlastní taky OS?

Jestli se nemylim, Docker pouziva pro image Alpine Linux. Ten je opravdu malej (instalacni image pro virtualni verze ma ~40MB) a v zakladu nema prakticky nic...


Re:Docker a systém v kontejnerech
« Odpověď #5 kdy: 16. 06. 2020, 14:27:09 »
3.) Proč tedy ty image u dockeru jsou relativně malé vůči image u virutal machine, když mají vlastní taky OS?

Jestli se nemylim, Docker pouziva pro image Alpine Linux. Ten je opravdu malej (instalacni image pro virtualni verze ma ~40MB) a v zakladu nema prakticky nic...

Ne tak to neni, docker image muze byt postaven na ruznych distribuci. Ale je pravda ze velka cast docker image je i verzi vystavene na Alpine, prave kvuli velikosti, ktera byva o proti  image vystavenych nad Debian nebo Centos vetsinou i nekolikanasobne mensi.

Duvodem proc vetsinou byvaji docker image mensi nez image pro VM je to ze proste nepotrebuji spousta balastu okolo ale staci jim jen zakladni knihovny, kdezto VM casto obsahuje plnohodnotnou verzi distribuce i s jadrem a jeho modulama. Ale teoreticky je mozne pripravit VM image v podstate stejne velky jako docker image, pokud by tam bylo jen to co je potreba.

cjohn

Re:Docker a systém v kontejnerech
« Odpověď #6 kdy: 16. 06. 2020, 15:21:09 »
Ne tak to neni, docker image muze byt postaven na ruznych distribuci.

Ale nemusi byt vobec postaveny na distribucii. Binarka, ktora sa urobi staticka uz nepotrebuje ziaden "OS".
Extremny hello world pripad, ktory ma 452B (ARMv7) Docker image - https://blog.hypriot.com/post/build-smallest-possible-docker-image/

Problemom je, ze bezny Franta user je "sklamany", ked da "docker exec -ti <container> ..." a v kontajneri nic nefunguje (ls, bash, sh, ...). Takze vacsina autorov pouzije nejaku distribuciu ako zaklad Docker image-u.

Re:Docker a systém v kontejnerech
« Odpověď #7 kdy: 16. 06. 2020, 17:04:32 »
Problemom je, ze bezny Franta user je "sklamany", ked da "docker exec -ti <container> ..." a v kontajneri nic nefunguje (ls, bash, sh, ...). Takze vacsina autorov pouzije nejaku distribuciu ako zaklad Docker image-u.

Souhlasím. Např. image s binárkami Go aplikací můžou mít velikost klidně i 10 MB. Ale je tam jen ta aplikace, nic víc. Když se pak použije nějaká distribuční, jde velikost většinou do stovek MB, v horším případě i k 1 GB.

AoK

  • ***
  • 145
    • Zobrazit profil
Re:Docker a systém v kontejnerech
« Odpověď #8 kdy: 16. 06. 2020, 23:30:19 »
pro docker image bez OS nemusí být binárka staticky kompilovaná, mohu to tam dát i s těmi závislostmi

Re:Docker a systém v kontejnerech
« Odpověď #9 kdy: 17. 06. 2020, 10:49:47 »
Kontejnery nemají vlastní jádro (běží pod jádrem hostitelského systému). Kontejner v Linuxu je jenom skupina procesů, které jsou izolované od ostatních procesů v systému. Možná znáte chroot – to je kontejner na úrovni souborového systému. Nějaký adresář v systému určíte jako kořenový adresář pro nějaký proces – a ten proces pak vidí jako kořenový adresář zvolený adresář a nemůže se dostat „výš“. (Samozřejmě pokud výš nevedou třeba pevné odkazy.) Kontejnery dělají to, že takhle oddělí skupinu procesů i v dalších oblastech – síťově, procesy (procesy ve skupině nevidí procesy mimo skupinu), uživatele atd. Přibližně si to můžete představit tak, že jádro zařídí, že určitá skupina procesů vidí systém tak, jako kdyby na počítači běžely jen tyto procesy, a vše ostatní je před nimi schované. (Ve skutečnosti to není tak jednoduché a dá se určit, co které procesy uvidí.)

V kontejneru si teoreticky můžete spustit jeden proces a bude to fungovat. Linuxové aplikace jsou ale většinou dělané tak, že používají sdílené knihovny a další aplikace. Takže když chcete spustit nějakou aplikaci v kontejneru, potřebujete, aby ten proces v souborovém systému, který vidí, měl i potřebné knihovny a další aplikace. Můžete mu poskytnout to, co máte ve svém systému. Ale kontejnerové technologie jako Docker nebo PodMan dělají to, že nainstalují bokem aplikaci a vše, co potřebuje. Takže ta instalace není závislá na vašem prostředí, ale vše potřebné si nese s sebou. Vy si tak nemusíte zaneřádit svůj systém věcmi, které nepotřebujete (potřebuje je jenom ta aplikace), a můžete pro tu aplikaci používat třeba knihovny v jiných verzích, než máte na svém systému.

No a když potřebujete aplikaci a všechny její závislosti, můžete si to poskládat ručně. Ale přesně tohle přece dělají linuxové distribuce. Takže se to velice často dělá tak, že vezmete nějakou hotovou distribuci, do ní si nainstalujete požadovanou aplikaci a její závislosti – a pak celý ten souborový systém vezmete a použijete ho pro kontejner. A to je to, čemu se říká, že máte „OS v kontejneru“. Tj. jádro máte pořád z vašeho počítače, ale soubory uvnitř toho kontejneru jste vytvořil pomocí nějaké distribuce – abyste se nemusel starat o závislosti.

Zmiňovaný Alpine Linux se často používá proto, že je to sama o sobě malá distribuce, takže v to kontejneru nemáte moc balastu. Když použijete nějakou velkou distribuci, ta už v základu (ještě než nainstalujete libovolný program) nainstaluje spoustu knihoven a utilit, které pak v tom kontejneru ve skutečnosti nebudou potřeba, jenom tam zabírají místo.

Ale dělají se i kontejnery „z čisté vody“, kdy si tam prostě ručně dáte ty soubory, které potřebujete. Pokud máte staticky slinkovanou binárku, která nemá žádné závislosti, stačí vám ta jediná binárka – pak je zbytečné k ní tahat nějakou distribuci. A nebo ta aplikace závisí na omezeném množství knihoven, tak si ten obraz vytvoříte ručně.

Re:Docker a systém v kontejnerech
« Odpověď #10 kdy: 17. 06. 2020, 14:47:36 »
...

Super vysvětlení, díky. S Dockerem se nepotkávám a jen okolo mě létal pár let jako buzzword, a teď mám najednou během pěti minut ucelenou představu o základních principech fungování, a o tom k čemu by se mi to mohlo eventuelně hodit. Díky.

ZAJDAN

  • *****
  • 1 975
    • Zobrazit profil
    • E-mail
Re:Docker a systém v kontejnerech
« Odpověď #11 kdy: 18. 06. 2020, 08:39:01 »
Někomu by mohl pomoci pohled, že klasická virtualizace emuluje HW, kdežto Docker emuluje OS.
Virtualizace propučuje materiál ke stavbě paneláku.
Docker propučuje pro byty v paneláku služby (vodu, vyvážení popelnic, poštu, atd)
:-)

V kontejneru/bytu lze mít "podložní OS" a na něm natáhlé knihovny, nástroje, ale lze mít jen kontejner bez podložního OS a všechny věci co potřebuje vyžadovat po hostitelském systému, pak se ale takovej byt špatně stěhuje, pač má dráty zapojené napevno do zdi paneláku.
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

Re:Docker a systém v kontejnerech
« Odpověď #12 kdy: 18. 06. 2020, 09:08:17 »
Někomu by mohl pomoci pohled, že klasická virtualizace emuluje HW, kdežto Docker emuluje OS.
Docker neemuluje OS, spíš jeden existující OS rozdělí na několik částečně oddělených.